Cloudflare Dynamic Workers: 샌드박스 속도를 100배 더 빠르게

BBetter Stack
Internet TechnologySmall Business/StartupsComputing/Software

Transcript

00:00:00(경쾌한 음악)
00:00:01최근 클라우드플레어(Cloudflare)에서 '다이내믹 워커(Dynamic Workers)'를 발표했습니다.
00:00:04이는 더 낮은 수준의 워커 프리미티브로,
00:00:06기존 워커가 프로그램 방식으로 생성할 수 있는 기능을 갖췄죠.
00:00:09기존 컨테이너보다 100배 더 빠르고 메모리 효율적인데,
00:00:12그 이유는 V8 아이솔레이트(Isolates)에서 실행되기 때문입니다.
00:00:16그리고 비용이 매우 저렴하기 때문에,
00:00:18원하는 만큼 생성해서 사용할 수 있습니다.
00:00:20AI가 생성한 코드 실행, 개발 미리보기,
00:00:23커스텀 자동화 등 활용 범위가 무궁무진하죠.
00:00:25심지어 초당 100만 개의 다이내믹 워커를
00:00:29실행할 수도 있다고 말합니다.
00:00:31하지만 자바스크립트만 실행 가능하다는 점이
00:00:33사용에 제약이 되지는 않을까요?
00:00:36구독 버튼을 누르고 함께 알아보시죠.
00:00:37(경쾌한 음악)
00:00:40작년에 클라우드플레어 샌드박스에 관한 영상을 만들었는데요,
00:00:44이는 기본적으로 Durable Object에서 실행되는
00:00:47수명이 짧은 리눅스 컨테이너입니다.
00:00:49이해가 잘 안 가신다면,
00:00:50이전 영상을 먼저 확인해 보세요.
00:00:52샌드박스는 파일 시스템이 있는 전체 OS 컨테이너가 필요하거나
00:00:55거의 모든 언어와 바이너리를 실행해야 할 때
00:00:59완벽한 선택입니다.
00:01:01하지만 조금 더 빠른 속도를 원한다면,
00:01:03아니, 훨씬 더 빠르고 가벼우면서도
00:01:06무제한 병렬 샌드박스를 실행하고 싶다면,
00:01:09그리고 일반 워커와 동일한 제한 사항을 원한다면,
00:01:12다이내믹 워커를 고려해 보시는 게 좋습니다.
00:01:15그럼 어떻게 설정하는지 살펴보겠습니다.
00:01:16여기 Wrangler로 방금 만든 기본 워커가 있습니다.
00:01:19타입스크립트 오류가 좀 보이는데,
00:01:21아마 제가 'Wrangler types' 실행을 깜빡한 것 같네요.
00:01:23Wrangler 설정 파일을 보시면,
00:01:26이 'worker_loaders' 배열을 추가했고
00:01:28바인딩 이름은 'loader'로 설정했습니다.
00:01:30이 이름은 원하시는 대로 정할 수 있지만,
00:01:32관례를 따라 'loader'라고 지었습니다.
00:01:34이 바인딩을 통해 우리는
00:01:37다른 워커들을 생성하고 제어할 수 있게 됩니다.
00:01:38업데이트된 코드를 보면, 새로운 'worker' 상수가 있고,
00:01:42이 값들과 함께 'loader' 바인딩을 사용합니다.
00:01:45이 부분을 중첩된 워커를 위한
00:01:49Wrangler 설정 파일이라고 생각하시면 됩니다.
00:01:50여기서 'compatibility_date'는 워커가
00:01:53어떤 런타임 버전을 사용해야 하는지 알려줍니다.
00:01:55그리고 실행될 코드가 여기 있습니다.
00:01:57보시다시피 코드는 일반적인 워커와
00:01:59매우 유사한 형태입니다.
00:02:00fetch 함수가 있고,
00:02:02request, env, context를 인자로 받습니다.
00:02:05이 코드의 역할은 단순히 샌드박스로부터
00:02:06"hello world"라고 응답하는 것뿐입니다.
00:02:08그다음 모든 네트워크 액세스를 차단하고,
00:02:10초기 워커의 request 인자를 사용하여 fetch 함수를 실행한 뒤
00:02:13그 결과를 반환하도록 했습니다.
00:02:16워커를 로컬에서 실행하고 localhost를 curl로 호출하면,
00:02:19샌드박스로부터 온 인사말을 볼 수 있을 겁니다.
00:02:21하지만 같은 curl 요청을 다시 보내면,
00:02:24오류가 발생하게 됩니다.
00:02:24그 이유는 현재 우리가
00:02:26완전히 새로운 워커를 로드하고 있기 때문입니다.
00:02:28대신 기존 워커를 가져오는 방식을 사용할 수 있는데,
00:02:31'worker1'이라는 이름을 부여하고
00:02:33비동기 함수로 코드를 실행해 보겠습니다.
00:02:35이제 curl을 실행하면 메시지가 정상적으로 출력됩니다.
00:02:38다시 실행해도 기존 'worker1' 샌드박스로부터
00:02:41정보를 성공적으로 가져옵니다.
00:02:43방금 보여드린 것은
00:02:45물론 아주 간단한 예시일 뿐입니다.
00:02:47다이내믹 워커를 사용하면 더 멋진 것들도 가능합니다.
00:02:50커스텀 바인딩을 정의할 수도 있고,
00:02:52예를 들어 스텁(stub)을 만드는 채팅방 post 메서드처럼 말이죠.
00:02:55워커는 Cap'n Proto를 사용하여 스텁과 통신하는데,
00:02:57이전 영상에서 다룬 적이 있으니
00:02:59궁금하신 분들은 확인해 보시기 바랍니다.
00:03:00Hono 같은 NPM 의존성을 사용할 수도 있고,
00:03:03createWorker 함수를 사용해 번들링할 수도 있습니다.
00:03:05심지어 외부로 나가는 요청을 가로채서
00:03:08인증 정보를 주입하는 등의 작업도 가능하죠.
00:03:10하지만 다이내믹 워커를 사용하는 가장 큰 이유 중 하나는
00:03:13AI 에이전트가 생성한 코드를 실행하기 위해서입니다.
00:03:17그럼 직접 한번 해보겠습니다.
00:03:18여기 E2B 쿡북(Cookbook)의 코드가 있습니다.
00:03:21Anthropic SDK를 사용해 Sonnet 3.5를 실행하고,
00:03:25이 시스템 프롬프트와 커스텀 도구를 사용하여
00:03:28Jupyter 노트북에서 파이썬 코드를 실행합니다.
00:03:31작동 방식은 커스텀 도구의 사용을 감지하면,
00:03:33해당 코드를 E2B 샌드박스 내부에서
00:03:34실행하는 구조입니다.
00:03:38관련 코드는 여기서 확인할 수 있습니다.
00:03:40이제 아주 구체적인 프롬프트를 실행해 보겠습니다.
00:03:42몬테카를로 방법을 1,000번 반복하여
00:03:46원주율(pi) 값을 계산하는 요청입니다.
00:03:47파일 시스템에 접근할 수 있기 때문에,
00:03:50PNG 이미지를 생성하고 저장하여
00:03:52사용자가 다운로드하거나 원하는 용도로
00:03:54사용할 수 있게 해줍니다.
00:03:56안타깝게도 다이내믹 워커는 파일 시스템에
00:03:58직접 접근할 수는 없습니다.
00:04:00비록 이 쉘 라이브러리를 통해
00:04:02가상 파일 시스템을 만들 수는 있지만요.
00:04:04하지만 워커를 통해 실행되기 때문에,
00:04:06R2 버킷 같은 세부 사항을 제공할 수 있습니다.
00:04:08R2는 클라우드플레어 버전의 S3이며,
00:04:11여기에 이미지를 저장할 수 있습니다.
00:04:12코드를 살펴보면,
00:04:14E2B의 코드와 상당히 유사합니다.
00:04:16먼저 사용되고 있는 시스템 프롬프트를 확인할 수 있고,
00:04:19커스텀 파이썬 실행 도구도 있습니다.
00:04:22이 경우에는 Jupyter 노트북을 사용하지는 않지만,
00:04:25시각화 데이터를 SVG로 생성합니다.
00:04:28그리고 자바스크립트뿐만 아니라 파이썬도
00:04:30실행할 수 있는 워커 코드가 여기 있습니다.
00:04:33보시다시피 Sonnet 4.6을 사용하고 있네요.
00:04:35사용되는 프롬프트는 이렇습니다.
00:04:37여기서 에이전트의 코드가 샌드박스에서 실행됩니다.
00:04:41샌드박스로부터의 응답은
00:04:43다시 메인 워커로 돌아오며,
00:04:45메인 워커는 그 안에서 SVG 코드를 찾아
00:04:47R2에 저장하게 됩니다.
00:04:49해당 URL에 접속하면 시간이 좀 걸리긴 하지만,
00:04:51Claude가 제공한 관련 정보로
00:04:53페이지를 성공적으로 생성해 냅니다.
00:04:55아래로 스크롤 해보면,
00:04:56R2에서 로드된 SVG를 볼 수 있습니다.
00:05:01E2B에서 만든 것과는 아주 다르게 보이지만,
00:05:03Claude Sonnet이 정확한 정보를
00:05:04생성했을 거라고 믿습니다.
00:05:06앞서 말씀드렸듯이 다이내믹 워커를
00:05:09원하는 만큼 프로그램 방식으로 생성하는 것도 가능합니다.
00:05:13이런 코드를 사용하면 되는데요.
00:05:16API 값을 기반으로 완전히 새로운 워커를
00:05:19생성하는 for 루프 문입니다.
00:05:21또한 워커가 이미 존재하는지 확인하여
00:05:23있다면 재사용하도록 설계되었습니다.
00:05:25실행되는 코드는 기본적으로 콘솔 로그와
00:05:27워커로부터의 응답으로 구성되며,
00:05:29for 루프의 인덱스에 따라
00:05:31각 워커의 고유 ID를 포함합니다.
00:05:32코드를 실행해서,
00:05:3450개의 새로운 다이내믹 워커를 생성해 보면,
00:05:36모두 즉시 생성되는 것을 볼 수 있습니다.
00:05:40정말 빠르네요.
00:05:41이번엔 10,000개로 시도해 보죠.
00:05:43제 컴퓨터가 터지는 건 원치 않으니
00:05:44로컬에서 하지는 않겠습니다.
00:05:46대신 클라우드플레어의 인프라를 사용할 수 있도록
00:05:49부모 워커를 클라우드플레어에 배포했습니다.
00:05:50이제 10,000개의 서로 다른 워커를 생성해 보겠습니다.
00:05:53엔터를 누르면 믿을 수 없을 만큼 빠르게 생성됩니다.
00:05:56여기에 30개씩 보여주는 페이지가 있는데,
00:05:59계속 넘겨가며 다양한 워커 ID를 확인할 수 있습니다.
00:06:03더 많이 만들수록 더 많은 페이지가 나타납니다.
00:06:05특정 워커와 통신할 수도 있는데,
00:06:07예를 들어 1156번 워커를 호출하면
00:06:09"hello from worker 1156"이라고 응답합니다.
00:06:12지금까지 다이내믹 워커에 대해 빠르게 훑어보았습니다.
00:06:15이미 클라우드플레어의 '코드 모드(Code Mode)'나
00:06:18LLM 생성 앱 실행 서비스인 'Zite' 등에서 사용 중이죠.
00:06:21하지만 현재는 무료라고 해도,
00:06:24영원히 무료이지는 않을 거라는 점을 말씀드리고 싶네요.
00:06:25초당 100만 개의 다이내믹 워커를 실행할 수 있다 하더라도,
00:06:28주머니 사정이 넉넉지 않다면
00:06:30조금은 자제하시는 게 좋을 것 같습니다.
00:06:32클라우드플레어 이야기가 나온 김에,
00:06:34vZero나 Lovable 같은 앱 생성기를 만들 수 있는
00:06:38오픈 소스 'VIVE SDK'에 대해 더 알고 싶으시다면,
00:06:42다음 영상을 확인해 보세요.

