00:00:00(موسيقى مبهجة)
00:00:01أعلنت Cloudflare مؤخراً عن الـ Dynamic Workers،
00:00:04وهي وحدة برمجية أساسية ومنخفضة المستوى
00:00:06يمكن إنشاؤها برمجياً بواسطة Worker موجود بالفعل.
00:00:09إنها أسرع بمئة مرة وأكثر كفاءة في استهلاك الذاكرة
00:00:12من الحاويات التقليدية لأنها تعمل على V8 isolates.
00:00:16ولأن تكلفتها زهيدة جداً،
00:00:18يمكنك تشغيل أي عدد تريده منها
00:00:20لتشغيل الأكواد المولدة بالذكاء الاصطناعي، ومعاينات التطوير،
00:00:23والأتمتة المخصصة، وغير ذلك الكثير.
00:00:25لقد ذكروا أنه يمكنك تشغيل مليون Dynamic Worker
00:00:29في الثانية الواحدة إذا أردت ذلك.
00:00:31ولكن، هل كونها لا تدعم سوى لغة JavaScript
00:00:33يحد من استخداماتها؟
00:00:36اشترك في القناة ولنكتشف ذلك معاً.
00:00:37(موسيقى مبهجة)
00:00:40في العام الماضي، قدمت فيديو عن Cloudflare sandboxes،
00:00:44وهي باختصار حاويات Linux قصيرة العمر
00:00:47تعمل على Durable Object.
00:00:49إذا لم تفهم ما أعنيه،
00:00:50فأنصحك بمشاهدة ذلك الفيديو.
00:00:52لكنها مثالية إذا كنت تريد حاوية بنظام تشغيل كامل
00:00:55مع نظام ملفات والقدرة على تشغيل أي لغة تقريباً
00:00:59وأي ملف تنفيذي.
00:01:01أما إذا كنت تبحث عن شيء أسرع،
00:01:03في الواقع أسرع بكثير وأخف وزناً،
00:01:06مع القدرة على تشغيل عدد غير محدود من البيئات المعزولة
00:01:09بنفس قيود الـ Worker العادي،
00:01:12فقد ترغب في استخدام Dynamic Worker.
00:01:15لنرى الآن كيفية إعداده.
00:01:16هذا Worker بسيط قمت بإنشائه باستخدام Wrangler،
00:01:19وهو مليء بأخطاء TypeScript،
00:01:21ربما لأنني نسيت تشغيل Wrangler types.
00:01:23ولكن في ملف إعدادات Wrangler الخاص بنا،
00:01:26أضفت مصفوفة "worker_loaders"
00:01:28مع رابط برمجي (binding) يسمى "loader".
00:01:30يمكنك تسميته بأي اسم تريده،
00:01:32لكنني اخترت "loader" لأنه أكثر تقليدية.
00:01:34وهذا الرابط يسمح لنا بإنشاء
00:01:37والتحكم في Workers آخرين.
00:01:38في الكود المحدث، لدينا ثابت (constant) جديد للـ Worker،
00:01:42والذي يستخدم رابط "loader" بهذه القيم.
00:01:45يمكنك تخيل هذا كملف إعدادات Wrangler
00:01:49للـ Worker المتداخل،
00:01:50حيث يحدد تاريخ التوافق (compatibility date)
00:01:53إصدار بيئة التشغيل التي يجب استخدامها.
00:01:55وهنا الكود الذي سيقوم بتشغيله.
00:01:57كما ترون، الكود مشابه جداً
00:01:59لكود الـ Worker نفسه.
00:02:00يحتوي على دالة fetch
00:02:02مع متغيرات الطلب (request) والبيئة (env) والسياق (context).
00:02:05وكل ما يفعله هنا هو الرد بعبارة
00:02:06"Hello world from the sandbox".
00:02:08لقد منعنا بعد ذلك كل وصول للشبكة،
00:02:10وقمنا بتشغيل دالة fetch بمتغيرات الطلب
00:02:13من الـ Worker الأساسي وإرجاع النتائج.
00:02:16إذا قمنا بتشغيل الـ Worker محلياً وطلبنا رابط localhost،
00:02:19سنرى عبارة "Hello from the sandbox".
00:02:21ولكن إذا كررنا الطلب مرة أخرى،
00:02:24سنحصل على خطأ.
00:02:24والسبب هو أننا حالياً
00:02:26نقوم بتحميل Worker جديد تماماً في كل مرة.
00:02:28بدلاً من ذلك، يمكننا استدعاء Worker موجود بالفعل،
00:02:31وسنطلق عليه اسم "worker1"
00:02:33ثم نقوم بتشغيل الكود كدالة غير متزامنة (async).
00:02:35هذا يعني أننا إذا كررنا الطلب، سنحصل على النتيجة.
00:02:38وعند تشغيله مجدداً، سيجلب المعلومات
00:02:41من بيئة "worker1" الموجودة مسبقاً.
00:02:43بالطبع، ما عرضته للتو
00:02:45كان مثالاً بسيطاً للغاية،
00:02:47لكن يمكنك القيام بأشياء رائعة مع الـ Dynamic Workers
00:02:50مثل تعريف روابط (bindings) مخصصة،
00:02:52مثل طريقة "chatroom post" هذه لإنشاء stub،
00:02:55والذي يتواصل معه الـ Worker باستخدام Cap'n Proto،
00:02:57والذي نعم، قد قدمنا فيديو عنه من قبل،
00:02:59لذا شاهده إذا كنت مهتماً.
00:03:00يمكنك استخدام مكتبات NPM مثل Hono
00:03:03وحزمها باستخدام دالة "create worker".
00:03:05ويمكنك حتى اعتراض الطلبات الخارجية
00:03:08للقيام بأشياء مثل حقن بيانات الاعتماد (credentials).
00:03:10لكن أحد الأسباب الكبرى لاستخدام الـ Dynamic Workers
00:03:13هو تشغيل الأكواد التي تولدها وكلاء الذكاء الاصطناعي.
00:03:17فلنجرب القيام بذلك.
00:03:18هذا كود من دليل E2B
00:03:21يستخدم مكتبة Anthropic لتشغيل موديل Sonnet 3.5
00:03:25بهذا التوجيه (system prompt) وأداة مخصصة
00:03:28لتنفيذ كود Python في Jupyter notebook.
00:03:31آلية العمل هنا هي اكتشاف
00:03:33متى يتم استخدام الأداة المخصصة
00:03:34ثم تشغيلها داخل بيئة E2B معزولة،
00:03:38ويمكننا رؤية الكود الخاص بذلك هنا.
00:03:40يتم التشغيل باستخدام هذا التوجيه المحدد
00:03:42لحساب قيمة ط (pi) باستخدام طريقة مونت كارلو
00:03:46عبر ألف تكرار.
00:03:47وبما أن لديه حق الوصول إلى نظام الملفات،
00:03:50يمكنه إنشاء صورة PNG
00:03:52وحفظها ليتم تحميلها من قبل المستخدم
00:03:54أو أياً كان ما يريده المستخدم.
00:03:56لسوء الحظ، الـ Dynamic Workers ليس لديهم وصول
00:03:58إلى نظام ملفات حقيقي،
00:04:00رغم أنهم يستطيعون إنشاء نظام افتراضي
00:04:02باستخدام هذه المكتبة.
00:04:04ولكن لأنهم يعملون من خلال Worker،
00:04:06يمكننا تزويدهم بتفاصيل مثل R2 bucket،
00:04:08وهي نسخة Cloudflare من خدمة S3
00:04:11حيث يمكن حفظ الصورة فيها.
00:04:12إذا نظرنا إلى الكود،
00:04:14وهو مشابه للكود الموجود في E2B،
00:04:16يمكننا أولاً رؤية التوجيه (system prompt) المستخدم.
00:04:19وأداة تنفيذ Python المخصصة
00:04:22والتي في هذه الحالة لا تستخدم Jupyter notebook،
00:04:25لكنها تولد رسماً بيانياً بصيغة SVG.
00:04:28وهنا لدينا كود الـ Worker
00:04:30الذي يمكنه تشغيل Python بالإضافة إلى JavaScript.
00:04:33كما نرى هنا، فإنه يستخدم Sonnet 3.5.
00:04:35وهذا هو التوجيه المستخدم.
00:04:37وهنا يتم تنفيذ كود العميل في البيئة المعزولة.
00:04:41والاستجابة من البيئة المعزولة
00:04:43تعود إلى الـ Worker الأساسي،
00:04:45الذي يبحث بداخلها عن كود SVG
00:04:47ثم يحفظه في R2.
00:04:49إذا زرنا هذا الرابط، سيستغرق الأمر بعض الوقت،
00:04:51لكنه يقوم بتوليد الصفحة
00:04:53بالمعلومات ذات الصلة من Claude.
00:04:55وإذا نزلنا للأسفل،
00:04:56يمكننا رؤية صورة SVG التي يتم تحميلها من R2.
00:05:01تبدو مختلفة تماماً عن نسخة E2B،
00:05:03لكنني أثق في أن Claude Sonnet
00:05:04قد أنتج المعلومات الصحيحة.
00:05:06وبالطبع ذكرت أنه من الممكن أيضاً
00:05:09إنشاء أي عدد تريده من الـ Dynamic Workers برمجياً،
00:05:13وهو ما يمكنك فعله باستخدام كود مثل هذا.
00:05:16هذه حلقة تكرار (for loop) تنشئ Workers جدداً
00:05:19بناءً على القيمة القادمة من الواجهة البرمجية (API).
00:05:21كما أنها تتحقق مما إذا كان الـ Worker موجوداً بالفعل
00:05:23وتعيد استخدامه في حال وجوده.
00:05:25الكود الذي يتم تشغيله هو مجرد تسجيل في الكونسول
00:05:27واستجابة من الـ Worker
00:05:29بالمعرف (ID) الخاص به
00:05:31بناءً على مؤشر حلقة التكرار.
00:05:32عند تشغيل الكود،
00:05:34يمكنني إنشاء 50 Dynamic Worker جديد تماماً
00:05:36ونرى أنه يتم إنشاؤهم جميعاً في اللحظة نفسها.
00:05:40كان ذلك سريعاً جداً.
00:05:41الآن لنجرب مع 10,000،
00:05:43لكنني لن أفعل ذلك محلياً
00:05:44لأنني لا أريد تدمير جهازي.
00:05:46لذا قمت برفع الـ Worker الأب إلى Cloudflare
00:05:49لأتمكن من استخدام بنيتهم التحتية.
00:05:50سأقوم هنا بإنشاء 10,000 Worker مختلف.
00:05:53وبمجرد الضغط على Enter، يتم إنشاؤهم بسرعة جنونية.
00:05:56يمكننا رؤية صفحة تضم 30 منهم هنا
00:05:59ويمكنني الاستمرار في التصفح لرؤية جميع المعرفات.
00:06:03وكلما تصفحت أكثر، ظهرت صفحات أكثر.
00:06:05ويمكنني التواصل مع Worker محدد
00:06:07مثل Worker رقم 1156،
00:06:09والذي يرد بعبارة "Hello from worker 1156".
00:06:12كانت هذه نظرة سريعة على الـ Dynamic Workers
00:06:15التي تستخدمها Cloudflare بالفعل في Code Mode
00:06:18وشركة Zite لتشغيل التطبيقات المولدة بالذكاء الاصطناعي.
00:06:21ولكن يجب أن أنوه أنه رغم كونها مجانية حالياً،
00:06:24فلن تظل كذلك للأبد.
00:06:25لذا حتى لو كان بإمكانك تشغيل مليون Dynamic Worker
00:06:28في الثانية، فقد ترغب في التريث
00:06:30ما لم تكن ميزانيتك ضخمة جداً.
00:06:32وبما أننا نتحدث عن Cloudflare،
00:06:34إذا كنت تريد معرفة المزيد عن VIVE SDK مفتوح المصدر
00:06:38الذي يتيح لك بناء مولدات تطبيقات مثل v0 و Lovable،
00:06:42فشاهد الفيديو القادم.