نوشته‌های ترمینالی
2.9K subscribers
425 photos
12 videos
33 files
2.33K links
Download Telegram
این قسمت درس شبکه معمولا تو امتحان نمیاد، ولی شما اگه دوست داشتید بخونید
https://digiato.com/internet-network/from-ixp-to-bgp-internet-cuts
11
یکی از بهترین مطالبی که خوندم:
چطور کد جدید رو ببریم روی پروداکشن؟ چقدر تست کنیم؟ محیط تست داشته باشیم؟ برای همه کاربرها فعال کنیم یا برای تعداد کمی؟
اگه تجربه پروداکشن نداشتید یا فقط تو شرکت های سایز مشخص کار کردید (یا فقط کوچک یا فقط بزرگ) بهتون توصیه میکنم بخونید.
5
Forwarded from Gopher Academy (Javad)
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
7😐1
دیروز نسخه جدید گولنگ بعد از ۶ ماه معرفی شد. نسخه 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
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
👍285❤‍🔥3
توی مهندسی نرم‌افزار، سعی می‌کنیم پیچیدگی یک نرم‌افزار بزرگ رو مدیریت کنیم و یکسری ابزار برای این کار هم داریم. یکی از بهترین ابزارها شکستن کد به ماژول‌های متفاوته. توی طراحی این ماژول‌ها سعی می‌کنیم چیزهای شبیه هم که به هم ربط زیادی دارن در یک ماژول باشن و در عوض چیزهایی که در ماژول‌های دیگه هستن خیلی ربطی به ماژول ما نداشته باشن.

اینجا دو تا مفهوم داریم که خوبه با اسم اصلیشون هم آشنا باشیم. Cohesion به وابستگی و شباهت داخل ماژول برمی‌گرده که انتظار داریم بالا باشه و سعی می‌کنیم بیشینه‌اش کنیم. اما Coupling به وابستگی بین یک ماژول و ماژول‌های دیگه برمی‌گرده و سعی می‌کنیم کمش کنیم.

این که انواع Coupling چیا می‌تونه باشه بسته به نرم‌افزار و سطحی که توش صحبت می‌کنیم می‌تونه خیلی متفاوت باشه ولی اگه بخوام ساده مثال بزنم ممکنه ماژول ما انتظار داشته باشه دیتای تولیدشده توسط یه ماژول دیگه یه جایی باشه. یا این که متدهای یک کلاس متدهای کلاس دیگری رو صدا بزنن.

در این زمینه تلاش‌های متفاوتی شده که به شکل عددی بیایم دو تا معیار رو اندازه‌گیری کنیم ولی من چیز به درد بخور عملی‌ای ندیدم!

https://en.wikipedia.org/wiki/Coupling_(computer_programming)
17👍1
چطور یک سیستم online dating رو طراحی کنیم؟
به چشم سوال system design به تیندر نگاه کنید نکات جالبی می‌تونه داشته باشه.

https://www.systemdesignhandbook.com/guides/design-tinder/
6😁5👍2
دوست دارید برای خودتون گیت رو بنویسید؟
https://wyag.thb.lt/
👎16👍113
یکسری مسائل دنیای واقعی هستن که توی کامپیوترها هم پیش میان، مخصوصا توی شبکه و سیستم‌های توزیع‌شده، این جور چیزها زیاد وجود داره.

یکی از ساده‌ترین مشکلات که اینه که بفهمیم یک کامپیوتر دیگه توی شبکه زنده هست یا نه. یکی از کاربردهاش توی باز نگه داشتن سوکت tcpئه. سیستم ما لازم داره بدونه این کانکشن tcpای که باز کرده و الان دیتایی توش نمیاد آیا به خاطر اینه که دیتای خاصی نداریم به هم بفرستیم یا اصلا سمت مقابل سرور در دسترس نیست و الکی منابع سیستم رو مشغول نگه نداریم و کاربر رو امیدوار نکنیم.