Key Takeaway

Cloudflare 다이내믹 워커는 초고속 V8 아이솔레이트를 기반으로 프로그램 방식의 무제한 워커 생성을 지원하여, AI 코드 실행 및 대규모 샌드박스 환경 구축에 혁신적인 솔루션을 제공합니다.

Highlights

Cloudflare의 다이내믹 워커(Dynamic Workers)는 V8 아이솔레이트를 사용하여 기존 컨테이너보다 100배 빠른 속도와 높은 메모리 효율을 자랑합니다.

프로그램 방식으로 워커를 생성할 수 있어 초당 최대 100만 개의 워커를 실행할 수 있는 압도적인 확장성을 제공합니다.

AI 에이전트가 생성한 코드를 안전하고 격리된 환경에서 즉시 실행하는 용도로 매우 적합합니다.

자바스크립트뿐만 아니라 파이썬 실행도 지원하며, R2 버킷과 같은 외부 스토리지 서비스와 연동하여 파일 시스템의 한계를 극복할 수 있습니다.

Wrangler 설정을 통해 손쉽게 바인딩을 추가하고 중첩된 워커를 제어할 수 있는 개발 편의성을 갖추고 있습니다.

Timeline

다이내믹 워커의 핵심 기능과 장점 소개

Cloudflare가 새롭게 발표한 다이내믹 워커의 주요 특징인 빠른 속도와 비용 효율성을 강조하며 시작합니다. 기존 컨테이너 대비 100배 빠른 속도는 V8 아이솔레이트 기술 덕분이며, 이를 통해 프로그램 방식으로 워커를 자유롭게 생성할 수 있습니다. AI 생성 코드 실행이나 개발 미리보기와 같은 다양한 활용 사례를 제시하며 서비스의 무궁무진한 잠재력을 설명합니다. 특히 초당 100만 개의 워커를 실행할 수 있다는 놀라운 성능 지표를 언급하며 시청자의 흥미를 유발합니다. 자바스크립트 실행 제약에 대한 의문을 던지며 본격적인 기술 탐구로 안내합니다.

