خبر فوریامروز

راهنمای معماری Durable Execution در سیستم‌های توزیع‌شده

کدی که هرگز نمی‌میرد؛ چگونه معماری اجرای پایدار امروزه با حفظ خودکار استیت در زمان کرش سرور، توسعه سیستم‌های توزیع‌شده را زیر و رو کرد.

راهنمای معماری Durable Execution
راهنمای معماری Durable Execution در سیستم‌های توزیع‌شده — عکس: آرشیو ماگ بیت
خلاصه در یک نگاه
  • بررسی تحلیلی و عمیق پارادایم نوین اجرای پایدار (Durable Execution) در مهندسی نرم‌افزار و زیرساخت‌های ابری دوران معاصر کالبدشکافی پایان وابستگی به صف‌های پیام پیچیده RabbitMQ و Kafka و پترن‌های دشوار Saga برای مدیریت شکست تراکنش‌ها، چگونگی حفظ خودکار حالت حافظه، متغیرها و استک اجرای کدهای جاوااسکریپت، تایپ‌اسکریپت، گو و پایتون در برابر قطعی سرور و کرش‌های سیستمی، مقایسه فنی موتورهای Temporal.io و Restate.dev، ارزیابی امنیت تراکنش‌های مالی و بانکی و پیاده‌سازی کاربردی ورک‌فلوهای نامیرا در میکروسرویس‌ها.
  • بررسی جامع ابعاد فنی و کاربردی توسط تحریریه ماگ بیت.
  • پیش‌بینی اثرات کوتاه‌مدت و بلندمدت بر اکوسیستم فناوری.

کابوس تراکنش‌های توزیع‌شده؛ چرا الگوهای سنتی Saga و صف‌های پیام خسته‌کننده شدند؟

برای بیش از یک دهه، توسعه‌دهندگان سیستم‌های توزیع‌شده درگیر حل یک مسئله تکراری و طاقت‌فرسا بودند: اگر در یک تراکنش چندمرحله‌ای (نظیر برداشت وجه، صدور بلیت هواپیما و ارسال نوتیفیکیشن)، سرور مرحله دوم ناگهان کرش کند یا شبکه قطع شود، چه بلایی بر سر سیستم می‌آید؟ برای جلوگیری از ناهماهنگی داده‌ها، تیم‌های فنی ناچار بودند هزاران خط کد برای پیاده‌سازی الگوهای جبرانی Saga، صف‌های رویداد کافکا یا رابیت‌ام‌کیو و پایگاه‌های داده واسط بنویسند.

بیش از ۷۰ درصد از کدهای یک میکروسرویس سازمانی صرف مدیریت خطاهای شبکه، مکانیزم‌های تکرار مجدد (Retries)، تایم‌اوت‌ها و مدیریت حالت‌های نیمه‌کاره می‌شد. این پیچیدگی سرسام‌آور نه تنها سرعت توسعه محصولات نرم‌افزاری را کند می‌کرد، بلکه حفره‌های لاجیکی متعددی ایجاد می‌کرد که منجر به از دست رفتن داده‌ها و باگ‌های فاجعه‌بار مالی می‌گردید.

اما امروزه صنعت مهندسی نرم‌افزار با یک تغییر پارادایم بنیادین روبرو شد: ظهور الگوی اجرای پایدار (Durable Execution)؛ رویکردی که تضمین می‌کند کدهای نوشته‌شده توسط برنامه‌نویس حتی در صورت آتش گرفتن دیتاسنتر یا قطعی کامل برق، از همان میلی‌ثانیه‌ای که متوقف شده بودند بدون کوچک‌ترین تکرار ادامه یابند.

کالبدشکافی مفهوم اجرای پایدار؛ ثبت رویدادمحور وقایع و مکانیسم Event Sourcing خودکار

هسته فنی اجرای پایدار بر پایه ترکیب نبوغ‌آمیز دو ایده قدیمی بنا شده است: ماشین‌های حالت قطعی (Deterministic State Machines) و منبع‌یابی وقایع (Event Sourcing). هنگامی که شما یک تابع ورک‌فلو را در محیط اجرای پایدار می‌نویسید، آن تابع دقیقاً شبیه به یک کد معمولی تک‌رشته‌ای به نظر می‌رسد: یک حلقه ساده، چند فراخوانی API و متغیرهای ذخیره‌شده در رم.

اما در پشت صحنه، ران‌تایم اجرای پایدار تمامی ورودی‌ها، خروجی‌ها و گام‌های انجام‌شده را در یک گزارش تاریخچه رویداد (Event History Log) فوق‌العاده متراکم ثبت می‌کند. اگر سرور در خط شماره ۵۰ به دلیل خطای Out of Memory از کار بیفتد، سرور جدید بلافاصله لاگ وقایع را می‌خواند، وضعیت متغیرها را بازسازی می‌کند و اجرای کد را مستقیماً از خط ۵۱ ادامه می‌دهد؛ بدون آنکه خطوط قبلی مجدداً اجرا شوند یا درخواست‌های تکراری به درگاه‌های بیرونی ارسال گردد.

این انتزاع جادویی، مفهوم شکست نرم‌افزاری ناشی از محیط را بی‌معنا ساخته است. همان‌طور که در بررسی دیتابیس‌های چندمدلی بدون سرور Neon و Turso دیدیم، جداسازی لایه پردازش از لایه پایداری داده‌ها مهم‌ترین ویژگی معماری‌های ابری مدرن امروزه است.

انقلاب اجرای پایدار (Durable Execution) در سیستم‌های توزیع‌شده؛ کالبدشکافی موتورهای Temporal و Restate، پایان دوران معماری‌های پیچیده Event-Driven و تضمین ۱۰۰ درصدی اجرای کد
انقلاب اجرای پایدار (Durable Execution) در سیستم‌های توزیع‌شده؛ کالبدشکافی موتورهای Temporal و Restate، پایان دوران معماری‌های پیچیده Event-Driven و تضمین ۱۰۰ درصدی اجرای کد