راه اولی که به ذهن میاد اینه که به طرف مقابل بگیم هروقت داشتی خاموش می‌شدی خبر بده. اگرچه که این روش برای یکسری حالت‌ها مثل خاموش شدن سیستم جواب میده (سیستم عامل طرف مقابل می‌تونه پیام خاتمه بفرسته گ) ولی خیلی حالت‌ها هست که جواب نمی‌ده مثلا قطع شدن ناگهانی شبکه یا رفتن برق یا کرش داخل سیستم‌عامل و ...

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

https://en.wikipedia.org/wiki/Heartbeat_(computing)
13👍2🔥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/
👍41
یکی از مسائل دنیای واقعی که توی سیستم‌های 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)
👍53🤔1
چرا چنل های گولنگ بد هستند؟
این مطلب با مثال های خوب توضیح می‌ده که هم کار رو برای برنامه نویس سخت میکنن هم دیباگشون سخته و هم حتی کند هستند.

https://www.jtolio.com/2016/03/go-channels-are-bad-and-you-should-feel-bad/
👎165
ساعتی که توی سیستم‌ها داریم معمولا با یه کریستال کوارتزی کنترل می‌شه و خب خطا هم داره. برای حل خطاش معمولا سیستم‌ها به یکسری سرور وصل می‌شن و تایمشون رو آپدیت می‌کنن، مثلا با پروتوکل NTP (یا همون network time protocol) که خیلی پروتوکل جالبیه و پیچیدگی‌های بامزه‌ای رو حل می‌کنه (ویدیوی اول رو ببینید)
این تنظیم زمان اگرچه خوبه اما یه گارانتی مهم رو از سیستم حذف میکنه: زمان دیگه فقط صعودی نیست!‌ ممکنه بین دو بار پرسیدن زمان، زمان اول از دوم بیشتر باشه!
این موضوع به همراه تاخیر شبکه و این که دقت NTP هم بینهایت نیست باعث می‌شه که ما نتونیم تو یه سیستم distributed با خوندن تایم فعلی سیستم و مقایسه‌ش با تایم فعلی یک سیستم دیگه، بفهمیم کدوم یکی از اتفاقات زودتر افتاده.
لزلی لمپورت در مقاله معروفش به این مشکل پرداخته.
Time, Clocks, and the Ordering of Events in a Distributed System

لزلی لمپورت در اصل فیزیک‌دان بوده و با دید فیزیک وارد distributed systemها می‌شه و چیزهای جالبی مثل الگوریتم Paxos و جنرال‌های بیزانسی (یا تحمل خطای بیزانسی) رو اختراع کرده.

لمپورت در زمینه ساعت‌ها یه مدل ارائه می‌ده که در اصل یه شمارنده‌ست که سیستم نرم‌افزاری بر اساس اتفاقاتی که برای خودش می‌افته یا پیام‌هایی که می‌فرسته یا می‌گیره بروزرسانی می‌کنه. این ساعت دیگه سعی نمی‌کنه «زمان واقعی دنیا» رو اندازه بگیره، بلکه فقط ترتیب علّی (causal ordering) اتفاقات رو مدل می‌کنه؛ یعنی اگر رویدادی باعث رویداد دیگه‌ای شده باشه، عدد ساعتش هم این رابطه رو حفظ می‌کنه. به این ترتیب بدون اینکه به ساعت فیزیکی یا هماهنگ‌سازی جهانی وابسته باشیم، می‌تونیم بفهمیم کدوم اتفاق قبل از کدوم یکی رخ داده و از همین مفهوم ساده، کلی الگوریتم و تضمین مهم در سیستم‌های توزیع‌شده ساخته می‌شه.


https://www.youtube.com/watch?v=Ihm6AYNFUKA
https://sookocheff.com/post/time/lamport-clock/
https://martinfowler.com/articles/patterns-of-distributed-systems/lamport-clock.html
https://lamport.azurewebsites.net/pubs/time-clocks.pdf
3👎1