기존 샌드박스와 다이내믹 워커의 차이점

작년에 소개된 Durable Object 기반의 리눅스 컨테이너 샌드박스와 다이내믹 워커를 비교하여 설명합니다. 기존 샌드박스는 파일 시스템이나 다양한 언어 바이너리가 필요한 전체 OS 환경에 적합한 솔루션입니다. 반면, 다이내믹 워커는 훨씬 가볍고 빠른 실행 속도를 지향하며 무제한 병렬 실행이 필요한 경우에 최적화되어 있습니다. 일반 워커와 동일한 제한 사항을 공유하면서도 훨씬 유연한 확장성을 제공한다는 점이 큰 차별점입니다. 사용자는 프로젝트의 필요에 따라 무거운 OS 환경과 가벼운 다이내믹 워커 중 하나를 선택할 수 있습니다.

실제 코드 설정 및 워커 로딩 구현 방법

Wrangler 도구를 사용하여 다이내믹 워커를 설정하고 코드를 작성하는 구체적인 과정을 시연합니다. Wrangler 설정 파일에 'worker_loaders' 배열과 바인딩 이름을 추가함으로써 다른 워커를 제어할 수 있는 권한을 부여합니다. 코드 내부에서 'loader' 바인딩을 통해 워커를 생성하고, fetch 함수를 사용하여 샌드박스 내부의 응답을 받아오는 방식을 보여줍니다. 또한 새로운 워커를 매번 로드하는 방식과 기존 워커의 이름을 지정하여 재사용하는 방식의 차이를 curl 명령어로 검증합니다. 이를 통해 개발자가 실제 환경에서 어떻게 워커를 관리하고 통신하는지에 대한 실질적인 가이드를 제공합니다.

