يوجد اليوم مجموعة متنوعة من حلول المصدر المفتوح لإدارة سير العمل المتين وتقليل تعقيدات تطوير الأنظمة الموزعة. تتناول هذه التقرير مقارنة عميقة بين أربعة مشاريع مفتوحة المصدر رئيسية: Temporal، Restate، Hatchet، Inngest.
نظرة عامة ومفاهيم رئيسية #
Temporal #
Temporal هو منصة تنفيذ دائم (Durable Execution) والتي توفر حلاً مفتوح المصدر لتبسيط تعقيدات بناء الأنظمة الموزعة. يحتفظ بالحالة الكاملة للتطبيق حتى مع وجود خلل في المضيف أو البرمجيات، ويتيح الانتقال السلس للتنفيذ إلى أجهزة أخرى1. يدعم Temporal تسريع التطوير من خلال إزالة الحاجة لكتابة الشفرة المخصصة من أجل مؤقتات، وفعاليات، ونقاط فحص، وإعادة المحاولة، وإنتهاء الوقت2.
يستخدم Temporal من قبل الآلاف من الشركات مثل Stripe وNetflix وDatadog وHashiCorp وAlaska Airlines وBox لكل من مهام العمل الحرجة والمهام الأساسية. ويُقال إن جميع رسائل Twilio وكل معاملات Coinbase وكل قصص Snap تستخدم Temporal1.
Restate #
Restate هو محرك تنفيذ دائم مفتوح المصدر لبناء تطبيقات غير متزامنة تحتوي على حالة. يؤدي كتابة الشفرة التي تبدو مثل خدمة RPC عادية إلى حفظ محرك Restate لتقدم التنفيذ، واستعادة الحالة السابقة بعد التعطل لمتابعة التنفيذ من حيث توقفت3.
يمتاز Restate أيضاً بإمكانية إيقاف التنفيذ تلقائياً في حالات مثل الأوقات الطويلة للانتظار أو تأخر ردود خدمات أخرى، مما يعني أنه يمكن لـ Knative تقليل مقاييس الانتظار إلى الصفر3.
Hatchet #
Hatchet هو قائمة مهام موزعة ومتحملة للأخطاء، تم تصميمه لحل مشاكل التوسع مثل التزامن (concurrency) والإنصاف (fairness) وتحديد السرعة (rate limiting)4. بدلاً من الأنظمة التقليدية، يقدم حلاً متينًا لاستعادة الفشل وحل مشكلات التوسع المختلفة5.
يوفر Hatchet زمن بدء منخفض جداً (25 مللي ثانية كمعدل) وجدولة عالية الإنتاجية، مع استراتيجيات مثل FIFO وLIFO وRound Robin وPriority Queue، لتجاوز مشكلات التوسع الشائعة بأقل إعدادات ممكنة6.
Inngest #
Inngest هو منصة مفتوحة المصدر لإدارة سير العمل المتين تعمل عبر جميع السحابات. يدعم الاحتفاظ بالحالة مع المحاولة التلقائية عند الفشل، مما يتيح كتابة وظائف خطوات تنفيذ طويلة7. يقوم بإلغاء تجريد كل ما يتعلق بالقوائم وتدفق الأحداث والحالة، مما يتيح التركيز على الشفرة.
أسس Inngest Dan Farrelly، الرئيس التنفيذي السابق لشركة Buffer، وTony Holdstock-Brown، المهندس السابق في Docker، وحصل على استثمار تمهيدي بقيمة 3 ملايين دولار في عام 2023 برئاسة GGV8.
مقارنة الميزات التقنية #
العمارة وتقنية التكدس #
يستخدم Temporal مكتبة gRPC المكتوبة بلغة Go، ويوفر تجريدًا للتطوير يحتفظ بالحالة الكاملة للتطبيق9. ويتم استخدام نمط “العمال” للتنفيذ، حيث يقوم العميل بتشغيل وظائف سير العمل، بينما يقوم العامل بتنفيذ سير العمل فعليًا9.
يوفر Restate خدماته من خلال خادم HTTP/2، ويعمل مع Knative لنشر التطبيقات غير المتزامنة3. كما يأتي Restate كملف ثنائي واحد، مما يضمن سهولة التنفيذ والتشغيل، وقد تم تطويره باستخدام Rust، مما يجعله موفرًا للموارد وذو موثوقية عالية10.
يدعم Hatchet قائمة مهام معاملية تعتمد على Postgres بالإضافة إلى تنفيذ نمط DAG (Directed Acyclic Graph). ويدعي أنه يمكنه التوسع أفقيًا عبر عدة مناطق إلى 10,000 عملية في الثانية بفضل استخدام ميزات حديثة في PostgreSQL مثل SKIP LOCKED11.
صمم Inngest وبنى نظام قوائم خاص به يدعم المستخدمين المتعددين والمعالجة الدفعة والتعطيل، وهو في طريقه للانتقال إلى FoundationDB. كتب معظم الجزء الخلفي باستخدام Go، مما يتيح استخدام التخزين المؤقت وClickhouse وتدفقات الأحداث، مع دعم توجيه المنتَج7.
لغات الدعم #
تقدم المشاريع المختلفة دعمها لعدة لغات برمجة كما يلي:
- Temporal: لا توجد معلومات واضحة في نتائج البحث، ولكن يبدو أن Go هي اللغة الرئيسية.
- Restate: يدعم Golang وJava وKotlin وTypescript وRust وPython3.
- Hatchet: يوفر SDK مفتوحة المصدر لـ Python وTypescript وGo5.
- Inngest: يدعم Typescript (47٪) وGo (48٪) وJava وPython SDK، ويتيح استدعاءات دالة عبر لغات متعددة712.
مقارنة الميزات #
Temporal:
- الحفاظ على الحالة الكاملة للتطبيق والهجرة إلى أجهزة أخرى1
- معالجة تلقائية للمؤقتات والفعاليات ونقاط الفحص وإعادة المحاولة وإنتهاء الوقت2
- إزالة الحاجة إلى قوائم وأنظمة pub/sub ومجدول1
Restate:
- يقدم موثوقية عالية للشفرة بأسلوب خدمة RPC3
- إعادة الحالة السابقة بعد التعطل ومتابعة التنفيذ من نقطة التوقف3
- توفير الموارد من خلال إيقاف التنفيذ تلقائيًا في حالات الانتظار الطويل3
- إمكانية تنفيذ الآلات الحالة ومعالجة الفعاليات وساجا والمهام غير المتزامنة13
Hatchet:
- جدولة منخفضة زمن التشغيل (25 مللي ثانية كمعدل) وعالية الإنتاجية6
- استراتيجيات مدمجة مثل FIFO وLIFO وRound Robin وPriority Queue4
- سياسات إعادة المحاولة المخصصة ومعالجة الأخطاء المدمجة4
- دعم Cron، والجدولة لمرة واحدة، وحماية من الذروة، والبث التدريجي4
Inngest:
- إدارة تدفق الواعي للمتعهدين المتعددين (التزامن والحد من السرعة والتعطيل والأولوية)14
- دعم استدعاءات الدوال عبر لغات متعددة7
- المعالجة الدفعة وتجميع الأحداث في استدعاء دالة واحدة7
- مجموعة من الأدوات المتقدمة لاستعادة وظائف مثل التشغيل مجددًا والإيقاف والإلغاء الشامل7
حالات الاستخدام والتطبيقات #
Temporal #
Temporal مناسب لحالات استخدام مثل تنسيق الخدمات ومعالجة المعاملات وإدارة البنية التحتية والعمليات غير المتزامنة وجدولة المهام1. يتم استخدامه بشكل خاص من قبل الشركات الكبرى مثل Stripe وNetflix وDatadog وHashiCorp وAlaska Airlines وBox لمهام العمل الحرجة1.
Restate #
Restate مناسب للفلوFolws، التطبيقات التي تعتمد على الأحداث، وتنفيذ أنماط الساجا، ومعالجة الأحداث المحتفظ بها بحالة3. عند استخدامه مع Knative، يمكن بناء تطبيقات غير متزامنة محتفظة بالحالة حتى في ظروف قلة التوفر. بالإضافة إلى ذلك، يمكن بناء تطبيقات متنوعة مثل الفلوFolws والساجا ومعالجة الأحداث بالاحتفاظ بالحالة3.
Hatchet #
Hatchet مناسب لحالات الاستخدام مثل الإنصاف في الذكاء الاصطناعي التوليدي (التوزيع العادل للطلبات لمنع المستخدمين المطغوطين من الضغط على النظام)، معالجة الدفعات للصور والمستندات، تنسيق سير العمل للأنظمة متعددة الوسائط، والدقة في المعالجة المعتمدة على الأحداث4.
Inngest #
Inngest مناسب لحالات الاستخدام مثل سير العمل لوكلاء الذكاء الاصطناعي، الإنصاف في الذكاء الاصطناعي التوليدي، معالجة الدفعات للمستندات، وتنسيق سير العمل للأنظمة متعددة الوسائط، بالإضافة إلى دعم حالات الاستخدام الأخرى المتعلقة بالذكاء الاصطناعي مثل وظائف سلسلتي العملية، والفهارس، وقوائم الدفع والفوترة7.
تحليل المزايا والعيوب #
Temporal #
المزايا:
- منصة موثوقة مختبرة من قبل الآلاف من الشركات1
- توفير موثوقية عالية مع الحفاظ على الحالة الكاملة للتطبيق1
- حل مفتوح المصدر 100% مقدم بموجب ترخيص MIT1
العيوب:
- وفقًا للتحليل، قد يكون من الصعب تحليل الأداء أثناء الانتقال بين Go وRust وTypeScript9
- الهيكل الداخلي معقد مما يجعل من الصعب تحليل معلومات إرسال/استلام البيانات على مستوى البروتوكول9
Restate #
المزايا:
- تقديمه كملف ثنائي واحد يجعل العملية والتشغيل بسيطة10
- كفاءة الموارد وموثوقية عالية بفضل استخدام Rust10
- إمكانية النشر كخادم HTTP غير متزامن3
العيوب:
- مشروع نسبي جديد قد يكون له نظام بيئي أصغر مقارنة بـ Temporal
- استراتيجيات النشر قد تكون معقدة (توزيع مستدام على مجموعة K8s أو استخدام الخدمة السحابية RESTate)3
Hatchet #
المزايا:
- يعتمد على Postgres، مما يقلل من خطر فقد البيانات مقارنة بالحلول المعتمدة على Redis11
- يوفر زمن بدء منخفض وتخطيط عالي الإنتاجية6
- يحتوي على ميزات الرؤية للمطورين المدمجة11
العيوب:
- يكاد يكون حاليًا يستخدم RabbitMQ كنظام pub/sub مما يتطلب اعتمادية إضافية11
- لا يزال قيد التطوير تسامح NATS لربط المحرك-المحرك وارتباط المحرك-العامل11
Inngest #
المزايا:
- واجهة مستخدم سهلة الاستخدام وت تصميم API بسيط7
- توفر خادم التطوير المحلي يجعل الاختبار وتصحيح الأخطاء سهلًا14
- توفر تدفق إدارة الوعي بالمتعددين14
العيوب:
- قد تكون ترخيص SSPL صعبة الاستخدام من قبل بعض الشركات15
- تتضمن Go (48%) وTypeScript (47%) كغتين رئيسيتين مع احتمال وجود دعم محدود للغات الأخرى12
الترخيص والمجتمع #
يوفر Temporal تحت ترخيص MIT، ويجري تطويره بشكل مفتوح مع مجتمع نشط1. لم يتم توضيح ترخيص Restate بوضوح في نتائج البحث. يتم تضمين Hatchet تحت ترخيص MIT5. يُقدم Inngest بموجب ترخيص “Server Side Public License (SSPL)"، ويشمل ترخيص Apache 2.0 تحت “نشر المصدر المفتوح المتأخر (DOSP)”7.
الاستنتاج #
جميع المشاريع الأربعة المفتوحة المصدر تقدم حلولًا لإدارة سير العمل المتين، ولكنها تحمل أساليب فريدة ونقاط قوة مختلفة.
يعد Temporal الحل الأكثر نضجًا وتبنيًا، المناسب للمهام الحرجة. يركز Restate على التطبيقات غير المتزامنة التي تحتوي على حالة، مع كفاءة في الموارد. توفر Hatchet قائمة مهام يعتمد على Postgres، مما يقلل خطر فقد البيانات ويعزز الرؤية للمطورين. يركز Inngest على تجربة المطور، مع إدارة تدفق التعدد بشكل واعي، ويعمل كمنصة سير عمل عبر جميع السحابات.
يعتمد اختيار المشروع على متطلبات محددة، والتقنيات الحالية، وخبرة الفريق. ومع ذلك، فإن هذه الحلول الأربعة جميعها تتشارك في هدف مشترك يتمثل في تجريد تعقيدات الأنظمة الموزعة وتمكين المطورين من التركيز على المنطق التجاري.
المراجع #
تستند المعلومات أعلاه إلى مصادر公開 متاحة حول Temporal116217189 وRestate31310192021 وHatchet452262311 وInngest87151214242526.
دراسة مقارنة متعمقة بين مشاريع Restate وHatchet المصدر المفتوح #
كل من Restate وHatchet هي حلول مفتوحة المصدر لمعالجة الأحمال المتينة في أنظمة موزعة، ولكن كل منهما يعتمدان نهجاً وتركيزاً مختلفين. يتناول هذا التقرير مقارنة المفاهيم الأساسية لكل مشروع، والهندسة المعمارية، والميزات، وحالات الاستخدام، لتحليل المزايا والعيوب لكل منهما.
المفاهيم الأساسية والهدف #
نهج Restate #
يعتبر Restate محرك تنفيذ دائم (Durable Execution) يركز على بناء تطبيقات resilient ذات حالة. بمجرد أن تكتب شفرة تبدو كخدمة RPC عادية، يقوم Restate بحفظ تقدم التنفيذ، ويقوم باستعادة الحالة السابقة حتى بعد حدوث الفشل ليواصل التنفيذ من النقطة التي توقف عندها27.
يمتلك Restate فلسفة “تقديم المتانة دون الحاجة لتغيير الطريقة التي يتم بها كتابة الشفرة”، مما يسمح للمطورين بكتابة الشفرة كما لو كانوا يقومون بكتابة وظائف وخدمات عادية27. وهذا يقلل بشكل كبير من عبء تطوير الأنظمة الموزعة المعقدة.
نهج Hatchet #
على النقيض، Hatchet هو قائمة مهام موزعة ومتحملة للأخطاء، يركز على استبدال القوائم القديمة وأنظمة pub/sub الصعبة الإدارة، مما يسمح بتصميم أحمال عمل تتحمل الفشل. تم تصميمه خصيصًا لحل مشاكل التوسع مثل التزامن (concurrency) والإنصاف (fairness) وتحديد السرعة (rate limiting)28.
يهدف Hatchet إلى توزيع الأحمال بين عدة عمال مع أقل إعدادات ممكنة وتحقيق استعادة مستقرة عند الفشل. كما يركز بدرجة كبيرة على الرؤية والمراقبة للمطورين29.
الميزات الفنية والهندسة المعمارية #
الميزات الفنية لـ Restate #
يمتلك Restate الميزات الفنية الرئيسية التالية:
يكشف الخدمة عبر خادم HTTP/2، ويأتي كملف ثنائي واحد مما يسهل التنفيذ والإدارة27. تم تطويره بلغة Rust، مما يجعله موفرًا للموارد وموثوقًا. يعمل Restate في مجالات مختلفة مثل FaaS، وKubernetes، والخوادم، والحاويات27.
علاوةً على ذلك، يمكن لـ Restate إيقاف التنفيذ تلقائيًا في حالة حدوث فترات انتظار طويلة، مما يوفر استخدامًا فعالًا لموارد الحوسبة، مما يسهل الاستفادة من الموارد خلال فترات “الانتظار”27.
الميزات الفنية لـ Hatchet #
يمتلك Hatchet الميزات الفنية الرئيسية التالية:
يدعم نظام الطابور المعاملة القائم على Postgres وتنفيذ الأسلوب DAG (Directed Acyclic Graph)28. ويُدعى أنه يمكنه التوسع أفقيًا عبر عدة مناطق لأكثر من 10,000 عملية في الثانية باستخدام ميزات جديدة في PostgreSQL مثل SKIP LOCKED28.
يوفر Hatchet زمن بدء منخفض (25 مللي ثانية كمعدل) وجدولة عالية الإنتاجية، مع وجود استراتيجيات مدمجة مثل FIFO (First In First Out) وLIFO (Last In First Out) وRound Robin وPriority Queue، مما يتيح حل مشكلات التوسع بأقل إعدادات ممكنة29.
مقارنة الميزات الرئيسية #
الميزات الرئيسية لـ Restate #
يوفر Restate الميزات الرئيسية التالية:
شفرة سير العمل: يضمن تنفيذ دائم عبر الشفرة حتى في حالة التعطيل، مما يحافظ على استمرارية الشفرة27.
استدعاءات API والويب: يربط بشكل موثوق بين الشفرة المتزامنة والأحداث الغير متزامنة مثل الويب هوك27.
المهام غير المتزامنة: يتم تنفيذ جميع الوظائف المستدعاة عبر Restate بشكل غير متزامن ومتيم27.
معالجة الأحداث المحتفظة: يعالج الأحداث القادمة من مصادر مثل Kafka بينما يوفر إعادة المحاولة الدقيقة ومفاهيم سير العمل27.
الإشارات الدائمة: يمكّنك من إنشاء سير العمل ومعالجات الفعاليات القادرة على التعامل مع الإشارات والأحداث الخارجية والمدخلات من المستخدمين بشكل موثوق27.
التماثل: يضيف التماثل لجميع معالجات RPC أو الأحداث27.
الساجا: ينفذ استرجاع المهام السابقة عند الحاجة لوقفها والعودة للخلف في حالات تنفيذ المعاملات الطويلة27.
آلة الحالة: ينشئ آلة حالة واضحة وقابلة للتطوير دون الحاجة إلى قاعدة بيانات أو معاملات27.
الميزات الرئيسية لـ Hatchet #
يوفر Hatchet الميزات الرئيسية التالية:
الرؤية: يمكن الوصول لكافة عمليات التنفيذ اتصالياً، ويتاح تتبع السجلات ومعدل التأخير ومعدلات الأخطاء أو مقاييس مخصصة29.
تنفيذ دائم عملي: يمكن إعادة تشغيل الأحداث لأغراض التصفية أو متابعة التنفيذ يدويًا في مراحل محددة من سير العمل29.
مخطط زمني: يحدد جدولة متكررة لتنفيذ الوظائف29.
جدولة لمرة واحدة: يمكن جدولة الوظائف لتنفيذها في وقت وتاريخ محددين29.
حماية من الذروة: يمكنه معالجة ذروة المرور بشكل سلس عن طريق تنفيذ عدد محدد من الوظائف في الوقت المحدد29.
بث تدريجي: تتبع التحديثات بينما تستمر الوظائف في التنفيذ من العامل الخلفي29.
سياسات إعادة المحاولة المخصصة ومعالجة الأخطاء المدمجة: تمكن الاتصال السريع من الفشل المؤقت28.
حالات الاستخدام والتطبيقات #
حالات استخدام Restate #
تشمل حالات الاستخدام التي يناسبها Restate:
سير العمل والعمليات الطويلة: بفضل التنفيذ المتين، يمكن إدارة سير العمل المعقد والعمليات الطويلة بأمان27.
التطبيقات التي تعتمد على الأحداث: يعالج أحداث من مصادر مثل Kafka مع الحفاظ على الحالة.^2_2].
تنفيذ أنماط الساجا: يمكن تنفيذ معاملات طويلة و استرجاعها في الحالات العرضية حيث ينبغي العودة للخلف27.
آلة الحالة: يتيح صنع آلة حالة قابلة للتطوير ودائمة بدون داعٍ لقواعد بيانات أو معاملات27.
حالات استخدام Hatchet #
تشمل حالات الاستخدام التي يناسبها Hatchet:
الإنصاف في الذكاء الاصطناعي التوليدي: يوزع الطلبات بشكل عادل لمنع ضغط نظام على المستخدمين النشيطين28.
معالجة الدفعات للصور والمستندات: إجراء معالجة كبيرة في الدفعة والقدرة على الاستمرار من حيث توقفت في حالة الفشل28.
تنسيق سير العمل للأنظمة متعددة الوسائط: يدعم الإدخال المتعدد والإخراج المتعدد، مع دعم تنفيذ أسلوب DAG28.
الدقة في المعالجة المعتمدة على الأحداث: يستجيب للفعاليات الخارجية وآليات الأحداث الداخلية بشكل تلقائي28.
القابلية للتوسع والأداء #
قابلية التوسع والأداء لـ Restate #
يقدم Restate كنظام ملف ثنائي واحد تبسيط التنفيذ والإدارة، تم تطويره باستخدام Rust مما يجعله موفرًا للموارد موثوقًا27. بالإضافة إلى ذلك، توفر النسخة 1.2 من Restate ميزات توافر عالية وتوزيع زائد، مما يقوي من قابلية التوسع27.
يمكن لـ Restate إيقاف التنفيذ تلقائيًا عند انتظار طويل، مما يقضي على تبديد الموارد، مما يسمح بالعمل بشكل مرن في بيئات مثل FaaS وKubernetes والخوادم وغيرها27.
قابلية التوسع والأداء لـ Hatchet #
يوفر Hatchet زمنًا منخفضًا في بداءة التشغيل (25 مللي ثانية كمعدل) وخطوات جدولة مرتفعة لتوفير تقييمات فورية والتحقق من النظام لمهام حرجة.29.
يستخدم نظام إدخال معالجة يعتمد على Postgres، ويزعم أنه يمكنه التوسع رأسياً لأكثر من 10,000 عملية في الثانية باستخدام الميزات الحديثة في PostgreSQL مثل SKIP LOCKED، مما يعزز من موثوقية النظام عند إجراء المعاملات28.
تجربة المطور وبيئة الدعم #
تجربة المطور لـ Restate #
تعطي Restate القدرة على كتابة الشفرة كما لو كانت تقوم بتطوير خدمات ووظائف عادية، مما يلغي الحاجة لشغل اطلاق المتاع على الأنظمة الموزعة27. تدعم Restate العديد من اللغات: Golang وJava وKotlin وTypescript وRust وPython27.
توفر Restate 1.2 واجهة مستخدم رسومية تدعم تصحيح الأخطاء في التطبيقات الموزعة، وتحسن من بيئات التطوير والاختبار من خلال خادم تطوير محلي 27.
تجربة المطور لـ Hatchet #
يوفر Hatchet SDK مفتوحة المصدر لـ Python وTypescript وGo، مما يدعم للمطورين استخدام الأدوات المناسبة للتطوير28. كما يوفر ميزات الرؤية للمطورين المتعلقة بالمراقبة وتحسين التجربة من خلال تسهيل إصلاح الأخطاء28.
يمكّن Hatchet الوصول إلى كل عمليات التنفيذ، ويسهل تحديد مشكلات محددة ويساعد في التعريف السريع عبر تدفق السجلات ومعدلات الأخطاء.29.
مقارنة شاملة ومعايير الاختيار #
تمتلك Restate وHatchet كل منهما نقاط قوة فريدة واستخدامات محددة.
متى تكون Restate مناسبة #
إذا كان هناك ضرورة للسرعة للتطوير مع الحد الأدنى من تغييرات الشفرة، وتطبيق أنماط ساجا أو الآلات الحالة التي تحتاجها لتكون معقدة في تنفيذ الأنظمة الموزعة، وخاصة إذا كانت الكفاءة الموارد والموثوقية أولوية، قد تكون Restate الخيار الأفضل.
متى يكون Hatchet مناسبًا #
عندما تحتاج إلى قائمة مهام توزيع بشكل عادل، ولتحقيق الخصائص التراكمية، وبدعم التحليلات واحتياجات مميزة للأداء والتوزيع، خصوصًا في أنظمة قائمة أو غير قائمة على Postgres، فيمكن أن يكون الخيار الأتمثل هو Hatchet.
الاستنتاج #
كلا من Restate وHatchet يوفران حلولاً قوية مفتوحة المصدر لحل مشاكل الأحمال المتينة في الأنظمة الموزعة. بينما تركز Restate على التنفيذ المتين للعمليات المختلفة، توفر Hatchet مجموعة حلول التركيز على نظام المهام وقوائم التوزيع بشكل فائق.
نظرًا للطبيعة الفريدة والميزات المعدة لكل مشروع، يصبح من الأهمية بمكان تحديد الحل المناسب وفقًا لمتطلبات المشروع والبنية التحتية الحالية وخبرة فريق المطورين. يحتفظ كل من الحلين بأهداف مشتركة تتمثل في تبسيط تعقيدات تطوير الأنظمة الموزعة وتمكين المطورين للتركيز على منطق الأعمال الأساسي.
-
https://github.com/temporalio ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
-
https://knative.dev/blog/articles/Building-Stateful-applications-with-Knative-and-Restate/ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
-
https://news.ycombinator.com/item?id=41604042 ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
-
https://appmaster.io/ko/news/inggestneun-300man-jageum-jiweon-baegendeu-weokeupeulrou-gaebaleul-mogeumhabnida ↩︎ ↩︎
-
https://swcho.github.io/blogs/2023-12-25-temporal-2 ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
-
https://news.ycombinator.com/item?id=39643136 ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
-
https://www.inngest.com/blog/open-source-event-driven-queue ↩︎
-
https://restate.dev ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
-
https://github.com/hatchet-dev/hatchet ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