توسعه فیچر، سرعت رشد رو برای فیچر های آینده میگیره. این طبیعیه؟ بله. مطلوبه؟ قاعدتا نه.
پس چیکار کنیم؟ گاهی باید برگردیم عقب و ساختار کد رو درست کنیم.
https://tidyfirst.substack.com/p/why-does-development-slow
پس چیکار کنیم؟ گاهی باید برگردیم عقب و ساختار کد رو درست کنیم.
https://tidyfirst.substack.com/p/why-does-development-slow
Substack
Why Does Development Slow?
It's the options
😐16👍4👎4🤨1
چرا در git، عملیات squash کردن بد است
و کمی در مورد نحوه کار git
https://dev.to/wesen/squash-commits-considered-harmful-ob1
و کمی در مورد نحوه کار git
https://dev.to/wesen/squash-commits-considered-harmful-ob1
DEV Community
⛔ Squash commits considered harmful ⛔
A recurring conversation in developer circles is if you should use git --squash when merging or do...
😐17😢7👎3🤬1
چرا فیچرفلگ ها بد هستند و باید باهاشون چیکار کنیم؟
https://newsletter.manager.dev/p/feature-flags-are-ruining-your-codebase
https://newsletter.manager.dev/p/feature-flags-are-ruining-your-codebase
newsletter.manager.dev
Feature flags are ruining your codebase
The dangers of letting PMs control them
👎15❤6
Forwarded from Mahi in Tech
درود و امید که خوب باشید.
یکسری منابع قرار میدم که شاید توی این وضعیتای که امیدوارم هرچه زودتر به خوبی تموم شه، بهدردتون بخوره.
دیاناس داخلی:
5.202.100.100
5.202.100.101
رجیستری داکر:
hub.hamdocker.ir
docker.mobinhost.com
docker.arvancloud.ir
میرور NPM, PyPi:
runflare.com/mirrors
میرور Ubuntu:
mirror.digitalvps.ir/ubuntu
ubuntu.pishgaman.net/ubuntu
ubuntu.pars.host
mirror.arvancloud.ir/ubuntu
داکیومنت یهسری از تکنولوژیها و ویکیپدیای کامپیوتر:
193.151.130.199
DNSTT Resolver:
8.8.8.8:53
77.88.8.8:53
77.88.8.1:53
2.188.21.130:53
2.189.1.1:53
یکسری منابع قرار میدم که شاید توی این وضعیتای که امیدوارم هرچه زودتر به خوبی تموم شه، بهدردتون بخوره.
دیاناس داخلی:
5.202.100.100
5.202.100.101
رجیستری داکر:
hub.hamdocker.ir
docker.mobinhost.com
docker.arvancloud.ir
میرور NPM, PyPi:
runflare.com/mirrors
میرور Ubuntu:
mirror.digitalvps.ir/ubuntu
ubuntu.pishgaman.net/ubuntu
ubuntu.pars.host
mirror.arvancloud.ir/ubuntu
داکیومنت یهسری از تکنولوژیها و ویکیپدیای کامپیوتر:
193.151.130.199
DNSTT Resolver:
8.8.8.8:53
77.88.8.8:53
77.88.8.1:53
2.188.21.130:53
2.189.1.1:53
👍13👎5❤1
این قسمت درس شبکه معمولا تو امتحان نمیاد، ولی شما اگه دوست داشتید بخونید
https://digiato.com/internet-network/from-ixp-to-bgp-internet-cuts
https://digiato.com/internet-network/from-ixp-to-bgp-internet-cuts
❤11
یکی از بهترین مطالبی که خوندم:
چطور کد جدید رو ببریم روی پروداکشن؟ چقدر تست کنیم؟ محیط تست داشته باشیم؟ برای همه کاربرها فعال کنیم یا برای تعداد کمی؟
اگه تجربه پروداکشن نداشتید یا فقط تو شرکت های سایز مشخص کار کردید (یا فقط کوچک یا فقط بزرگ) بهتون توصیه میکنم بخونید.
چطور کد جدید رو ببریم روی پروداکشن؟ چقدر تست کنیم؟ محیط تست داشته باشیم؟ برای همه کاربرها فعال کنیم یا برای تعداد کمی؟
اگه تجربه پروداکشن نداشتید یا فقط تو شرکت های سایز مشخص کار کردید (یا فقط کوچک یا فقط بزرگ) بهتون توصیه میکنم بخونید.
❤5
Forwarded from Gopher Academy (Javad)
Shipping to Production - ByteByteGo Newsletter.pdf
2.8 MB
#bytebytego #tips #pro_guide
Shipping to Production
☕️ Buy Coffee me!
➖➖➖➖➖➖➖➖
🕊 @gopher_academy | @GolangEngineers
Shipping to Production
➖➖➖➖➖➖➖➖
🕊 @gopher_academy | @GolangEngineers
Please open Telegram to view this post
VIEW IN TELEGRAM
❤8
دیپلوی در چهارشنبه (روز آخر هفته) مجاز باشه یا نه؟
این مطلب چیزهای خوبی میگه در این که کی خوبه مجاز باشه و کی نباشه و در نهایت تصمیم با خود تیمه.
یه نکته و طرز فکری که داشت و من دوست داشتم این بود که دیپلوی فریز نشون میده ما پذیرفتیم که باگ هایی هست که ما نمیتونیم در زمان تست پیدا کنیم و میره رو پروداکشن، و به جای حل مشکل، سعی میکنیم بهش چسب زخم بزنیم تا اثر منفیش رو کم کنیم.
https://charity.wtf/2025/12/24/on-friday-deploys-sometimes-that-puppy-needs-murdering-xpost/
و در ادامه این مطلب:
https://www.linkedin.com/posts/michael-davis-7033548_friday-deploy-freezes-are-exactly-like-murdering-activity-7408181339444707328-8GjS
این مطلب چیزهای خوبی میگه در این که کی خوبه مجاز باشه و کی نباشه و در نهایت تصمیم با خود تیمه.
یه نکته و طرز فکری که داشت و من دوست داشتم این بود که دیپلوی فریز نشون میده ما پذیرفتیم که باگ هایی هست که ما نمیتونیم در زمان تست پیدا کنیم و میره رو پروداکشن، و به جای حل مشکل، سعی میکنیم بهش چسب زخم بزنیم تا اثر منفیش رو کم کنیم.
https://charity.wtf/2025/12/24/on-friday-deploys-sometimes-that-puppy-needs-murdering-xpost/
و در ادامه این مطلب:
https://www.linkedin.com/posts/michael-davis-7033548_friday-deploy-freezes-are-exactly-like-murdering-activity-7408181339444707328-8GjS
❤7😐1
چه زمانی ریفکتور کنیم و چه زمانی بازنویسی کامل؟با یکسری مثال و ایده این مطلب بهتون کمک میکنه.
https://herbcaudill.com/words/20190219-rewrite-refactor-reinvent
https://herbcaudill.com/words/20190219-rewrite-refactor-reinvent
Herbcaudill
Rewrite, refactor, or reinvent?
<p>A new take on the age-old question: Should you rewrite your application from scratch, or is that “the single worst strategic mistake that any software company can make”? Turns out there are more than two options for dealing with a mature codebase.</p>
❤11
دیروز نسخه جدید گولنگ بعد از ۶ ماه معرفی شد. نسخه 1.26.0 هم امکانات جدیدی داره هم بهبودهای پرفورمنسی خوبی داشته.
اول از همه، زبالهروب (Garbage Collector) جدیدی که قبلتر معرفی شده بود، الان به طور پیشفرض فعاله و انتظار میره که باعث بهبود پرفورمنس در اکثر workloadها بشه، البته که اگر دوستش نداشتید میتونید با یه متغیر محیطی غیرفعالش کنید.
نکتهی جالب برای من اینه که بعد از گذشت ۱۰ سال هنوز هم یکی از ویژگیهای اساسی زبون بهبود پیدا میکنه و روی بازدهیش کار میشه.
بهبود های پرفورمنسی البته به همین خلاصه نمیشه و روی صدا زدن توابعی که با C نوشته شده (cgo) هم بهبود ۳۰ درصدی سربار رو داشتیم. اگه از کتابخونههایی که با c نوشته شدن استفاده میکنید سعی کنید آپدیت رو در اولویت قرار بدید، مثلا confluent یا gmf یا h3.
در قسمت بعد به بهبودهای سینتکسی و سمانتیکی اشاره کرد. تابع new الان نه فقط تایپ، بلکه مقدار هم میگیره و یه پوینتر به حافظهای که اون مقدار داخلشه رو برمیگردونه. اینطوری از شر تعریف کردن یه متغیر محلی و برگردوندن آدرسش راحت میشید.
در ادامه، جنریکها هم قویتر شدن و الان امکان تعریف تایپ پارامتری که به شکل بازگشتی به خودش ارجاع بده وجود داره.
یکسری بهبود tooling هم داشتیم که profiling و تشخیص go routine leak و بهبود سابکامند go fix جزوشه.
اطلاعات بیشتر در بلاگ رسمی گولنگ:
https://go.dev/doc/go1.26
اول از همه، زبالهروب (Garbage Collector) جدیدی که قبلتر معرفی شده بود، الان به طور پیشفرض فعاله و انتظار میره که باعث بهبود پرفورمنس در اکثر workloadها بشه، البته که اگر دوستش نداشتید میتونید با یه متغیر محیطی غیرفعالش کنید.
نکتهی جالب برای من اینه که بعد از گذشت ۱۰ سال هنوز هم یکی از ویژگیهای اساسی زبون بهبود پیدا میکنه و روی بازدهیش کار میشه.
بهبود های پرفورمنسی البته به همین خلاصه نمیشه و روی صدا زدن توابعی که با C نوشته شده (cgo) هم بهبود ۳۰ درصدی سربار رو داشتیم. اگه از کتابخونههایی که با c نوشته شدن استفاده میکنید سعی کنید آپدیت رو در اولویت قرار بدید، مثلا confluent یا gmf یا h3.
در قسمت بعد به بهبودهای سینتکسی و سمانتیکی اشاره کرد. تابع new الان نه فقط تایپ، بلکه مقدار هم میگیره و یه پوینتر به حافظهای که اون مقدار داخلشه رو برمیگردونه. اینطوری از شر تعریف کردن یه متغیر محلی و برگردوندن آدرسش راحت میشید.
در ادامه، جنریکها هم قویتر شدن و الان امکان تعریف تایپ پارامتری که به شکل بازگشتی به خودش ارجاع بده وجود داره.
یکسری بهبود tooling هم داشتیم که profiling و تشخیص go routine leak و بهبود سابکامند go fix جزوشه.
اطلاعات بیشتر در بلاگ رسمی گولنگ:
https://go.dev/doc/go1.26
go.dev
Go 1.26 Release Notes - The Go Programming Language
❤17👍9👎1🤬1
من اعتقاد دارم برنامه نویسی یاد گرفتن پیشنیاز کار به عنوان برنامهنویس یا مهندس نرمافزار یا شغل های مشابه هست، ولی اصلا کافی نیست، بلکه نیاز به دانش تئوری هم داریم که هم تو دانشگاه یاد میدن، هم جاهای دیگه میشه یاد گرفت.
یکی از این درسها که خیلی دوستش دارم، سیستمعامله. تو این درس میخونیم که پروسسها چی هستند و چطور ساخته و نگهداری و تموم میشن، مموری چطوری مدیریت میشه تا هر پروسس به مموری خودش دسترسی داشته باشه در عین این که پرفورمنس تا جای خوبی حفظ بشه.
فرض کنید که یک redis داریم که موقع ذخیره RDB در دیسک، با خطا مواجه میشه. در مرحله اول خطا رو میخونیم و سرچ میکنیم. خب خطای OOM داریم یعنی مموری پر شده، پس بیایم حافظه بیشتری بهش تخصیص بدیم، ولی این حافظه فقط برای ذخیره RDB استفاده میشه، پس آیا ارزش داره؟ احتمالا نه.
پس میتونیم چیکار کنیم؟ اگر با CoW یا همون copy on write و memory overcommit آشنا باشیم میدونیم که پروسسی از ردیس که قراره اطلاعات رو توی دیسک بنویسه، اگرچه فورکی از پروسس اصلیه ولی نیاز نیست همون مموری رو کپی کنه چون نیاز نیست write انجام بده و فقط میخواد اطلاعات رو بخونه. البته این رو سیستمعامل از قبل نمیدونه و مجبوره حافظه برای حالتی که پروسس بخواد در مموری خودش بنویسه در نظر بگیره. برای این که سیستم عامل بدونه بهش میگیم اجازه داری overcommit کنی! مسئولیتش با من.
https://redis.io/docs/latest/develop/get-started/faq/#background-saving-fails-with-a-fork-error-on-linux
یکی از این درسها که خیلی دوستش دارم، سیستمعامله. تو این درس میخونیم که پروسسها چی هستند و چطور ساخته و نگهداری و تموم میشن، مموری چطوری مدیریت میشه تا هر پروسس به مموری خودش دسترسی داشته باشه در عین این که پرفورمنس تا جای خوبی حفظ بشه.
فرض کنید که یک redis داریم که موقع ذخیره RDB در دیسک، با خطا مواجه میشه. در مرحله اول خطا رو میخونیم و سرچ میکنیم. خب خطای OOM داریم یعنی مموری پر شده، پس بیایم حافظه بیشتری بهش تخصیص بدیم، ولی این حافظه فقط برای ذخیره RDB استفاده میشه، پس آیا ارزش داره؟ احتمالا نه.
پس میتونیم چیکار کنیم؟ اگر با CoW یا همون copy on write و memory overcommit آشنا باشیم میدونیم که پروسسی از ردیس که قراره اطلاعات رو توی دیسک بنویسه، اگرچه فورکی از پروسس اصلیه ولی نیاز نیست همون مموری رو کپی کنه چون نیاز نیست write انجام بده و فقط میخواد اطلاعات رو بخونه. البته این رو سیستمعامل از قبل نمیدونه و مجبوره حافظه برای حالتی که پروسس بخواد در مموری خودش بنویسه در نظر بگیره. برای این که سیستم عامل بدونه بهش میگیم اجازه داری overcommit کنی! مسئولیتش با من.
https://redis.io/docs/latest/develop/get-started/faq/#background-saving-fails-with-a-fork-error-on-linux
Docs
Redis FAQ
Commonly asked questions when getting started with Redis
👍28❤5❤🔥3
توی مهندسی نرمافزار، سعی میکنیم پیچیدگی یک نرمافزار بزرگ رو مدیریت کنیم و یکسری ابزار برای این کار هم داریم. یکی از بهترین ابزارها شکستن کد به ماژولهای متفاوته. توی طراحی این ماژولها سعی میکنیم چیزهای شبیه هم که به هم ربط زیادی دارن در یک ماژول باشن و در عوض چیزهایی که در ماژولهای دیگه هستن خیلی ربطی به ماژول ما نداشته باشن.
اینجا دو تا مفهوم داریم که خوبه با اسم اصلیشون هم آشنا باشیم. Cohesion به وابستگی و شباهت داخل ماژول برمیگرده که انتظار داریم بالا باشه و سعی میکنیم بیشینهاش کنیم. اما Coupling به وابستگی بین یک ماژول و ماژولهای دیگه برمیگرده و سعی میکنیم کمش کنیم.
این که انواع Coupling چیا میتونه باشه بسته به نرمافزار و سطحی که توش صحبت میکنیم میتونه خیلی متفاوت باشه ولی اگه بخوام ساده مثال بزنم ممکنه ماژول ما انتظار داشته باشه دیتای تولیدشده توسط یه ماژول دیگه یه جایی باشه. یا این که متدهای یک کلاس متدهای کلاس دیگری رو صدا بزنن.
در این زمینه تلاشهای متفاوتی شده که به شکل عددی بیایم دو تا معیار رو اندازهگیری کنیم ولی من چیز به درد بخور عملیای ندیدم!
https://en.wikipedia.org/wiki/Coupling_(computer_programming)
اینجا دو تا مفهوم داریم که خوبه با اسم اصلیشون هم آشنا باشیم. Cohesion به وابستگی و شباهت داخل ماژول برمیگرده که انتظار داریم بالا باشه و سعی میکنیم بیشینهاش کنیم. اما Coupling به وابستگی بین یک ماژول و ماژولهای دیگه برمیگرده و سعی میکنیم کمش کنیم.
این که انواع Coupling چیا میتونه باشه بسته به نرمافزار و سطحی که توش صحبت میکنیم میتونه خیلی متفاوت باشه ولی اگه بخوام ساده مثال بزنم ممکنه ماژول ما انتظار داشته باشه دیتای تولیدشده توسط یه ماژول دیگه یه جایی باشه. یا این که متدهای یک کلاس متدهای کلاس دیگری رو صدا بزنن.
در این زمینه تلاشهای متفاوتی شده که به شکل عددی بیایم دو تا معیار رو اندازهگیری کنیم ولی من چیز به درد بخور عملیای ندیدم!
https://en.wikipedia.org/wiki/Coupling_(computer_programming)
❤17👍1
چطور یک سیستم online dating رو طراحی کنیم؟
به چشم سوال system design به تیندر نگاه کنید نکات جالبی میتونه داشته باشه.
https://www.systemdesignhandbook.com/guides/design-tinder/
به چشم سوال system design به تیندر نگاه کنید نکات جالبی میتونه داشته باشه.
https://www.systemdesignhandbook.com/guides/design-tinder/
System Design Handbook
Design Tinder: How to Design a Scalable Dating App
Learn how to design Tinder for System Design interviews. Explore architecture, matching, scalability, real-time chat, and common trade-offs in detail.
❤6😁5👍2
دوست دارید برای خودتون گیت رو بنویسید؟
https://wyag.thb.lt/
https://wyag.thb.lt/
wyag.thb.lt
Write yourself a Git!
👎16👍11❤3
یکسری مسائل دنیای واقعی هستن که توی کامپیوترها هم پیش میان، مخصوصا توی شبکه و سیستمهای توزیعشده، این جور چیزها زیاد وجود داره.
یکی از سادهترین مشکلات که اینه که بفهمیم یک کامپیوتر دیگه توی شبکه زنده هست یا نه. یکی از کاربردهاش توی باز نگه داشتن سوکت tcpئه. سیستم ما لازم داره بدونه این کانکشن tcpای که باز کرده و الان دیتایی توش نمیاد آیا به خاطر اینه که دیتای خاصی نداریم به هم بفرستیم یا اصلا سمت مقابل سرور در دسترس نیست و الکی منابع سیستم رو مشغول نگه نداریم و کاربر رو امیدوار نکنیم.
راه اولی که به ذهن میاد اینه که به طرف مقابل بگیم هروقت داشتی خاموش میشدی خبر بده. اگرچه که این روش برای یکسری حالتها مثل خاموش شدن سیستم جواب میده (سیستم عامل طرف مقابل میتونه پیام خاتمه بفرسته گ) ولی خیلی حالتها هست که جواب نمیده مثلا قطع شدن ناگهانی شبکه یا رفتن برق یا کرش داخل سیستمعامل و ...
راه دومی که به نظر میاد اینه که هر از گاهی حال کامپیوتر دیگه رو بپرسیم. این روش رو بهش heartbeat میگن و به این شکل کار میکنه که در بازههای منظمی پیام بدون محتوا برای طرف میفرستیم هم برای این که بگیم ما زنده هستیم هم برای این که طرف مقابل زنده بودن خودشو اعلام کنه.
همونطور که گفتم معمولا دو نقش متفاوت توی این ماجرا داریم. کامپیوتر مبدا که مدام heartbeat اولیه رو میفرسته و کامپیوتر مقصد که به اونا پاسخ میده و اگر هم پاسخ نده مبدا متوجه میشه که مقصد از دست رفته و اگر مقصد چند تا heartbeat نگیره متوجه میشه مبدا از دست رفته. (البته خیلی بستگی به کاربرد و پیاده سازی داره)
https://en.wikipedia.org/wiki/Heartbeat_(computing)
یکی از سادهترین مشکلات که اینه که بفهمیم یک کامپیوتر دیگه توی شبکه زنده هست یا نه. یکی از کاربردهاش توی باز نگه داشتن سوکت tcpئه. سیستم ما لازم داره بدونه این کانکشن tcpای که باز کرده و الان دیتایی توش نمیاد آیا به خاطر اینه که دیتای خاصی نداریم به هم بفرستیم یا اصلا سمت مقابل سرور در دسترس نیست و الکی منابع سیستم رو مشغول نگه نداریم و کاربر رو امیدوار نکنیم.
راه اولی که به ذهن میاد اینه که به طرف مقابل بگیم هروقت داشتی خاموش میشدی خبر بده. اگرچه که این روش برای یکسری حالتها مثل خاموش شدن سیستم جواب میده (سیستم عامل طرف مقابل میتونه پیام خاتمه بفرسته گ) ولی خیلی حالتها هست که جواب نمیده مثلا قطع شدن ناگهانی شبکه یا رفتن برق یا کرش داخل سیستمعامل و ...
راه دومی که به نظر میاد اینه که هر از گاهی حال کامپیوتر دیگه رو بپرسیم. این روش رو بهش heartbeat میگن و به این شکل کار میکنه که در بازههای منظمی پیام بدون محتوا برای طرف میفرستیم هم برای این که بگیم ما زنده هستیم هم برای این که طرف مقابل زنده بودن خودشو اعلام کنه.
همونطور که گفتم معمولا دو نقش متفاوت توی این ماجرا داریم. کامپیوتر مبدا که مدام heartbeat اولیه رو میفرسته و کامپیوتر مقصد که به اونا پاسخ میده و اگر هم پاسخ نده مبدا متوجه میشه که مقصد از دست رفته و اگر مقصد چند تا heartbeat نگیره متوجه میشه مبدا از دست رفته. (البته خیلی بستگی به کاربرد و پیاده سازی داره)
https://en.wikipedia.org/wiki/Heartbeat_(computing)
❤12👍1🔥1👌1
چطور سرویسهای ایمیل متوجه میشن ایمیل از سرور درستی بهشون رسیده؟
SPF, DKIM, and DMARC help authenticate email senders by verifying that the emails came from the domain that they claim to be from. These three authentication methods are important for preventing spam, phishing attacks, and other email security risks.
https://www.cloudflare.com/learning/email-security/dmarc-dkim-spf/
SPF, DKIM, and DMARC help authenticate email senders by verifying that the emails came from the domain that they claim to be from. These three authentication methods are important for preventing spam, phishing attacks, and other email security risks.
https://www.cloudflare.com/learning/email-security/dmarc-dkim-spf/
Cloudflare
What are DMARC, DKIM, and SPF? | Cloudflare
SPF, DKIM, and DMARC help prevent spam and authenticate email senders by verifying where emails come from. Learn how SPF, DKIM, and DMARC work.
👍4
یکی از مسائل دنیای واقعی که توی سیستمهای distributed خیلی کاربرد داره به اجماع رسیدنه (یا همون consensus)
مساله از این قراره که ما کامپیوترهای متفاوتی داریم که از طریق شبکه با هم در ارتباط هستن ولی ممکنه هم خودشون از کار بیفتن هم شبکه به درستی کار نکنه و تاخیر داشته باشه. پس نیاز داریم با یکسری مکانیسم کاری کنیم به اجماع برسن و حالتهای متفاوت مثل کرش سیستم های مختلف یا از دست رفتن شبکهشون (partition شدن اصطلاحا) رو در نظر بگیریم.
راههای ساده و ابتدایی برای این قضیه 2 phase commit و 3 phase commitئه که مشکلات خاص خودشو داره مثلا سیستم بلاک میشه تا همه جواب بدن.
روشهای بهتر شامل Paxos میشه که تضمینهای خوبی در زمینه ددلاک نشدن سیستم (liveness) و تحمل خطای بالاتر داره ولی روش نسبتا پیچیدهایه، هم از نظر فهم هم از نظر پیادهسازی. نسخهی سادهتر و قابل پیادهسازیش ارائه شده به اسم Raft که همون تضمینها رو میده همچنان در عین سادگی.
یه قسمت paxos که برام جالب بود هم براتون توضیح میدم: توی paxos، پروپوزال در واقع یه پیشنهاده که یه نود (proposer) برای انتخاب شدن یه مقدار میفرسته. هر پروپوزال یه شمارهی یکتا و صعودی داره که ترتیب و اولویت رو مشخص میکنه. نودها (acceptorها) فقط به پروپوزالی جواب مثبت میدن که شمارهش از همهی شمارههایی که قبلتر دیدن بزرگتر باشه. این مکانیزم شمارهگذاری باعث میشه حتی با وجود رقابت چند proposer یا کرش بعضی نودها، در نهایت فقط یه مقدار به عنوان مقدار نهایی انتخاب بشه و خاصیت safety حفظ بشه.
در اینجا خوبه به Byzantine Failure هم اشاره کنم. تا اینجا خطایی که باهاش مواجه بودیم این بود که سیستم کرش کرده یا قابل دسترس نیست ولی پاسخ غلط نمیده ولی مدل خطا ممکنه این باشه که سیستم به خاطر نویز یا هرچیزی پاسخ غلط هم میده. در این حالت الگوریتمهای دیگهای استفاده میشه و تعداد خطای کمتری رو میتونن تحمل کنن. مثلا اگر paxos تا نصف خطا رو تحمل میکنه، روشهایی که خطای Byzantine رو تحمل میکنن نهایتا تا یک سوم خطا رو تحمل میکنن.
https://en.wikipedia.org/wiki/Consensus_(computer_science)
https://en.wikipedia.org/wiki/Two-phase_commit_protocol
https://en.wikipedia.org/wiki/Paxos_(computer_science)
مساله از این قراره که ما کامپیوترهای متفاوتی داریم که از طریق شبکه با هم در ارتباط هستن ولی ممکنه هم خودشون از کار بیفتن هم شبکه به درستی کار نکنه و تاخیر داشته باشه. پس نیاز داریم با یکسری مکانیسم کاری کنیم به اجماع برسن و حالتهای متفاوت مثل کرش سیستم های مختلف یا از دست رفتن شبکهشون (partition شدن اصطلاحا) رو در نظر بگیریم.
راههای ساده و ابتدایی برای این قضیه 2 phase commit و 3 phase commitئه که مشکلات خاص خودشو داره مثلا سیستم بلاک میشه تا همه جواب بدن.
روشهای بهتر شامل Paxos میشه که تضمینهای خوبی در زمینه ددلاک نشدن سیستم (liveness) و تحمل خطای بالاتر داره ولی روش نسبتا پیچیدهایه، هم از نظر فهم هم از نظر پیادهسازی. نسخهی سادهتر و قابل پیادهسازیش ارائه شده به اسم Raft که همون تضمینها رو میده همچنان در عین سادگی.
یه قسمت paxos که برام جالب بود هم براتون توضیح میدم: توی paxos، پروپوزال در واقع یه پیشنهاده که یه نود (proposer) برای انتخاب شدن یه مقدار میفرسته. هر پروپوزال یه شمارهی یکتا و صعودی داره که ترتیب و اولویت رو مشخص میکنه. نودها (acceptorها) فقط به پروپوزالی جواب مثبت میدن که شمارهش از همهی شمارههایی که قبلتر دیدن بزرگتر باشه. این مکانیزم شمارهگذاری باعث میشه حتی با وجود رقابت چند proposer یا کرش بعضی نودها، در نهایت فقط یه مقدار به عنوان مقدار نهایی انتخاب بشه و خاصیت safety حفظ بشه.
در اینجا خوبه به Byzantine Failure هم اشاره کنم. تا اینجا خطایی که باهاش مواجه بودیم این بود که سیستم کرش کرده یا قابل دسترس نیست ولی پاسخ غلط نمیده ولی مدل خطا ممکنه این باشه که سیستم به خاطر نویز یا هرچیزی پاسخ غلط هم میده. در این حالت الگوریتمهای دیگهای استفاده میشه و تعداد خطای کمتری رو میتونن تحمل کنن. مثلا اگر paxos تا نصف خطا رو تحمل میکنه، روشهایی که خطای Byzantine رو تحمل میکنن نهایتا تا یک سوم خطا رو تحمل میکنن.
https://en.wikipedia.org/wiki/Consensus_(computer_science)
https://en.wikipedia.org/wiki/Two-phase_commit_protocol
https://en.wikipedia.org/wiki/Paxos_(computer_science)
👍2❤1🤔1