고급 기능 활용: 외부 의존성 및 통신

단순한 인사를 넘어 다이내믹 워커로 구현 가능한 고차원적인 기능들을 소개합니다. Cap'n Proto 프로토콜을 사용하여 스텁(stub)과 통신하거나, Hono와 같은 NPM 패키지 의존성을 활용하는 방법을 설명합니다. createWorker 함수를 사용한 번들링이나 외부 요청을 가로채서 인증 정보를 주입하는 등 보안 및 네트워크 제어 기능도 가능함을 언급합니다. 이는 단순한 샌드박스를 넘어 복잡한 마이크로서비스 아키텍처를 구축할 수 있음을 시사합니다. 기술적인 세부 사항은 이전 영상들을 참고하도록 권장하며 깊이 있는 학습을 유도합니다.

실전 활용 사례: AI 에이전트 코드 실행

다이내믹 워커의 가장 강력한 활용 사례인 AI 에이전트 생성 코드 실행 과정을 상세히 다룹니다. Anthropic의 Claude Sonnet 3.5 모델을 연동하여 몬테카를로 방법으로 원주율을 계산하고 시각화하는 파이썬 코드를 실행하는 과정을 보여줍니다. 다이내믹 워커 자체는 직접적인 파일 시스템 접근이 어렵지만, R2 버킷을 활용해 SVG 이미지 데이터를 저장하고 URL로 접근하는 우회 방법을 제시합니다. E2B 샌드박스와의 유사성을 언급하면서도 Cloudflare 생태계 내에서 데이터가 어떻게 흐르는지 명확히 설명합니다. 결과적으로 AI가 생성한 복잡한 논리와 시각화 결과가 성공적으로 렌더링되는 모습을 확인시켜 줍니다.

대규모 워커 생성 테스트 및 주의사항

수천 개의 워커를 동시에 생성하는 극단적인 성능 테스트를 통해 서비스의 확장성을 입증합니다. 로컬 환경의 한계를 넘어 Cloudflare 인프라에 배포된 부모 워커를 통해 순식간에 10,000개의 고유한 워커를 생성하는 놀라운 장면을 보여줍니다. 각 워커는 고유 ID를 가지고 개별적으로 호출에 응답할 수 있으며, 관리 대시보드에서 수많은 페이지로 생성된 워커들을 직접 확인합니다. 마지막으로 현재는 무료로 제공되지만 향후 유료화될 가능성과 대규모 실행 시 발생할 수 있는 비용 문제에 대해 현실적인 조언을 덧붙입니다. 관련 앱 생성 도구인 VIVE SDK에 대한 안내와 함께 영상을 마무리합니다.

Community Posts

View all posts