التنفيذ الموزّع
مخطط سير عمل واحد. عمّال على كل منصة.
الوضع الموزّع في Dagu هو الملف الثنائي الوحيد نفسه في دورين: منسّق يوزّع العمل وعمّال يستطلعونه. شغّل dagu worker على Linux أو macOS أو Windows، وصِف الجهاز بوسوم، ووجّه مخططات DAG كاملة أو خطوات مفردة عبر worker_selector. يتصل العمّال نحو الخارج عبر gRPC مؤمَّن بـ TLS متبادل، فلا وسيط رسائل ولا قاعدة بيانات مشتركة ولا منفذ وارد على العامل.
# nightly-close.yaml
schedule: "0 2 * * *"
max_active_runs: 1
steps:
# Windows box exports from the line-of-business system
- id: export_sales
action: dag.run
with: { dag: export-sales }
worker_selector:
os: windows
# Linux worker near the data transforms it
- id: transform
action: dag.run
with: { dag: transform-sales }
worker_selector:
os: linux
region: us-east-1
depends: [export_sales]
# GPU worker scores the result
- id: score
action: dag.run
with: { dag: score-models }
worker_selector:
gpu: "true"
depends: [transform]ملف ثنائي واحد هو الخادم والمنسّق وكل عامل
يعمل العمّال على Linux وmacOS وWindows، على amd64 وarm64
worker_selector يوجّه مخطط DAG كاملًا أو خطوة واحدة حسب الوسوم
يتصل العمّال نحو الخارج عبر gRPC مؤمَّن بـ mTLS، فلا مشكلة مع NAT أو الشبكات الخاصة
At a glance
Dagu الموزّع مقابل حزمة عمّال قائمة على وسيط
منسّق وعمّال من ملف ثنائي واحد؛ لا وسيط ولا مخزن نتائج.
مجدول ووسيط ومخزن نتائج وعمّال تُنشر وتُحدَّث كل على حدة.
عمّال أصليون على Linux وmacOS وWindows.
العمّال غالبًا على Linux فقط؛ وWindows عبر WSL أو الحاويات.
وسوم worker_selector تصريحية لكل DAG أو خطوة.
طوابير مسماة تُربط في إعدادات العمّال وفي كود المهام معًا.
يتصل العمّال نحو الخارج على منفذ واحد مؤمَّن بـ mTLS.
يحتاج العمّال إلى نقاط وصول للوسيط وبيانات اعتماد مشتركة.
In depth
Where each tool fits
توسّع أفقيًا دون تبنّي منصة
التنفيذ الموزّع خيار نشر، لا إعادة كتابة. ملف YAML الذي يعمل على جهاز واحد يعمل كما هو على أسطول كامل، ويظل الطابور يضبط التزامن قبل التوزيع، أما مخطط DAG الذي يجب أن يبقى على الخادم الرئيسي فيثبّت نفسه هناك عبر worker_selector: local.
- العامل أمر واحد فقط: dagu worker --worker.coordinators=<host>:50055 --worker.labels gpu=true
- تنتقل تعريفات DAG إلى العمّال عبر gRPC لحظة التوزيع، فلا يحتفظ العمّال بنسخة من المستودع
- default_execution_mode: distributed يرسل كل تشغيل إلى الأسطول؛ وبدونه لا يُوزَّع إلا مخططات DAG التي تحمل worker_selector
الوسوم توجّه العمل، والأجهزة تبقى قابلة للاستبدال
يعلن العامل عن ماهيته بوسوم مفتاح-قيمة. ويعلن مخطط DAG عن حاجته عبر worker_selector. يطابق المنسّق بين الاثنين، فتصبح زيادة السعة تشغيل عامل آخر بالوسوم نفسها، لا تعديل سير العمل.
- المحدِّد الفارغ يطابق أي عامل؛ والمحدِّد ذو الوسوم يتطلب تطابقًا تامًا لكل مفتاح
- العمّال ذوو الوسوم الإضافية يطابقون أيضًا، فيمكن لجهاز واحد خدمة عدة مجموعات في آن واحد
- worker_selector على خطوة dag.run يرسل ذلك المخطط الفرعي إلى عامل مختلف عن عامل الأصل
أسطول يمزج أنظمة التشغيل والمعماريات
العمّال هم الملف الثنائي Go نفسه، يصدر لأنظمة Linux وmacOS وWindows على amd64 وarm64. في المخطط نفسه ينفّذ عامل Windows خطوات PowerShell بجوار عامل Linux ينفّذ bash، مع مكان واحد لرؤية الحالة والسجلات والتاريخ.
- ضع الوسوم حسب اصطلاح، مثل os=windows أو arch=arm64، ووجّه بالمحدِّدات نفسها
- وضع shared-nothing يبث السجلات والحالة إلى المنسّق عبر gRPC، فلا حاجة إلى NFS أو وحدة تخزين مشتركة
- لا يفتح العمّال إلا اتصالات صادرة، فتستطيع الأجهزة خلف NAT أو على VPN أو في سحابة أخرى الانضمام إلى الأسطول
جاهز للسحابة وKubernetes
ينشر مخطط Helm الرسمي واجهة المستخدم والمجدول والمنسّق ومجموعات عمّال اختيارية على Kubernetes. ويمكن للعمّال الانضمام من خارج العنقود تمامًا: أجهزة افتراضية أو خوادم فعلية أو جهاز Windows مكتبي، مع TLS متبادل يوثّق الطرفين حين يعبر المرور أي حدود.
- helm repo add dagu https://dagucloud.github.io/dagu ثم helm install مع قيمك
- لا يحتاج المنسّق إلا إلى host:port واحد يمكن الوصول إليه؛ ويكفي Kubernetes Service أو موازن حمل داخلي
- يتحقق المنسّق من شهادات العمّال ويتحقق العمّال من المنسّق عبر mTLS
FAQ
Practical questions before adopting Dagu
هل أحتاج إلى وسيط رسائل أو قاعدة بيانات خارجية؟
لا. يوزّع المنسّق المهام عبر gRPC ويستطلعه العمّال، فيعيدون نبضات القلب والحالة والسجلات على الاتصال نفسه. في وضع shared-nothing لا يوجد تخزين مشترك إطلاقًا؛ وفي وضع shared-filesystem يكتب العمّال على وحدة التخزين نفسها التي يقرأها الخادم.
هل يمكن للعمّال الجلوس خلف NAT أو في شبكة خاصة؟
نعم. المسار الوحيد المطلوب من العامل إلى المنسّق عبر منفذ TCP واحد، ولا يفتح المنسّق أبدًا اتصالًا عائدًا نحو العامل. تنضم الأجهزة خلف NAT أو على VPN أو في سحابة أخرى بمجرد الاتصال بعنوان المنسّق.
كيف تندمج عمّال Windows؟
ثبّت الملف الثنائي نفسه، وشغّل dagu worker بوسوم مثل os=windows، وأعطِ مخططات DAG الخاصة بـ Windows محدِّد worker_selector مطابقًا. تعمل الخطوات على ذلك الجهاز في الصدفة التي تحددها، مثل shell: powershell -NoProfile، بينما يعمل باقي المخطط في أماكن أخرى.
هل يمكن تشغيل Dagu كاملًا على Kubernetes؟
نعم. يولّد مخطط Helm الرسمي عمليات نشر لواجهة المستخدم والمجدول والمنسّق ومجموعات العمّال التي تحددها، مع خدمة ClusterIP أمام المنسّق. أما العمّال خارج العنقود فيتوجهون إلى تلك الخدمة عبر ingress أو موازن الحمل الذي تكشفها به.
ماذا يحدث إذا انقطع عامل في منتصف التشغيل؟
يرسل العمّال نبضة قلب كل ثانية. وحين تنقطع نبضة عامل لأكثر من 30 ثانية، يعلّم المنسّق مهامه الجارية بالفشل، فتنطلق معالجات الفشل والإشعارات بدل أن يظل التشغيل معلقًا إلى الأبد.
Next step
Start with one workflow.
Install Dagu, move one fragile script or agent task into YAML, and decide from a real run history.