🔵 عنوان مقاله
How to Implement the Outbox Pattern in Go and Postgres
🟢 خلاصه مقاله:
** این مقاله توضیح میدهد چگونه با الگوی Outbox در کنار Go و Postgres، مشکل دونوشتن را حل کنیم و ارسال رویدادها را قابلاعتماد کنیم. ایده اصلی این است که در یک تراکنش واحد، هم تغییرات دامنه و هم رکورد مربوط به رویداد در جدول outbox ذخیره شود تا یا هر دو باهم انجام شوند یا هیچکدام. سپس یک پردازشگر پسزمینه رکوردهای معوق را با SELECT … FOR UPDATE SKIP LOCKED برداشته، آنها را به سامانهای مثل Kafka یا RabbitMQ یا یک وبهوک ارسال میکند و وضعیتشان را به processed تغییر میدهد.
نکات کلیدی پیادهسازی شامل: طراحی جدول outbox با فیلدهایی مانند type، payload (معمولاً JSON)، status، retry_count و زمانها؛ پوشش هر دو عملیات (نوشتن دامنه و درج outbox) در یک تراکنش؛ پیادهسازی worker در Go برای برداشت دستهای، ارسال، ثبت موفقیت/خطا و بازآزمایی با backoff؛ تکیه بر تحویل حداقل-یکبار همراه با مصرفکنندههای idempotent برای مدیریت تکرار؛ و پایش شاخصهایی مثل تأخیر برداشت و نرخ شکست. برای بهینگی عملیاتی، پاکسازی دورهای رکوردهای پردازششده، ایندکسگذاری مناسب، رسیدگی به پیامهای مشکلدار (dead-letter) و حفظ ترتیب رویدادها در سطح aggregate ضروری است. ترکیب polling با LISTEN/NOTIFY در Postgres میتواند زمان واکنش را بهتر کند. نتیجه، راهکاری ساده و مقیاسپذیر است که بدون تراکنشهای توزیعشده، قابلیت اتکا را در معماری رویدادمحور فراهم میکند.
#OutboxPattern #Go #Postgres #Microservices #EventDriven #TransactionalOutbox #Messaging #Reliability
🟣لینک مقاله:
https://golangweekly.com/link/174422/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
How to Implement the Outbox Pattern in Go and Postgres
🟢 خلاصه مقاله:
** این مقاله توضیح میدهد چگونه با الگوی Outbox در کنار Go و Postgres، مشکل دونوشتن را حل کنیم و ارسال رویدادها را قابلاعتماد کنیم. ایده اصلی این است که در یک تراکنش واحد، هم تغییرات دامنه و هم رکورد مربوط به رویداد در جدول outbox ذخیره شود تا یا هر دو باهم انجام شوند یا هیچکدام. سپس یک پردازشگر پسزمینه رکوردهای معوق را با SELECT … FOR UPDATE SKIP LOCKED برداشته، آنها را به سامانهای مثل Kafka یا RabbitMQ یا یک وبهوک ارسال میکند و وضعیتشان را به processed تغییر میدهد.
نکات کلیدی پیادهسازی شامل: طراحی جدول outbox با فیلدهایی مانند type، payload (معمولاً JSON)، status، retry_count و زمانها؛ پوشش هر دو عملیات (نوشتن دامنه و درج outbox) در یک تراکنش؛ پیادهسازی worker در Go برای برداشت دستهای، ارسال، ثبت موفقیت/خطا و بازآزمایی با backoff؛ تکیه بر تحویل حداقل-یکبار همراه با مصرفکنندههای idempotent برای مدیریت تکرار؛ و پایش شاخصهایی مثل تأخیر برداشت و نرخ شکست. برای بهینگی عملیاتی، پاکسازی دورهای رکوردهای پردازششده، ایندکسگذاری مناسب، رسیدگی به پیامهای مشکلدار (dead-letter) و حفظ ترتیب رویدادها در سطح aggregate ضروری است. ترکیب polling با LISTEN/NOTIFY در Postgres میتواند زمان واکنش را بهتر کند. نتیجه، راهکاری ساده و مقیاسپذیر است که بدون تراکنشهای توزیعشده، قابلیت اتکا را در معماری رویدادمحور فراهم میکند.
#OutboxPattern #Go #Postgres #Microservices #EventDriven #TransactionalOutbox #Messaging #Reliability
🟣لینک مقاله:
https://golangweekly.com/link/174422/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
Medium
How to implement the Outbox pattern in Go and Postgres
I was at a ContainerDays conference recently and attended a great talk from Nikolay Kuznetsov about the Outbox pattern and resilient system…
❤2
🔵 عنوان مقاله
How Cloudflare Found a Bug in Go's arm64 Compiler
🟢 خلاصه مقاله:
Cloudflare در مقیاسی بسیار بزرگ از Go روی زیرساختهای متنوع، بهویژه arm64، استفاده میکند؛ جایی که خطاهای نادر هم بهدفعات رخ میدهند. آنها با مجموعهای از اختلالهای پراکنده که فقط در بیلدهای arm64 دیده میشد مواجه شدند و با مقایسه میان معماریها، کاناریکردن، و ساخت یک نمونه حداقلی، سرنخها را از منطق برنامه به سمت ابزار ساخت هدایت کردند. ریشه مشکل، یک خطای تولید کد در بخش arm64 کامپایلر Go بود که در شرایط خاص به بدترجمهسازی منجر میشد. تیم Cloudflare با همکاری تیم Go، مشکل را گزارش، بازتولید و برطرف کرد و پس از انتشار پچ، آن را بهصورت مرحلهای در کل ناوگان اعمال نمود. نتیجه این تجربه: آزمون میانمعماری، کاناریکردن ارتقاهای ابزار، و تقویت مشاهدهپذیری برای مقابله با خطاهای کمشیوع اما پرهزینه در مقیاس بالا حیاتی است.
#Cloudflare #Go #arm64 #Compiler #Bug #ProductionScale #Reliability #OpenSource
🟣لینک مقاله:
https://golangweekly.com/link/175353/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
How Cloudflare Found a Bug in Go's arm64 Compiler
🟢 خلاصه مقاله:
Cloudflare در مقیاسی بسیار بزرگ از Go روی زیرساختهای متنوع، بهویژه arm64، استفاده میکند؛ جایی که خطاهای نادر هم بهدفعات رخ میدهند. آنها با مجموعهای از اختلالهای پراکنده که فقط در بیلدهای arm64 دیده میشد مواجه شدند و با مقایسه میان معماریها، کاناریکردن، و ساخت یک نمونه حداقلی، سرنخها را از منطق برنامه به سمت ابزار ساخت هدایت کردند. ریشه مشکل، یک خطای تولید کد در بخش arm64 کامپایلر Go بود که در شرایط خاص به بدترجمهسازی منجر میشد. تیم Cloudflare با همکاری تیم Go، مشکل را گزارش، بازتولید و برطرف کرد و پس از انتشار پچ، آن را بهصورت مرحلهای در کل ناوگان اعمال نمود. نتیجه این تجربه: آزمون میانمعماری، کاناریکردن ارتقاهای ابزار، و تقویت مشاهدهپذیری برای مقابله با خطاهای کمشیوع اما پرهزینه در مقیاس بالا حیاتی است.
#Cloudflare #Go #arm64 #Compiler #Bug #ProductionScale #Reliability #OpenSource
🟣لینک مقاله:
https://golangweekly.com/link/175353/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
The Cloudflare Blog
How we found a bug in Go's arm64 compiler
84 million requests a second means even rare bugs appear often. We'll reveal how we discovered a race condition in the Go arm64 compiler and got it fixed.
❤1
🔵 عنوان مقاله
Terminating Elegantly: A Guide to Graceful Shutdowns
🟢 خلاصه مقاله:
ترک شایسته در سرویسها یعنی برنامه بتواند با دریافت SIGTERM، بدون از دست دادن داده یا خراب کردن وضعیت، درخواستهای جاری را تمام کند و منابع را درست آزاد کند. در این ارائه، Alex Pliutau با تمرکز بر Go در Kubernetes، چرخه کامل خاتمه را توضیح میدهد: از دریافت سیگنال و قطعکردن ترافیک تا ضربالاجل SIGKILL.
نکتههای کلیدی شامل اینهاست: استفاده از signal.NotifyContext و context برای لغو هماهنگ، مدیریت goroutineها با sync.WaitGroup، فراخوانی http.Server.Shutdown یا معادل gRPC برای تخلیه امن اتصالها، و توقف گرفتن کار جدید در Workerها درحالیکه کارهای درحال اجرا بهصورت زماندار تمام میشوند. در Kubernetes باید readiness زودتر غیرفعال شود تا Pod از مسیر ترافیک خارج شود، از preStop برای تأخیر یا Drain سفارشی کمک بگیرید، و terminationGracePeriodSeconds را درست تنظیم کنید. پایش و آزمون نیز ضروری است: لاگ شروع/پایان Shutdown، سنجههایی مثل تعداد درخواستهای درحال پردازش و زمان خاتمه، و تست SIGTERM تحت بار. رعایت این الگوهای ساده، خاتمهای قابل اعتماد و بدون اختلال در Go روی Kubernetes فراهم میکند.
#Go #Kubernetes #GracefulShutdown #CloudNative #Microservices #DevOps #Reliability #ProductionOps
🟣لینک مقاله:
https://golangweekly.com/link/175363/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
Terminating Elegantly: A Guide to Graceful Shutdowns
🟢 خلاصه مقاله:
ترک شایسته در سرویسها یعنی برنامه بتواند با دریافت SIGTERM، بدون از دست دادن داده یا خراب کردن وضعیت، درخواستهای جاری را تمام کند و منابع را درست آزاد کند. در این ارائه، Alex Pliutau با تمرکز بر Go در Kubernetes، چرخه کامل خاتمه را توضیح میدهد: از دریافت سیگنال و قطعکردن ترافیک تا ضربالاجل SIGKILL.
نکتههای کلیدی شامل اینهاست: استفاده از signal.NotifyContext و context برای لغو هماهنگ، مدیریت goroutineها با sync.WaitGroup، فراخوانی http.Server.Shutdown یا معادل gRPC برای تخلیه امن اتصالها، و توقف گرفتن کار جدید در Workerها درحالیکه کارهای درحال اجرا بهصورت زماندار تمام میشوند. در Kubernetes باید readiness زودتر غیرفعال شود تا Pod از مسیر ترافیک خارج شود، از preStop برای تأخیر یا Drain سفارشی کمک بگیرید، و terminationGracePeriodSeconds را درست تنظیم کنید. پایش و آزمون نیز ضروری است: لاگ شروع/پایان Shutdown، سنجههایی مثل تعداد درخواستهای درحال پردازش و زمان خاتمه، و تست SIGTERM تحت بار. رعایت این الگوهای ساده، خاتمهای قابل اعتماد و بدون اختلال در Go روی Kubernetes فراهم میکند.
#Go #Kubernetes #GracefulShutdown #CloudNative #Microservices #DevOps #Reliability #ProductionOps
🟣لینک مقاله:
https://golangweekly.com/link/175363/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
YouTube
Terminating elegantly: a guide to graceful shutdowns - Alex Pliutau
Did you ever unplug your computer because you were frustrated? In the world of software, a similar concept exists: the hard shutdown.
This abrupt termination can cause problems like data loss or system instability.
Thankfully, there's a better way: the…
This abrupt termination can cause problems like data loss or system instability.
Thankfully, there's a better way: the…