نبرد پیشتازان؛ مقایسه معماری کلاینت-سرور Temporal با سیستم فوق‌سبک Restate بر پایه HTTP/2

در میدان رقابت ابزارهای اجرای پایدار دوران معاصر دو نام درخشان بر اکوسیستم حکمرانی می‌کنند: پلتفرم جاافتاده Temporal و بازیگر نوظهور و انقلابی Restate. پلتفرم Temporal که توسط مهندسان سابق اوبر و آمازون ساخته شده، انتخاب اول سازمان‌های مقیاس‌بزرگ، بانک‌ها و سیستم‌های مدیریت تراکنش‌های سنگین است. تمپورال از یک کلاستر هماهنگ‌کننده مرکزی قدرتمند استفاده می‌کند و از زبان‌های Go، Java، TypeScript و Python پشتیبانی کامل به عمل می‌آورد.

در سمت دیگر، موتور Restate قرار دارد که به عنوان سبک‌ترین و مدرن‌ترین پلتفرم اجرای پایدار در اواخر شناخته می‌شود. رستیت کل معماری را به پروتکل استاندارد HTTP/2 تقلیل داده است. به جای رانرهای سنگین در پس‌زمینه، هر هندلر در رستیت می‌تواند یک فانکشن سرورلس ابری (مانند AWS Lambda یا کانتینرهای Cloud Run) باشد که از طریق مکانیزم تعلیق و ازسرگیری (Suspend & Resume) کار می‌کند.

توسعه‌دهندگانی که از سیستم‌های امنیتی مبتنی بر معماری امنیت شبکه با اعتماد صفر ZTNA استفاده می‌کنند، شیفته سادگی رستیت شده‌اند؛ زیرا ارتباطات میکروسرویس‌ها بدون نیاز به پورت‌های باز اضافی و با سرتیفیکیت‌های موقت رمزنگاری‌شده برقرار می‌گردد.

تاب‌آوری در برابر فجایع؛ شبیه‌سازی قطعی سرور، استارت مجدد بدون تکرار محاسبات و حفظ متغیرها

تست‌های تنش مهندسی آشوب (Chaos Engineering) امروزه کارایی خارق‌العاده موتورهای اجرای پایدار را به اثبات رسانده‌اند. در یکی از بنچمارک‌های بزرگ، ۱۰ هزار تراکنش مالی پیچیده در حال اجرا بودند که نیمی از سرورهای پردازشی به صورت ناگهانی خاموش شدند. در معماری‌های قدیمی، این سناریو به معنای ایجاد هزاران تراکنش معلق، بدهی‌های تسویه‌نشده و ساعت‌ها کار دستی تیم پشتیبانی برای بازیابی دیتابیس بود.

اما در سیستم اجرای پایدار، موتورهای تمپورال و رستیت در کمتر از ۳۰۰ میلی‌ثانیه کارگران جدید را جایگزین کرده و تمامی ۱۰ هزار تراکنش را دقیقاً از نقطه توقف به سرانجام رساندند؛ با خطای مطلق صفر و بدون حتی یک تراکنش تکراری (Exactly-Once Semantics).

این فناوری به ویژه در ترکیب با پروتکل کانتکست مدل در هوش مصنوعی اهمیتی دوچندان یافته است؛ زیرا ایجنت‌های خودمختار ممکن است ساعت‌ها مشغول اجرای پایپ‌لاین‌های پیچیده باشند و پایداری روند اجرای کدهای آن‌ها شرط بقای کسب‌وکار است.

راهنمای عملی پیاده‌سازی؛ چگونه یک پایپ‌لاین پرداخت بین‌المللی را با TypeScript پیاده کنیم؟

برای شروع کار با اجرای پایدار در نودجی‌اس یا بستر تایپ‌اسکریپت، کافی است پکیج `@temporalio/workflow` یا پکیج رسمی `@restatedev/restate-sdk` را به پروژه اضافه نمایید. شما یک تابع معمولی به نام `processOrder` تعریف می‌کنید. درون این تابع، می‌توانید یک متغیر `let status = 'pending'` بسازید و دستور `await sleep('3 days')` را درج کنید!

در برنامه‌نویسی سنتی، متوقف کردن کد برای ۳ روز روی سرور دیوانگی است؛ اما در معماری اجرای پایدار، پروسس بلافاصله از رم خارج شده و سرور آزاد می‌شود. سه روز بعد، تایمر فعال شده، سرور بیدار می‌شود، استیت متغیرها بازسازی می‌گردد و خط بعدی بدون مصرف حافظه در طول آن ۳ روز اجرا می‌شود.

جمع‌بندی آنکه پارادایم Durable Execution مهندسی نرم‌افزار را از پیچیدگی‌های غیرضروری رها ساخته و به برنامه‌نویسان اجازه داده تا تمام تمرکز خود را به جای مهار خطاهای محیطی، بر روی خلق ارزش واقعی کسب‌وکار معطوف سازند.

این مطلب را با دوستانتان به اشتراک بگذارید
م
نوشته‌ی
منا پدرام

روزنامه‌نگار حوزه‌ی فناوری؛ علاقه‌مند به روایت آدم‌ها و تغییراتی که فناوری در زندگی روزمره ایجاد می‌کند.

همه‌ی مطالب
مطالب پیشنهادی ماگ بیت

بیشتر از فناوری

مشاهده همه
راهنمای معماری Durable Execution در سیستم‌های توزیع‌شده | ماگ بیت | ماگ بیت