مفهوم Race Condition رو تا حالا شنیدی؟!
در واقع به درخواستهای همزمانی که روی یه اندپوینت مشخص یا یه داده خاص در سیستم ما اتفاق میفته، Race Condition میگن.
این اتفاق معمولاً زمانی رخ میده که چندین درخواست همزمان بخوان روی یک داده مشترک اثر بذارن یا تغییراتی ایجاد کنن، و اگه به درستی مدیریت نشه، میتونه منجر به باگهای جدی و رفتار غیرمنتظره در سیستم بشه.
چطور Race Condition رو مدیریت کنیم؟
برای رفع این مشکل، من درخواستهای همزمان رو به دو بخش کلی تقسیم کردم:
۱. همزمانی در لایه اپلیکیشن:
این نوع همزمانی زمانی رخ میده که چندین درخواست همزمان به یک منبع یا عملیات خاص در اپلیکیشن دسترسی پیدا کنن.
راهحل پیشنهادی:
از Cache::lock استفاده میکنیم. این روش برای ایجاد یک قفل موقت روی منابع مشترک کاربرد داره.
مثلاً با استفاده از Redis میتونیم مطمئن بشیم که فقط یک درخواست در یک زمان خاص اجازه دسترسی داره.
۲. همزمانی روی دیتابیس:
اینجا از قفلهای دیتابیس استفاده میکنیم تا درخواستهای همزمان رو کنترل کنیم:
FOR SHARE:
این نوع قفل وقتی استفاده میشه که فقط میخوایم داده رو بخونیم، ولی مطمئن بشیم کسی در همون لحظه نمیتونه اون رو تغییر بده.
این قفل اجازه میده درخواستهای دیگه فقط بخونن ولی هیچ عملیات نوشتن یا دستکاری نمیتونه انجام بشه.
FOR UPDATE:
این قفل وقتی استفاده میشه که میخوایم داده رو بخونیم و تغییر بدیم.
وقتی این قفل فعال بشه، هیچ درخواست دیگهای نمیتونه داده رو حتی بخونه یا تغییر بده تا وقتی که تراکنش فعلی کامل بشه.
با این روشهایی که گفتم، میتونیم از درخواستهای همزمان که باعث ایجاد باگ تو پروژمون میشن جلوگیری کنیم.
یادگیری این مفاهیم نهتنها توی پروژههای واقعی خیلی بهدرد میخوره، بلکه میتونه یه سؤال کلیدی توی مصاحبههای شغلی باشه!
@DevTwitter | <Saber Qadimi/>
در واقع به درخواستهای همزمانی که روی یه اندپوینت مشخص یا یه داده خاص در سیستم ما اتفاق میفته، Race Condition میگن.
این اتفاق معمولاً زمانی رخ میده که چندین درخواست همزمان بخوان روی یک داده مشترک اثر بذارن یا تغییراتی ایجاد کنن، و اگه به درستی مدیریت نشه، میتونه منجر به باگهای جدی و رفتار غیرمنتظره در سیستم بشه.
چطور Race Condition رو مدیریت کنیم؟
برای رفع این مشکل، من درخواستهای همزمان رو به دو بخش کلی تقسیم کردم:
۱. همزمانی در لایه اپلیکیشن:
این نوع همزمانی زمانی رخ میده که چندین درخواست همزمان به یک منبع یا عملیات خاص در اپلیکیشن دسترسی پیدا کنن.
راهحل پیشنهادی:
از Cache::lock استفاده میکنیم. این روش برای ایجاد یک قفل موقت روی منابع مشترک کاربرد داره.
مثلاً با استفاده از Redis میتونیم مطمئن بشیم که فقط یک درخواست در یک زمان خاص اجازه دسترسی داره.
۲. همزمانی روی دیتابیس:
اینجا از قفلهای دیتابیس استفاده میکنیم تا درخواستهای همزمان رو کنترل کنیم:
FOR SHARE:
این نوع قفل وقتی استفاده میشه که فقط میخوایم داده رو بخونیم، ولی مطمئن بشیم کسی در همون لحظه نمیتونه اون رو تغییر بده.
این قفل اجازه میده درخواستهای دیگه فقط بخونن ولی هیچ عملیات نوشتن یا دستکاری نمیتونه انجام بشه.
FOR UPDATE:
این قفل وقتی استفاده میشه که میخوایم داده رو بخونیم و تغییر بدیم.
وقتی این قفل فعال بشه، هیچ درخواست دیگهای نمیتونه داده رو حتی بخونه یا تغییر بده تا وقتی که تراکنش فعلی کامل بشه.
با این روشهایی که گفتم، میتونیم از درخواستهای همزمان که باعث ایجاد باگ تو پروژمون میشن جلوگیری کنیم.
یادگیری این مفاهیم نهتنها توی پروژههای واقعی خیلی بهدرد میخوره، بلکه میتونه یه سؤال کلیدی توی مصاحبههای شغلی باشه!
@DevTwitter | <Saber Qadimi/>
👍22🔥13❤1
کاربری به اسم frosty این سوالات رو تو Stack Overflow پرسیده و FBI هم از طریق این اسمش و کدهایی که تو سایتش استفاده کرده تونسته ردشو بزنه.
فریمورکی که هم که استفاده کرده CodeIgniter پیاچپی بوده. یه نفر بهش میگه که چتاشون لو رفته و باید سریع پاکش کنه که اومده سرچ کرده چطوری session رو تو CodeIgniter پاکش کنه.
پ.ن: این کاربر راس ویلیام اولبریکت، بنیانگذار سایت خرید و فروش مواد مخ.در در دارک وب به نام Silk Road بود که در اکتبر ۲۰۱۳ تحت عملیاتی مشترک از سوی افبیآی، اداره مبارزه با مواد مخدر، وزارت دادگستری و آژانس امنیت ملی دستگیر و به حبس ابد محکوم شد.
پ.ن۲: اگه خواستین جرمی مرتکب بشین، جوابای Stack Overflow رو مستقیم کپی نکنید، خودتون بنویسید
پادکست جذاب Silk Road از چنلبی رو حتما گوش کنید فوقالعاده هس.
@DevTwitter | <Reza Asgharzadeh />
فریمورکی که هم که استفاده کرده CodeIgniter پیاچپی بوده. یه نفر بهش میگه که چتاشون لو رفته و باید سریع پاکش کنه که اومده سرچ کرده چطوری session رو تو CodeIgniter پاکش کنه.
پ.ن: این کاربر راس ویلیام اولبریکت، بنیانگذار سایت خرید و فروش مواد مخ.در در دارک وب به نام Silk Road بود که در اکتبر ۲۰۱۳ تحت عملیاتی مشترک از سوی افبیآی، اداره مبارزه با مواد مخدر، وزارت دادگستری و آژانس امنیت ملی دستگیر و به حبس ابد محکوم شد.
پ.ن۲: اگه خواستین جرمی مرتکب بشین، جوابای Stack Overflow رو مستقیم کپی نکنید، خودتون بنویسید
پادکست جذاب Silk Road از چنلبی رو حتما گوش کنید فوقالعاده هس.
@DevTwitter | <Reza Asgharzadeh />
🤣86👍31🔥8❤1
بفرمایید Harper
هارپر یک ابزار بررسی گرامر انگلیسی هست که طبق ادعادی نویسندهش از نظر سرعت و دقت، توان رقابت با Grammarly رو داره!
حریم خصوصی رو رعایت میکنه و البته رایگان و کدباز هست.
گیتهاب:
https://github.com/automattic/harper
سایت اصلی:
https://writewithharper.com
@DevTwitter | <Morteza Geransayeh/>
هارپر یک ابزار بررسی گرامر انگلیسی هست که طبق ادعادی نویسندهش از نظر سرعت و دقت، توان رقابت با Grammarly رو داره!
حریم خصوصی رو رعایت میکنه و البته رایگان و کدباز هست.
گیتهاب:
https://github.com/automattic/harper
سایت اصلی:
https://writewithharper.com
@DevTwitter | <Morteza Geransayeh/>
❤37👍12🔥2🤣2
وقتی ویندوز 98 میزبان هوش مصنوعی میشود؛ سفر به گذشته برای آینده!
تصور کنید یک کامپیوتر با Pentium II و فقط 128 مگابایت رم، در حال اجرای یک مدل زبانی مثل Llama 2! تیم EXO Labs این ایده جذاب رو عملی کرده و نتیجهاش یه ترکیب شگفتانگیز از نوستالژی و تکنولوژیه.
با کمک کد سادهای از آندری کارپاتی، این سیستم میتونه با سرعت 35.9 توکن بر ثانیه متن تولید کنه.
فایلها با FTP منتقل میشن و کامپایل کدها با ابزارهایی مثل Borland C++ 5.02 انجام شده.
در واقع هوش مصنوعی رو روی کانفیگی بالا آورده که حتی انتقال فایل بهش از طریق USB ممکن نیست
البته کار این تیم جدای از جنبه فانش ، میخواد نشون بده هوش مصنوعی نباید فقط در انحصار شرکتهای بزرگ باشه. این پروژه، قدمیه برای دسترسپذیر کردن هوش مصنوعی برای همه!
@DevTwitter | <breaking news/>
تصور کنید یک کامپیوتر با Pentium II و فقط 128 مگابایت رم، در حال اجرای یک مدل زبانی مثل Llama 2! تیم EXO Labs این ایده جذاب رو عملی کرده و نتیجهاش یه ترکیب شگفتانگیز از نوستالژی و تکنولوژیه.
با کمک کد سادهای از آندری کارپاتی، این سیستم میتونه با سرعت 35.9 توکن بر ثانیه متن تولید کنه.
فایلها با FTP منتقل میشن و کامپایل کدها با ابزارهایی مثل Borland C++ 5.02 انجام شده.
در واقع هوش مصنوعی رو روی کانفیگی بالا آورده که حتی انتقال فایل بهش از طریق USB ممکن نیست
البته کار این تیم جدای از جنبه فانش ، میخواد نشون بده هوش مصنوعی نباید فقط در انحصار شرکتهای بزرگ باشه. این پروژه، قدمیه برای دسترسپذیر کردن هوش مصنوعی برای همه!
@DevTwitter | <breaking news/>
👍54🤣12❤4🔥1
در برنامهنویسی شیءگرا، انکپسولاسیون یعنی اطلاعات داخل یک شیء مخفی میمونه و فقط از طریق متدهای خاصی قابل دسترسی هست این باعث میشه که دادهها امنیت داشته باشن و دستکاری نشن. در نتیجه، برنامه سادهتر و قابل کنترلتر میشه چون هر چیزی در شیء خودش نگهداری میشه.
توی 4 زبان مثال زدم ؛
@DevTwitter | <Misagh Momeni Bashusqeh/>
توی 4 زبان مثال زدم ؛
@DevTwitter | <Misagh Momeni Bashusqeh/>
🔥41👍19🤣9👎4
اگه یه میلیون کار داشته باشی و بخوای همزمان اجراشون کنی، ولی فقط 8 تا CPU داری، چهجوری بهینهترین حالت رو پیدا میکنی؟
تو گولنگ، گوروتینها خیلی سبک هستن. میتونی هزار تا، ده هزار تا، یا حتی بیشتر گوروتین همزمان اجرا کنی. ولی وقتی تعداد کارهات خیلی زیاده (مثلاً یه میلیون)، دیگه تعداد CPUها محدودیت اصلی میشه و نمیصرفه حافظه رو با صدها هزار گوروتین که همزمان نمیتونن اجرا بشن، هدر بدی.
یه راه خفن برای کنترل این داستان استفاده از Semaphore هست که میتونی تعداد گوروتینهای در حال اجرا رو محدود کنی.
حالا چطور کار میکنه؟
1. یه کانال با ظرفیت مشخص (N) درست میکنی که این ظرفیت میشه تعداد گوروتینهای همزمانی که میخوای اجرا بشه.
2. کانال رو با N تا "توکن" (هرچیزی مثل عدد) پر میکنی.
3. هر گوروتین قبل از اجرا باید یه توکن از کانال بگیره و وقتی کارش تموم شد توکن رو برمیگردونه.
4. اگه توکن نباشه گوروتین منتظر میمونه تا یکی آزاد بشه.
این تصویر یه مثال ساده با N=2 هست.
با این روش دیگه سیستم توی کارهای بیخودی قفل نمیشه و فقط به تعداد موردنیاز از منابع استفاده میکنی.
@DevTwitter | <Mohammad Abdorrahmani/>
تو گولنگ، گوروتینها خیلی سبک هستن. میتونی هزار تا، ده هزار تا، یا حتی بیشتر گوروتین همزمان اجرا کنی. ولی وقتی تعداد کارهات خیلی زیاده (مثلاً یه میلیون)، دیگه تعداد CPUها محدودیت اصلی میشه و نمیصرفه حافظه رو با صدها هزار گوروتین که همزمان نمیتونن اجرا بشن، هدر بدی.
یه راه خفن برای کنترل این داستان استفاده از Semaphore هست که میتونی تعداد گوروتینهای در حال اجرا رو محدود کنی.
حالا چطور کار میکنه؟
1. یه کانال با ظرفیت مشخص (N) درست میکنی که این ظرفیت میشه تعداد گوروتینهای همزمانی که میخوای اجرا بشه.
2. کانال رو با N تا "توکن" (هرچیزی مثل عدد) پر میکنی.
3. هر گوروتین قبل از اجرا باید یه توکن از کانال بگیره و وقتی کارش تموم شد توکن رو برمیگردونه.
4. اگه توکن نباشه گوروتین منتظر میمونه تا یکی آزاد بشه.
این تصویر یه مثال ساده با N=2 هست.
با این روش دیگه سیستم توی کارهای بیخودی قفل نمیشه و فقط به تعداد موردنیاز از منابع استفاده میکنی.
@DevTwitter | <Mohammad Abdorrahmani/>
👍51❤9🤣3👎1
اگر از Socks به عنوان پروکسی استفاده میکنید
میدانید که نرم افزارهای زیادی اجازه استفاده از Socks را به صورت
socks5://[yourip]:[yourport]
نمیدن و نیازه شما http پروکسی داشته باشید gost
github.com/ginuerzh/gost
کارش همینه
@DevTwitter | <MehrdadLinux/>
میدانید که نرم افزارهای زیادی اجازه استفاده از Socks را به صورت
socks5://[yourip]:[yourport]
نمیدن و نیازه شما http پروکسی داشته باشید gost
github.com/ginuerzh/gost
کارش همینه
@DevTwitter | <MehrdadLinux/>
❤23👍10🔥1
This media is not supported in your browser
VIEW IN TELEGRAM
ببینید یک ابزارِ کوچک اما کاربردی چقدر میتونه کارها رو ساده کنه. با pasteasfile میتونید محتوایِ کلیپبورد رو در قالبِ یک فایل پیست کنید. کاش ویندوز این قابلیت رو به صورتِ built-in میداشت. لذت بردم.
pasteasfile.org
@DevTwitter | <Ayub Kokabi/>
pasteasfile.org
@DevTwitter | <Ayub Kokabi/>
👍38🤣7
میخواهید برای مصاحبه DevOps آماده بشید ؟
مجموعه ای از سوالات مصاحبه DevOps
interview.devopscommunity.in
@DevTwitter | <MehrdadLinux/>
مجموعه ای از سوالات مصاحبه DevOps
interview.devopscommunity.in
@DevTwitter | <MehrdadLinux/>
👍17
🤣85🔥11👍6👎3
This media is not supported in your browser
VIEW IN TELEGRAM
یک ابزار خوب برای دیدن و (پراسس کردن) JSON در ترمینال
fx: Terminal JSON viewer & processor
میتونید با ترکیبش با curl راحت دیتای خروجی API ها رو تو ترمینال بررسی کنید
سرعت خیلی خوبی هم داره.
لینک پروژه در گیتهاب:
https://github.com/antonmedv/fx
لینک وبسایت و داکیومنت:
https://fx.wtf/
@DevTwitter | <Ashkan Nourzadeh/>
fx: Terminal JSON viewer & processor
میتونید با ترکیبش با curl راحت دیتای خروجی API ها رو تو ترمینال بررسی کنید
سرعت خیلی خوبی هم داره.
لینک پروژه در گیتهاب:
https://github.com/antonmedv/fx
لینک وبسایت و داکیومنت:
https://fx.wtf/
@DevTwitter | <Ashkan Nourzadeh/>
👍19❤1
واقعا فکر نمیکردم کار کردن با پروتکل torrent اینقدر سخت باشه بیش از اندازه بزرگه :))
ولی کلی چیز باهاش یادگرفتم. تا بخش خوبی جلو بردمش و الان با گرفتن فایل تورنت یا مکنت لینک میتونه تا دانلود پیش بره.
https://github.com/Soroushsrd/Torrs
@DevTwitter | <Soroush Sardashti/>
ولی کلی چیز باهاش یادگرفتم. تا بخش خوبی جلو بردمش و الان با گرفتن فایل تورنت یا مکنت لینک میتونه تا دانلود پیش بره.
https://github.com/Soroushsrd/Torrs
@DevTwitter | <Soroush Sardashti/>
🔥34👍10
نسخه Vite 6 منتشر شد!
ویت 6 با معرفی API محیطی جدید، انعطافپذیری بیشتری را برای توسعهدهندگان فراهم میکند و امکان تجربه توسعه نزدیکتر به محیط تولید را میسر میسازد. همچنین، پشتیبانی از Node.js 18، 20 و 22+ حفظ شده و پشتیبانی از نسخه 21 حذف شده است.
https://code-news.com/p/vite-6-released
@DevTwitter | <Code News/>
ویت 6 با معرفی API محیطی جدید، انعطافپذیری بیشتری را برای توسعهدهندگان فراهم میکند و امکان تجربه توسعه نزدیکتر به محیط تولید را میسر میسازد. همچنین، پشتیبانی از Node.js 18، 20 و 22+ حفظ شده و پشتیبانی از نسخه 21 حذف شده است.
https://code-news.com/p/vite-6-released
@DevTwitter | <Code News/>
👍31🔥3🤣3
شاید تعجب کرده باشید که چرا در خیلی از کنفرانس های JavaScript جای این عبارت از js و ecmanoscript استفاده میکنن..
دلیلش اینه که آقای oracle که sun microsystems رو خرید تریدمارک JavaScript رو هم در نتیجه ش صاحب شد.
حالا آقای ryan dahl که سازنده nodejs و deno هست چند وقتی هست گیر داده به oracle که تریدمارک JavaScript رو کنسل کنه که دیگه به عنوان یه کلمه عمومی همه بتونن ازش استفاده کنن. سفت و سخت پیگیره..
@DevTwitter | <Hossein Nazari/>
دلیلش اینه که آقای oracle که sun microsystems رو خرید تریدمارک JavaScript رو هم در نتیجه ش صاحب شد.
حالا آقای ryan dahl که سازنده nodejs و deno هست چند وقتی هست گیر داده به oracle که تریدمارک JavaScript رو کنسل کنه که دیگه به عنوان یه کلمه عمومی همه بتونن ازش استفاده کنن. سفت و سخت پیگیره..
@DevTwitter | <Hossein Nazari/>
❤27🤣11👍8
ساختار دادهای جدول هش (Hash Table Data Structure):
هشینگ (Hashing) یکی از ساختارهای دادهای مهم و کارآمد است که برای انتساب یک مقدار به یک کلید خاص استفاده میشود. این فرآیند از طریق یک تابع هش انجام میشود. هدف اصلی این ساختار، دسترسی سریعتر به عناصر با استفاده از این کلیدها است. کارایی هشینگ به شدت به طراحی و کارایی تابع هش وابسته است، به طوری که تابع هش باید برخوردها (Collisions) را به حداقل برساند و دادهها را به صورت یکنواخت در جدول توزیع کند.
فرض کنید یک تابع هش H(x) مقدار x را در شاخص x % 10 در یک آرایه ذخیره میکند.
به عنوان مثال، اگر لیست مقادیر [11,12,13,14,15] باشد، این مقادیر در موقعیتهای {1,2,3,4,5} در جدول هش ذخیره خواهند شد.
موارد استفاده از ساختار دادهای جدول هش(Hash Table Data Structure):
1-ساختارهای دادهای برای جستجو و بازیابی سریع:
به طور گسترده در پیادهسازی دیکشنریها (مثل Dictionary در Python یا HashMap در Java و C#) استفاده میشود.
2-مدیریت پایگاه دادهها:
برای نگهداری ایندکسها در پایگاه دادهها، جدولهای هش به منظور دسترسی سریع به رکوردها استفاده میشود.
3-سیستمهای کش (Caching):
برای ذخیره و بازیابی دادهها در سیستمهای کش با سرعت بالا، مانند Memcached.
4-سیستمهای تشخیص کلمات تکراری:
در پردازش زبان طبیعی (NLP) و بررسی متون برای ذخیره مجموعهای از کلمات و بررسی وجود یا عدم وجود آنها.
5-مدیریت حافظه:
برای مدیریت سریع تخصیص و آزادسازی حافظه.
6-حل مسائل با زمانبندی مناسب:
مانند تشخیص مقادیر تکراری در یک آرایه یا نگاشت یک مقدار به کلید برای مرتبسازی و جستجو سریع.
7-شبکههای کامپیوتری:
در مسیریابی و کش DNS برای ذخیره آدرسهای IP و نام دامنهها.
مزایا:
1-سرعت بالا در جستجو و بازیابی.
2-کارایی مناسب برای دادههای بزرگ.
3-انعطافپذیری در ذخیرهسازی جفتهای کلید-مقدار.
4-پیادهسازی ساده و گسترده در زبانهای برنامهنویسی.
چالشها:
1-مدیریت برخوردها (Collisions).
2-طراحی مناسب و کارآمد تابع هش.
3-هزینه افزایش اندازه جدول هش (Resizing).
4-مصرف بیشتر حافظه برای کاهش برخوردها.
5-حساسیت به کیفیت کلیدهای ورودی.
@DevTwitter | <Hossein Vaezzadeh/>
هشینگ (Hashing) یکی از ساختارهای دادهای مهم و کارآمد است که برای انتساب یک مقدار به یک کلید خاص استفاده میشود. این فرآیند از طریق یک تابع هش انجام میشود. هدف اصلی این ساختار، دسترسی سریعتر به عناصر با استفاده از این کلیدها است. کارایی هشینگ به شدت به طراحی و کارایی تابع هش وابسته است، به طوری که تابع هش باید برخوردها (Collisions) را به حداقل برساند و دادهها را به صورت یکنواخت در جدول توزیع کند.
فرض کنید یک تابع هش H(x) مقدار x را در شاخص x % 10 در یک آرایه ذخیره میکند.
به عنوان مثال، اگر لیست مقادیر [11,12,13,14,15] باشد، این مقادیر در موقعیتهای {1,2,3,4,5} در جدول هش ذخیره خواهند شد.
موارد استفاده از ساختار دادهای جدول هش(Hash Table Data Structure):
1-ساختارهای دادهای برای جستجو و بازیابی سریع:
به طور گسترده در پیادهسازی دیکشنریها (مثل Dictionary در Python یا HashMap در Java و C#) استفاده میشود.
2-مدیریت پایگاه دادهها:
برای نگهداری ایندکسها در پایگاه دادهها، جدولهای هش به منظور دسترسی سریع به رکوردها استفاده میشود.
3-سیستمهای کش (Caching):
برای ذخیره و بازیابی دادهها در سیستمهای کش با سرعت بالا، مانند Memcached.
4-سیستمهای تشخیص کلمات تکراری:
در پردازش زبان طبیعی (NLP) و بررسی متون برای ذخیره مجموعهای از کلمات و بررسی وجود یا عدم وجود آنها.
5-مدیریت حافظه:
برای مدیریت سریع تخصیص و آزادسازی حافظه.
6-حل مسائل با زمانبندی مناسب:
مانند تشخیص مقادیر تکراری در یک آرایه یا نگاشت یک مقدار به کلید برای مرتبسازی و جستجو سریع.
7-شبکههای کامپیوتری:
در مسیریابی و کش DNS برای ذخیره آدرسهای IP و نام دامنهها.
مزایا:
1-سرعت بالا در جستجو و بازیابی.
2-کارایی مناسب برای دادههای بزرگ.
3-انعطافپذیری در ذخیرهسازی جفتهای کلید-مقدار.
4-پیادهسازی ساده و گسترده در زبانهای برنامهنویسی.
چالشها:
1-مدیریت برخوردها (Collisions).
2-طراحی مناسب و کارآمد تابع هش.
3-هزینه افزایش اندازه جدول هش (Resizing).
4-مصرف بیشتر حافظه برای کاهش برخوردها.
5-حساسیت به کیفیت کلیدهای ورودی.
@DevTwitter | <Hossein Vaezzadeh/>
👍28❤4🤣2🔥1
یه مقاله جذاب در مورد نوشتن کد سریع از Shopify
درسته که درباره Ruby on Rails نوشته شده اما اکثر نکاتش به خیلی از زبان و فریمورک های دیگه از جمله گولنگ هم قابل تعمیم دادن هست.
دقت کنید که Shopify در یک مقیاس خیلی بزرگ کار میکنه و نکاتش مهمه.
کدی که با Ruby on Rails نوشته میشه معروفه به کند بودن
اما در Shopify در مقیاس میلیون درخواست در دقیقه داره از Ruby on Rails استفاده میشه
تو این مقاله نکات جالبی رو اشاره میکنه برای اینکه کد سریعتری نوشته بشه
اولین نکته ش در مورد ORM یا همون ActiveRecord هست که باید درک کنید توابع مختلف orm چه رفتاری با دیتابیس دارند.
تو گولنگ همین مشکل با gorm وجود داره که به شدت میتونه لود زیادی روی دیتابیس بندازه بدون اینکه برنامه نویس متوجه این قضیه بشه.
دومین نکته ش باز در مورد دیتابیس هست که میگه از select * پرهیز کنید و فقط ستون هایی که لازم دارید رو انتخاب کنید.
نکته دیگه پرهیز از کوئری زدن به ستون هایی هست که index ندارن و در مقیاس بالا باعث میشه که full scan رخ بده
البته ایندکس اضافه کردن باعث lock شدن دیتابیس ممکنه بشه برای writeها و باید مواظب مایگریشن ایندکس باشیم
نکته بعدی کش کردن همه چیز هست…
Cache All The Things
If you can’t make something faster, a good alternative is to cache it. Things like complex view compilation and external API calls benefit greatly from caching. Especially if the resultant data doesn’t change often.
یه سری چیزارو میشه throttle کرد
Throttle Bottlenecks
But what about operations you can’t cache? Things like delivering an email, sending a webhook, or even logging in can be abused by users of an application. Essentially, any expensive operation that can’t be cached should be throttled.
برای یه سری پروسه ها هم میشه job queue و مکانیزم های async در نظر گرفت
Do It Later (In a Job)
Jobs allow us to defer work to another process through queueing systems often backed by Redis. Exporting a dataset, activating a subnoscription, or processing a payment are all great examples of job-worthy work
پرهیز از متاپروگرمینگ
Use Metaprogramming Sparingly
Changing a program’s structure at runtime is a powerful feature. In a highly dynamic language like Ruby, there are significant performance costs associated to metaprogramming.
دونستن تفاوت O(1) و O(n) برای مقیاس پذیر بودن خیلی مهمه
Know the difference between O(n) and O(1)
What O(n) and O(1) mean is that there are two kinds of operations. O(n) is an operation that scales in time with size, and O(1) is one that is constant in time regardless of size.
مثلا جای آرایه بهتره از hash استفاده بشه چون lookup کردن تو hash فارغ از اندازه O(1) هست
Allocate Less
استفاده و مدیریت Garbage Collector
If used improperly, dangerous methods can lead to unwanted side effects in your code. A best practice to follow is to avoid mutating global state while leveraging mutation on local state.
https://shopify.engineering/write-fast-code-ruby-rails
@DevTwitter | <Hossein Nazari/>
درسته که درباره Ruby on Rails نوشته شده اما اکثر نکاتش به خیلی از زبان و فریمورک های دیگه از جمله گولنگ هم قابل تعمیم دادن هست.
دقت کنید که Shopify در یک مقیاس خیلی بزرگ کار میکنه و نکاتش مهمه.
کدی که با Ruby on Rails نوشته میشه معروفه به کند بودن
اما در Shopify در مقیاس میلیون درخواست در دقیقه داره از Ruby on Rails استفاده میشه
تو این مقاله نکات جالبی رو اشاره میکنه برای اینکه کد سریعتری نوشته بشه
اولین نکته ش در مورد ORM یا همون ActiveRecord هست که باید درک کنید توابع مختلف orm چه رفتاری با دیتابیس دارند.
تو گولنگ همین مشکل با gorm وجود داره که به شدت میتونه لود زیادی روی دیتابیس بندازه بدون اینکه برنامه نویس متوجه این قضیه بشه.
دومین نکته ش باز در مورد دیتابیس هست که میگه از select * پرهیز کنید و فقط ستون هایی که لازم دارید رو انتخاب کنید.
نکته دیگه پرهیز از کوئری زدن به ستون هایی هست که index ندارن و در مقیاس بالا باعث میشه که full scan رخ بده
البته ایندکس اضافه کردن باعث lock شدن دیتابیس ممکنه بشه برای writeها و باید مواظب مایگریشن ایندکس باشیم
نکته بعدی کش کردن همه چیز هست…
Cache All The Things
If you can’t make something faster, a good alternative is to cache it. Things like complex view compilation and external API calls benefit greatly from caching. Especially if the resultant data doesn’t change often.
یه سری چیزارو میشه throttle کرد
Throttle Bottlenecks
But what about operations you can’t cache? Things like delivering an email, sending a webhook, or even logging in can be abused by users of an application. Essentially, any expensive operation that can’t be cached should be throttled.
برای یه سری پروسه ها هم میشه job queue و مکانیزم های async در نظر گرفت
Do It Later (In a Job)
Jobs allow us to defer work to another process through queueing systems often backed by Redis. Exporting a dataset, activating a subnoscription, or processing a payment are all great examples of job-worthy work
پرهیز از متاپروگرمینگ
Use Metaprogramming Sparingly
Changing a program’s structure at runtime is a powerful feature. In a highly dynamic language like Ruby, there are significant performance costs associated to metaprogramming.
دونستن تفاوت O(1) و O(n) برای مقیاس پذیر بودن خیلی مهمه
Know the difference between O(n) and O(1)
What O(n) and O(1) mean is that there are two kinds of operations. O(n) is an operation that scales in time with size, and O(1) is one that is constant in time regardless of size.
مثلا جای آرایه بهتره از hash استفاده بشه چون lookup کردن تو hash فارغ از اندازه O(1) هست
Allocate Less
استفاده و مدیریت Garbage Collector
If used improperly, dangerous methods can lead to unwanted side effects in your code. A best practice to follow is to avoid mutating global state while leveraging mutation on local state.
https://shopify.engineering/write-fast-code-ruby-rails
@DevTwitter | <Hossein Nazari/>
👍24🔥4❤1
من وبسایت http://thewebscraping.club رو بار ها معرفی کردم که در مورد وباسکرپینگ مطالب مختلفی میذاره. الان تصمیم گرفتم به مرور با http://notebooklm.google برای پست هاش پادکست بسازم و با روشی که دارم براش زیرنویس فارسی تولید کنم و تو یوتیوب بذارم.
@DevTwitter | <وحید/>
@DevTwitter | <وحید/>
👍44❤1