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다음 영상을 확인해 보세요.