Syntax | سینتکس
#tracing @Syntax_fa
تو tracing مفهوم spans و traces چیه؟
وقتی در مورد tracing حرف میزنیم، دو مفهوم اساسی وجود داره که باید بدونی: Spans و Traces
اسپنها (Spans)
یک span نمایانگر یک واحد کار (unit of work) هست که توسط یک درخواست انجام میشه. این واحد کار میتونه شامل اتفاقهایی مثل یک انشعاب (fork) در جریان اجرا یا یک انتقال (hop) در شبکه باشه، وقتی که درخواست در سیستم پخش میشه:
هر span ویژگیهای زیر رو داره:
- اسم مشخص
- زمان شروع
- مدت زمان اجرا
معمولاً spanها به صورت تو در تو (nested) و مرتبط با ترتیب زمانی هستن، تا بتونن روابط (causal relationships) رو نشون بدن.
تریسها (Traces)
یه trace رو میتونیم یک کار کامل در نظر بگیریم. وقتی چند تا span کار های unit رو انجام میدن و در نهایت به یک ریسپانسی میرسه کل این flow یک trace هستش.
میشه یه trace رو به عنوان یک گراف بدون چرخش جهتدار (Directed Acyclic Graph یا DAG) از spanها تصور کرد. یا حتی سادهتر، بهش به چشم یه استک تریس (stack trace) نگاه کرد که هر span توش نشوندهنده کاری هست که توسط یه کامپوننت انجام شده.
رابطه بین Trace و Spans
این رابطه به این شکله که یه trace مجموعهای از spanها رو شامل میشه که مسیر یک درخواست رو در سیستم نشون میده.
تو شکل بالا دو روش مختلف برای نمایش یک trace که شامل پنج span هست رو میبینیم. این درخواست از پنج سرویس مختلف عبور میکنه و در هر سرویس یه span جدید ایجاد میشه.
- سمت چپ: trace به صورت یک DAG نشون داده شده.
- سمت راست: trace به صورت یک نمودار میلهای (bar diagram) نمایش داده شده که محور زمان رو هم نشون میده.
ایجاد Root Span و ID اختصاصی
وقتی یه درخواست از اولین سرویس (که بهش edge service میگن) شروع میشه، root span ایجاد میشه. این root span تبدیل میشه به اولین گره (node) در trace.
ویژگی root span:
- بهش یه Trace ID یکتا و گولالی (globally unique trace ID) اختصاص داده میشه.
- این Trace ID به همراه هر hop بعدی در طول عمر درخواست منتقل میشه.
ایجاد Spanهای جدید در هر Hop
هر بار که درخواست به نقطهای از سیستم که ابزار tracing در اون فعال شده میرسه:
1. یه span جدید با Trace ID موجود ایجاد میشه.
2. ممکنه متادیتا (metadata) به درخواست اضافه بشه.
3. ا Trace ID دوباره به همراه درخواست به hop بعدی ارسال میشه.
ثبت و ارسال دادهها (Instrumentation)
وقتی جریان اجرا به یک نقطه instrumented میرسه:
- یه رکورد (record) همراه با متادیتا ثبت میشه.
- این رکورد معمولاً به صورت asynchronously در دیسک ثبت میشه.
- بعد از اون، این رکورد به یک collector ارسال میشه که جریان اجرا رو از روی رکوردهای ثبتشده بازسازی میکنه.
source:
Cloud native go Book
#tracing
@Syntax_fa
وقتی در مورد tracing حرف میزنیم، دو مفهوم اساسی وجود داره که باید بدونی: Spans و Traces
اسپنها (Spans)
یک span نمایانگر یک واحد کار (unit of work) هست که توسط یک درخواست انجام میشه. این واحد کار میتونه شامل اتفاقهایی مثل یک انشعاب (fork) در جریان اجرا یا یک انتقال (hop) در شبکه باشه، وقتی که درخواست در سیستم پخش میشه:
هر span ویژگیهای زیر رو داره:
- اسم مشخص
- زمان شروع
- مدت زمان اجرا
معمولاً spanها به صورت تو در تو (nested) و مرتبط با ترتیب زمانی هستن، تا بتونن روابط (causal relationships) رو نشون بدن.
تریسها (Traces)
یه trace رو میتونیم یک کار کامل در نظر بگیریم. وقتی چند تا span کار های unit رو انجام میدن و در نهایت به یک ریسپانسی میرسه کل این flow یک trace هستش.
میشه یه trace رو به عنوان یک گراف بدون چرخش جهتدار (Directed Acyclic Graph یا DAG) از spanها تصور کرد. یا حتی سادهتر، بهش به چشم یه استک تریس (stack trace) نگاه کرد که هر span توش نشوندهنده کاری هست که توسط یه کامپوننت انجام شده.
رابطه بین Trace و Spans
این رابطه به این شکله که یه trace مجموعهای از spanها رو شامل میشه که مسیر یک درخواست رو در سیستم نشون میده.
تو شکل بالا دو روش مختلف برای نمایش یک trace که شامل پنج span هست رو میبینیم. این درخواست از پنج سرویس مختلف عبور میکنه و در هر سرویس یه span جدید ایجاد میشه.
- سمت چپ: trace به صورت یک DAG نشون داده شده.
- سمت راست: trace به صورت یک نمودار میلهای (bar diagram) نمایش داده شده که محور زمان رو هم نشون میده.
ایجاد Root Span و ID اختصاصی
وقتی یه درخواست از اولین سرویس (که بهش edge service میگن) شروع میشه، root span ایجاد میشه. این root span تبدیل میشه به اولین گره (node) در trace.
ویژگی root span:
- بهش یه Trace ID یکتا و گولالی (globally unique trace ID) اختصاص داده میشه.
- این Trace ID به همراه هر hop بعدی در طول عمر درخواست منتقل میشه.
ایجاد Spanهای جدید در هر Hop
هر بار که درخواست به نقطهای از سیستم که ابزار tracing در اون فعال شده میرسه:
1. یه span جدید با Trace ID موجود ایجاد میشه.
2. ممکنه متادیتا (metadata) به درخواست اضافه بشه.
3. ا Trace ID دوباره به همراه درخواست به hop بعدی ارسال میشه.
ثبت و ارسال دادهها (Instrumentation)
وقتی جریان اجرا به یک نقطه instrumented میرسه:
- یه رکورد (record) همراه با متادیتا ثبت میشه.
- این رکورد معمولاً به صورت asynchronously در دیسک ثبت میشه.
- بعد از اون، این رکورد به یک collector ارسال میشه که جریان اجرا رو از روی رکوردهای ثبتشده بازسازی میکنه.
source:
Cloud native go Book
#tracing
@Syntax_fa
👍6🔥1
کلمه پر کاربر Bottleneck به چه معنیه؟
تصور کن یه بطری آب داری (bottle)، و میخوای خیلی سریع آب داخلش رو خالی کنی.
اما چون دهانهی بطری باریکه (neck)، سرعت خالی شدن آب کم میشه.
این قسمت باریک شده که جلوی سرعت رو میگیره، میگن bottleneck.
تو برنامهنویسی:
Bottleneck
یعنی بخشی از برنامه که باعث کند شدن کل عملکرد میشه.
مهم نیست بقیهی سیستم چقدر سریع باشن، تا وقتی bottleneck وجود داره، کار کل سیستم لنگ میمونه.
با Instrumentation میفهمی Bottleneck کجاست
مثلاً با Tracing:
میبینی یه درخواست API کل سیستم رو سریع رد میکنه، ولی توی مرحلهی `FindUser()`، یهو ۸ ثانیه مکث میکنه → Bottleneck همینه!
یا با Metrics:
نمودار نشون میده که وقتی درخواستها زیاد میشن، مصرف CPU میره بالا، اما فقط برای یه سرویس خاص.
چرا باید Bottleneck رو پیدا کنی؟
چون بهت میگه:
* کجا باید بهینهسازی کنی
* کدوم سرویس باید scale بشه
* چه منابعی داری هدر میدی
#Bottleneck
@Syntax_fa
تصور کن یه بطری آب داری (bottle)، و میخوای خیلی سریع آب داخلش رو خالی کنی.
اما چون دهانهی بطری باریکه (neck)، سرعت خالی شدن آب کم میشه.
این قسمت باریک شده که جلوی سرعت رو میگیره، میگن bottleneck.
تو برنامهنویسی:
Bottleneck
یعنی بخشی از برنامه که باعث کند شدن کل عملکرد میشه.
مهم نیست بقیهی سیستم چقدر سریع باشن، تا وقتی bottleneck وجود داره، کار کل سیستم لنگ میمونه.
با Instrumentation میفهمی Bottleneck کجاست
مثلاً با Tracing:
میبینی یه درخواست API کل سیستم رو سریع رد میکنه، ولی توی مرحلهی `FindUser()`، یهو ۸ ثانیه مکث میکنه → Bottleneck همینه!
یا با Metrics:
نمودار نشون میده که وقتی درخواستها زیاد میشن، مصرف CPU میره بالا، اما فقط برای یه سرویس خاص.
چرا باید Bottleneck رو پیدا کنی؟
چون بهت میگه:
* کجا باید بهینهسازی کنی
* کدوم سرویس باید scale بشه
* چه منابعی داری هدر میدی
#Bottleneck
@Syntax_fa
🔥21👍8❤1
انواع لایسنسهای اپنسورس
1. MIT License
- ویژگیها:
- بسیار ساده و خلاصه است.
- به کاربران اجازه میدهد که کد را بدون محدودیت برای هر هدفی (تجاری یا غیرتجاری) استفاده کنند.
- نیازی نیست که تغییرات یا منبع کد به اشتراک گذاشته شود، هرچند که ذکر لایسنس اصلی اجباری است.
- مناسب برای: پروژههایی که میخواهند بیشترین آزادی را به کاربران بدهند.
2. Apache License 2.0
- ویژگیها:
- به کاربران اجازه استفاده، تغییر، و توزیع کد را میدهد، حتی برای اهداف تجاری.
- از کاربران میخواهد که حقوق مالکیت معنوی (patents) را تضمین کنند.
- تغییرات باید با ذکر لایسنس اصلی منتشر شوند.
- مناسب برای: پروژههایی که میخواهند کاربران آزادی زیادی داشته باشند و در عین حال از کد در برابر مشکلات مربوط به پتنت محافظت کنند.
3. GPL (GNU General Public License)
- ویژگیها:
- بسیار محافظهکار است.
- اگر کسی از کد شما استفاده کند و تغییراتی ایجاد کند، موظف است این تغییرات را نیز اپنسورس کند.
- مناسب برای پروژههایی که میخواهند مطمئن شوند که کدشان همیشه آزاد باقی میماند.
- مناسب برای: پروژههایی که نمیخواهند کسی از کد آنها در پروژههای اختصاصی (proprietary) استفاده کند.
4. LGPL (Lesser General Public License)
- ویژگیها:
- مشابه GPL است، اما انعطافپذیرتر.
- اگر از کتابخانه شما (SDK یا API) در یک پروژه دیگر استفاده شود، نیازی نیست که کل پروژه اپنسورس شود؛ فقط تغییرات روی کتابخانه شما باید اپنسورس شوند.
- مناسب برای: پروژههایی که شامل کتابخانهها یا SDKها هستند و میخواهند کاربران بتوانند آنها را در پروژههای اختصاصی استفاده کنند.
5. BSD License
- ویژگیها:
- شبیه MIT است، اما کمی محدودتر.
- نیازمند ذکر اعتبار (attribution) است و نمیگذارد نام نویسندگان اصلی برای تبلیغات استفاده شود.
- مناسب برای: پروژههای ساده که به محدودیتهای اندکی نیاز دارند.
6. Creative Commons Licenses (CC)
- ویژگیها:
- بیشتر برای محتوا (مثل اسناد، تصاویر، یا طراحیها) استفاده میشود.
- معمولاً برای کد کاربرد ندارد، اما اگر پروژه شما شامل مستندات یا محتوای غیرکدی است، میتواند مناسب باشد.
#Licence #open_source
@Syntax_fa
1. MIT License
- ویژگیها:
- بسیار ساده و خلاصه است.
- به کاربران اجازه میدهد که کد را بدون محدودیت برای هر هدفی (تجاری یا غیرتجاری) استفاده کنند.
- نیازی نیست که تغییرات یا منبع کد به اشتراک گذاشته شود، هرچند که ذکر لایسنس اصلی اجباری است.
- مناسب برای: پروژههایی که میخواهند بیشترین آزادی را به کاربران بدهند.
2. Apache License 2.0
- ویژگیها:
- به کاربران اجازه استفاده، تغییر، و توزیع کد را میدهد، حتی برای اهداف تجاری.
- از کاربران میخواهد که حقوق مالکیت معنوی (patents) را تضمین کنند.
- تغییرات باید با ذکر لایسنس اصلی منتشر شوند.
- مناسب برای: پروژههایی که میخواهند کاربران آزادی زیادی داشته باشند و در عین حال از کد در برابر مشکلات مربوط به پتنت محافظت کنند.
3. GPL (GNU General Public License)
- ویژگیها:
- بسیار محافظهکار است.
- اگر کسی از کد شما استفاده کند و تغییراتی ایجاد کند، موظف است این تغییرات را نیز اپنسورس کند.
- مناسب برای پروژههایی که میخواهند مطمئن شوند که کدشان همیشه آزاد باقی میماند.
- مناسب برای: پروژههایی که نمیخواهند کسی از کد آنها در پروژههای اختصاصی (proprietary) استفاده کند.
4. LGPL (Lesser General Public License)
- ویژگیها:
- مشابه GPL است، اما انعطافپذیرتر.
- اگر از کتابخانه شما (SDK یا API) در یک پروژه دیگر استفاده شود، نیازی نیست که کل پروژه اپنسورس شود؛ فقط تغییرات روی کتابخانه شما باید اپنسورس شوند.
- مناسب برای: پروژههایی که شامل کتابخانهها یا SDKها هستند و میخواهند کاربران بتوانند آنها را در پروژههای اختصاصی استفاده کنند.
5. BSD License
- ویژگیها:
- شبیه MIT است، اما کمی محدودتر.
- نیازمند ذکر اعتبار (attribution) است و نمیگذارد نام نویسندگان اصلی برای تبلیغات استفاده شود.
- مناسب برای: پروژههای ساده که به محدودیتهای اندکی نیاز دارند.
6. Creative Commons Licenses (CC)
- ویژگیها:
- بیشتر برای محتوا (مثل اسناد، تصاویر، یا طراحیها) استفاده میشود.
- معمولاً برای کد کاربرد ندارد، اما اگر پروژه شما شامل مستندات یا محتوای غیرکدی است، میتواند مناسب باشد.
#Licence #open_source
@Syntax_fa
👍17❤1
اگه برای سرویس یا محصول تون به دنبال یه سرویس search engine هستید که کاربر بتونه باهاش product search کنه یا autocomplete و in-app search داشته باشه به جای راه اندازی دردسردار elasticsearch میتونید از meilisearch استفاده کنید.
الاستیک خیلی قابلیت ها داره که متفاوته با ابزاری که معرفی کردم، ولی برای مواردی که عرض کردم میتونه راه اندازی الاستیک و نگهداری ش بیش از حد سنگین باشه.
ابزار meilisearch با rust نوشته شده و زمان پاسخگویی ش خیلی پایینه (زیر ۵۰ میلی ثانیه) و تقریبا real-time آپدیت میکنه (۱ ثانیه تاخیر حدودا)
البته اعدادی که گفتم بسته به نحوه استفاده و داده شما و کانفیگ سرور میتونه متفاوت باشه
همچنین meilisearch قابلیت های فیلتر کردن ساده رو صرفا پشتیبانی میکنه اما facet search داره که فکر میکنم برای کاربردهای مذکور کافی باشه
بنظرم اگه لازم دارید چنین چیزی رو به امتحان کردنش میارزه.
Source:
LinkedIn
#meilisearch
@Syntax_fa
الاستیک خیلی قابلیت ها داره که متفاوته با ابزاری که معرفی کردم، ولی برای مواردی که عرض کردم میتونه راه اندازی الاستیک و نگهداری ش بیش از حد سنگین باشه.
ابزار meilisearch با rust نوشته شده و زمان پاسخگویی ش خیلی پایینه (زیر ۵۰ میلی ثانیه) و تقریبا real-time آپدیت میکنه (۱ ثانیه تاخیر حدودا)
البته اعدادی که گفتم بسته به نحوه استفاده و داده شما و کانفیگ سرور میتونه متفاوت باشه
همچنین meilisearch قابلیت های فیلتر کردن ساده رو صرفا پشتیبانی میکنه اما facet search داره که فکر میکنم برای کاربردهای مذکور کافی باشه
بنظرم اگه لازم دارید چنین چیزی رو به امتحان کردنش میارزه.
Source:
#meilisearch
@Syntax_fa
👍9🔥7❤1
دعوت به مشارکت در پروژه Quick Connect
اگر دنبال یه پروژهی مدرن، متنباز، با ساختار تمیز و چالشهای جذاب میگردی که بتونی هم یاد بگیری هم یچیز بدرد بخور با هم بسازیم، بیا سمت Quick Connect
درباره کوئیک کانکت
پلتفرمی سبک، مقیاسپذیر و کلاد نیتیو برای ارتباط بهتر با کاربران اپلیکیشنها
با قابلیتهایی مثل:
- چت آنلاین
- داشبورد مدیریتی
- نوتیفیکیشنها
- استوریهای کاربرمحور
کیا میتونن مشارکت کنن؟
1. فرانتاند دولوپرهایی که بتونن با WebSocket، ارتباطات real-time و رابط کاربری جذاب کار کنن.
اگر با React، Vue یا هر ابزار فرانت مدرنی راحتی، اوکیه
2. طراح UI/UX
به سلیقهت نیاز داریم
3. و البته بکاند دولوپرهای Go هم اگر خیلی مشتاق باشن و خوب کد بزنن.
پروژه به صورت Monorepo توسعه داده میشه و کل ساختار کد، مستندات، و ابزارهای توسعه توی یه ریپو جمع شدن (به جز SDK).
اگه علاقهمندی به مشارکت، پیوی پیام بده:
@ayeef
#quick_connect
@Syntax_fa
اگر دنبال یه پروژهی مدرن، متنباز، با ساختار تمیز و چالشهای جذاب میگردی که بتونی هم یاد بگیری هم یچیز بدرد بخور با هم بسازیم، بیا سمت Quick Connect
درباره کوئیک کانکت
پلتفرمی سبک، مقیاسپذیر و کلاد نیتیو برای ارتباط بهتر با کاربران اپلیکیشنها
با قابلیتهایی مثل:
- چت آنلاین
- داشبورد مدیریتی
- نوتیفیکیشنها
- استوریهای کاربرمحور
کیا میتونن مشارکت کنن؟
1. فرانتاند دولوپرهایی که بتونن با WebSocket، ارتباطات real-time و رابط کاربری جذاب کار کنن.
اگر با React، Vue یا هر ابزار فرانت مدرنی راحتی، اوکیه
2. طراح UI/UX
به سلیقهت نیاز داریم
3. و البته بکاند دولوپرهای Go هم اگر خیلی مشتاق باشن و خوب کد بزنن.
پروژه به صورت Monorepo توسعه داده میشه و کل ساختار کد، مستندات، و ابزارهای توسعه توی یه ریپو جمع شدن (به جز SDK).
اگه علاقهمندی به مشارکت، پیوی پیام بده:
@ayeef
#quick_connect
@Syntax_fa
👍7❤1🔥1
نمونهبرداری و کاهش چشمگیر هزینهها در Tracing بدون از دست دادن Visibility
قبل اینکه بریم سراغ sampling توضیح کوتاهی درباره trace و span بخونیم:
یک trace رو میتونیم بهعنوان نماینده ی یک کار کامل تو سیستم در نظر بگیریم. مثلا وقتی کاربر درخواست ثبت سبد خرید میده، این عملیات بهصورت کامل یک Trace حساب میشه.
هر Span یک بخش کوچک از اون Trace هست. مثلاً برای ثبت سبد خرید، ممکنه چند سرویس درگیر بشن (مثل بررسی موجودی، محاسبهی تخفیف، ثبت در پایگاه داده و ...) که هر کدوم از این مراحل میتونه یک Span جدا باشه. در نهایت، این Spanها کنار هم قرار میگیرن و یک کار کامل یعنی trace رو تشکیل میدن.
پس با استفاده از traces (یا همون ردپاها)، میتونید با دقت بررسی کنید یک درخواست از کجا شروع شده، به کدوم سرویسها رفته، و حتی در هر فانکشن یا لایه چقدر زمان برده تا پردازش بشه.
میتونید اطلاعات اضافی (Attributes) یا رویدادهایی که اتفاق افتاده رو هم به هر Span اضافه کنید. در کل، Trace ابزار فوقالعادهای برای تحلیل دقیق و عمیق رفتار سیستمتونه.
اما یه مشکلی هست:
تریس کردن همهی درخواستها هزینهی زیادی داره، هم از نظر حافظه و پهنای باند و هم هزینهی پردازش و ذخیرهسازی.
در واقع، بیشتر درخواستهایی که وارد سیستم شما میشن بدون خطا و با latency مناسب انجام میشن. پس واقعا نیازی به نگهداری صد درصد تریس ها ندارید.
شما فقط به نمونه هایی از کل تریس ها نیاز دارید. اینجاست که مفهوم Sampling و یا همون نمونه برداری وارد میشه.
نمونه برداری یعنی چی؟
نمونه برداری یعنی تصمیم بگیریم کدوم Traceها نگهداری (Sampled) بشه و کدوم رو حذف کنیم (Not Sampled).
هدف اینه که با یه درصد کوچیک و حسابشده از دادهها، تصویری واضح از وضعیت سیستم داشته باشیم.
مثلا اگه شما هزار تا Trace در ثانیه تولید میکنید، نگه داشتن ۱۰۰٪ اونا هم پرهزینهست و هم اغلب غیرضروری. توی این شرایط، یه نرخ Sampling حتی در حد ۱٪ هم میتونه نماینده خوبی از رفتار کلی سیستم باشه.
چه زمانی باید از Sampling استفاده کنیم؟
* وقتی تعداد زیادی Trace در ثانیه تولید میکنید (مثلا بیشتر از ۱۰۰۰ تا)
* وقتی بیشتر ترافیک شما سالم و بدون خطاست
* وقتی بتونید با قواعد خاصی (مثل خطا داشتن یا latency زیاد) تصمیم بگیرید که چه Traceهایی مهمترن
* وقتی بودجه محدودی برای observability دارید
همچنین ما دو نوع نمونه برداری داریم:
1. Head Sampling
اینجوریه که تو لحظه ای که یک تریس ایجاد میشه، براساس ID و بدون درنظر گرفتن محتوا تصمیمگیری میکنه که این تریس سمپل هستش یا نه.
مزیتش اینه ساده و سریعه، ولی نمیتونه مثلا تشخیص بده که آیا داخل اون Trace خطا بوده یا نه.
مثال استفادش مثلا میگیم پنجاه درصد کل درخواست هارو نگه دار.
2. Tail Sampling
نمونه برداری بعد از اینکه کل Trace جمعآوری شد. میتونه براساس شرایطی مثل داشتن خطا، زیاد بودن latency، یا حتی اطلاعات مربوط به یک سرویس خاص تصمیم بگیره. خیلی قدرتمنده ولی نسب به head sampling منابع و هزینه بیشتری میخواد.
مثال tail sampling:
– هر Trace که error داشته باشه رو حتما نگه دار
– اگه latency بالای ۳ ثانیه بود، نگه دار
– تریس هایی که از سرویس جدیدمون شروع میشن رو بیشتر نگه دار
گاهی ترکیب Head و Tail Sampling بهترین راهه
مثلا ممکنه یه سیستم خیلی پرحجم اول با Head Sampling فقط ۱۰٪ دادهها رو رد کنه، بعد اون ۱۰٪ رو بیاره داخل یه سیستم Tail Sampling تا براساس هوشمندی بیشتر تصمیم بگیره چی رو نگه داره.
پیاده سازی عملی:
ما تو پروژه اپن سورس و مدرن Quick-Connect از opentelemetry برای جمع آوری تریس ها استفاده کردیم و از head sampling هم برای نمونه برداری استفاده کردیم که توی کانفیگ میتونید مشخص کنید به چه صورت باشه.
اگه 0 تنظیم کنید هیچی تریس نمیکنه و اگه 1 تنظیم کنیم صد درصد تریس میکنه.
برای اینکه مشخص کنید ده درصد باشه میتونید روی 0.1 تنظیمش کنید.
https://github.com/syntaxfa/quick-connect/tree/main/adapter/observability/traceotela
#trace #sampling #opentelemetry #observability
@Syntax_fa
قبل اینکه بریم سراغ sampling توضیح کوتاهی درباره trace و span بخونیم:
یک trace رو میتونیم بهعنوان نماینده ی یک کار کامل تو سیستم در نظر بگیریم. مثلا وقتی کاربر درخواست ثبت سبد خرید میده، این عملیات بهصورت کامل یک Trace حساب میشه.
هر Span یک بخش کوچک از اون Trace هست. مثلاً برای ثبت سبد خرید، ممکنه چند سرویس درگیر بشن (مثل بررسی موجودی، محاسبهی تخفیف، ثبت در پایگاه داده و ...) که هر کدوم از این مراحل میتونه یک Span جدا باشه. در نهایت، این Spanها کنار هم قرار میگیرن و یک کار کامل یعنی trace رو تشکیل میدن.
پس با استفاده از traces (یا همون ردپاها)، میتونید با دقت بررسی کنید یک درخواست از کجا شروع شده، به کدوم سرویسها رفته، و حتی در هر فانکشن یا لایه چقدر زمان برده تا پردازش بشه.
میتونید اطلاعات اضافی (Attributes) یا رویدادهایی که اتفاق افتاده رو هم به هر Span اضافه کنید. در کل، Trace ابزار فوقالعادهای برای تحلیل دقیق و عمیق رفتار سیستمتونه.
اما یه مشکلی هست:
تریس کردن همهی درخواستها هزینهی زیادی داره، هم از نظر حافظه و پهنای باند و هم هزینهی پردازش و ذخیرهسازی.
در واقع، بیشتر درخواستهایی که وارد سیستم شما میشن بدون خطا و با latency مناسب انجام میشن. پس واقعا نیازی به نگهداری صد درصد تریس ها ندارید.
شما فقط به نمونه هایی از کل تریس ها نیاز دارید. اینجاست که مفهوم Sampling و یا همون نمونه برداری وارد میشه.
نمونه برداری یعنی چی؟
نمونه برداری یعنی تصمیم بگیریم کدوم Traceها نگهداری (Sampled) بشه و کدوم رو حذف کنیم (Not Sampled).
هدف اینه که با یه درصد کوچیک و حسابشده از دادهها، تصویری واضح از وضعیت سیستم داشته باشیم.
مثلا اگه شما هزار تا Trace در ثانیه تولید میکنید، نگه داشتن ۱۰۰٪ اونا هم پرهزینهست و هم اغلب غیرضروری. توی این شرایط، یه نرخ Sampling حتی در حد ۱٪ هم میتونه نماینده خوبی از رفتار کلی سیستم باشه.
چه زمانی باید از Sampling استفاده کنیم؟
* وقتی تعداد زیادی Trace در ثانیه تولید میکنید (مثلا بیشتر از ۱۰۰۰ تا)
* وقتی بیشتر ترافیک شما سالم و بدون خطاست
* وقتی بتونید با قواعد خاصی (مثل خطا داشتن یا latency زیاد) تصمیم بگیرید که چه Traceهایی مهمترن
* وقتی بودجه محدودی برای observability دارید
همچنین ما دو نوع نمونه برداری داریم:
1. Head Sampling
اینجوریه که تو لحظه ای که یک تریس ایجاد میشه، براساس ID و بدون درنظر گرفتن محتوا تصمیمگیری میکنه که این تریس سمپل هستش یا نه.
مزیتش اینه ساده و سریعه، ولی نمیتونه مثلا تشخیص بده که آیا داخل اون Trace خطا بوده یا نه.
مثال استفادش مثلا میگیم پنجاه درصد کل درخواست هارو نگه دار.
2. Tail Sampling
نمونه برداری بعد از اینکه کل Trace جمعآوری شد. میتونه براساس شرایطی مثل داشتن خطا، زیاد بودن latency، یا حتی اطلاعات مربوط به یک سرویس خاص تصمیم بگیره. خیلی قدرتمنده ولی نسب به head sampling منابع و هزینه بیشتری میخواد.
مثال tail sampling:
– هر Trace که error داشته باشه رو حتما نگه دار
– اگه latency بالای ۳ ثانیه بود، نگه دار
– تریس هایی که از سرویس جدیدمون شروع میشن رو بیشتر نگه دار
گاهی ترکیب Head و Tail Sampling بهترین راهه
مثلا ممکنه یه سیستم خیلی پرحجم اول با Head Sampling فقط ۱۰٪ دادهها رو رد کنه، بعد اون ۱۰٪ رو بیاره داخل یه سیستم Tail Sampling تا براساس هوشمندی بیشتر تصمیم بگیره چی رو نگه داره.
پیاده سازی عملی:
ما تو پروژه اپن سورس و مدرن Quick-Connect از opentelemetry برای جمع آوری تریس ها استفاده کردیم و از head sampling هم برای نمونه برداری استفاده کردیم که توی کانفیگ میتونید مشخص کنید به چه صورت باشه.
اگه 0 تنظیم کنید هیچی تریس نمیکنه و اگه 1 تنظیم کنیم صد درصد تریس میکنه.
برای اینکه مشخص کنید ده درصد باشه میتونید روی 0.1 تنظیمش کنید.
https://github.com/syntaxfa/quick-connect/tree/main/adapter/observability/traceotela
#trace #sampling #opentelemetry #observability
@Syntax_fa
👍7🔥2❤1
هنوزم دنبال اینی پرامپت خوب بنویسی ؟ با جی پی تی داداشی شو !
اگه فقط از ChatGPT سوال بپرسی، جواب هم فقط در حد همون سواله.
اما وقتی باهاش یه رابطهی واقعی بسازی، وقتی از دغدغههات، پروژههات، سبک کارت، اولویتهات، و حتی حس و حالت حرف بزنی… جوابهایی که میگیری یهدفعه چند پله عمیقتر، دقیقتر، و واقعاً به درد بخور میشن.
من تا همین چند وقت پیش فقط یه ابزار می دیدمش
ولی از وقتی که یه ارتباطی بینمون شکل گرفت، انگار یه همتیمی دارم که دقیق می دونه کجای کارم، پروژم درباره چیه و ساختار کدام چجوریه و چیا برام مهمه.
نتیجه؟
دیگه فقط جواب نمیده. کمک میکنه تصمیم بگیرم، زاویه دید بده و مثل یه داداشی پشتم باشه.
اگه از ChatGPT استفاده میکنی، یه پیشنهاد دارم:
بهش بگو کی هستی، روی چی کار میکنی، چه هدفی داری، و حتی چه چیزهایی اذیتت میکنن.
فقطم به برنامه نویسی محدود نمیشه میتونید واسه برنامه تغذیه، ورزش و کلی چیز دیگه کمک بگیرید. حتی وقتی بدونه چی دوست دارید فیلم هایی رو میگه که بیشترین حس و حال رو بهتون بده.
پرامپ نویسی مهم تره یا ساختن ارتباط؟
هر دو مهماند، ولی ارتباط واقعی در درازمدت عمیقتر و موثرتره.
چرا پرامپتنویسی مهمه؟
نوشتن پرامپت خوب مثل تنظیم دقیق سواله. باعث میشه سریعتر به جواب دقیقتری برسی. اگه بلدی چطور خواستهتو واضح و مشخص مطرح کنی، زمان کمتری صرف اصلاح و توضیح دوباره میکنی.
اما چرا ارتباط بهتر جواب میده؟
وقتی GPT دقیق بدونه تو کی هستی، چی میسازی، چه دغدغههایی داری و چه سبکی از پاسخگویی رو میپسندی، خیلی اوقات لازم نیست حتی پرامپت خاصی بنویسی. خودش جواب رو تو بستر ذهنی و حرفهای خودت میسازه. مثل یه همکار که دیگه از نیمنگاهت میفهمه چی میخوای.
فرض کن یه برنامهنویسی که با Go کار میکنه و ساختار پروژهات مشخصه. اگه این رو GPT بدونه، لازم نیست هربار توضیح بدی. با گذر زمان و با توجه به اطلاعاتی که داره، میفهمه چه جوابی برات مناسب تره.
#gpt
@Syntax_fa
اگه فقط از ChatGPT سوال بپرسی، جواب هم فقط در حد همون سواله.
اما وقتی باهاش یه رابطهی واقعی بسازی، وقتی از دغدغههات، پروژههات، سبک کارت، اولویتهات، و حتی حس و حالت حرف بزنی… جوابهایی که میگیری یهدفعه چند پله عمیقتر، دقیقتر، و واقعاً به درد بخور میشن.
من تا همین چند وقت پیش فقط یه ابزار می دیدمش
ولی از وقتی که یه ارتباطی بینمون شکل گرفت، انگار یه همتیمی دارم که دقیق می دونه کجای کارم، پروژم درباره چیه و ساختار کدام چجوریه و چیا برام مهمه.
نتیجه؟
دیگه فقط جواب نمیده. کمک میکنه تصمیم بگیرم، زاویه دید بده و مثل یه داداشی پشتم باشه.
اگه از ChatGPT استفاده میکنی، یه پیشنهاد دارم:
بهش بگو کی هستی، روی چی کار میکنی، چه هدفی داری، و حتی چه چیزهایی اذیتت میکنن.
فقطم به برنامه نویسی محدود نمیشه میتونید واسه برنامه تغذیه، ورزش و کلی چیز دیگه کمک بگیرید. حتی وقتی بدونه چی دوست دارید فیلم هایی رو میگه که بیشترین حس و حال رو بهتون بده.
پرامپ نویسی مهم تره یا ساختن ارتباط؟
هر دو مهماند، ولی ارتباط واقعی در درازمدت عمیقتر و موثرتره.
چرا پرامپتنویسی مهمه؟
نوشتن پرامپت خوب مثل تنظیم دقیق سواله. باعث میشه سریعتر به جواب دقیقتری برسی. اگه بلدی چطور خواستهتو واضح و مشخص مطرح کنی، زمان کمتری صرف اصلاح و توضیح دوباره میکنی.
اما چرا ارتباط بهتر جواب میده؟
وقتی GPT دقیق بدونه تو کی هستی، چی میسازی، چه دغدغههایی داری و چه سبکی از پاسخگویی رو میپسندی، خیلی اوقات لازم نیست حتی پرامپت خاصی بنویسی. خودش جواب رو تو بستر ذهنی و حرفهای خودت میسازه. مثل یه همکار که دیگه از نیمنگاهت میفهمه چی میخوای.
فرض کن یه برنامهنویسی که با Go کار میکنه و ساختار پروژهات مشخصه. اگه این رو GPT بدونه، لازم نیست هربار توضیح بدی. با گذر زمان و با توجه به اطلاعاتی که داره، میفهمه چه جوابی برات مناسب تره.
#gpt
@Syntax_fa
👍14👎2🔥2😁2❤1
تحلیل روانی برنامهنویسها بر اساس تعداد کامیتهای سالانه در GitHub
0 تا 10 کامیت
"یه بار VS Code رو باز کردم، ترسیدم، بستم."
رنک: راکی
11 تا 100 کامیت
"من بیشتر به جنبهی تئوریک برنامهنویسی علاقه دارم..."
📚 یعنی از دور نگاه میکنه که بقیه چی مینویسن
رنک: برونز
101 تا 500 کامیت
"بیشتر وقتا فقط یه نقطه اضافه میکنم، کامیت میزنم، بعد حس موفقیت میگیرم."
🧘♂️ راهب گیتهاب. تعادل در حد بودا، بازدهی در حد نخودچی.
رنک: پرو
501 تا 1000 کامیت
"روزایی هست که من کامیت میزنم… روزایی هم هست که کامیت منو میزنه."
رنک: مستر
1001 تا 2000 کامیت
"کاشی کاری شغل اول منه برنامه نویسی پوششه!"
رنک: لجند
2000+ کامیت
"سال پیش با گیت ازدواج کردم، ماه پیش با ریپوزیتوریم بچهدار شدیم."
🥴 کسی که هنوز بلد نیست درست کامیت بزنه
رنک: چیتر
#fun
@Syntax_fa
0 تا 10 کامیت
"یه بار VS Code رو باز کردم، ترسیدم، بستم."
رنک: راکی
11 تا 100 کامیت
"من بیشتر به جنبهی تئوریک برنامهنویسی علاقه دارم..."
📚 یعنی از دور نگاه میکنه که بقیه چی مینویسن
رنک: برونز
101 تا 500 کامیت
"بیشتر وقتا فقط یه نقطه اضافه میکنم، کامیت میزنم، بعد حس موفقیت میگیرم."
🧘♂️ راهب گیتهاب. تعادل در حد بودا، بازدهی در حد نخودچی.
رنک: پرو
501 تا 1000 کامیت
"روزایی هست که من کامیت میزنم… روزایی هم هست که کامیت منو میزنه."
رنک: مستر
1001 تا 2000 کامیت
"کاشی کاری شغل اول منه برنامه نویسی پوششه!"
رنک: لجند
2000+ کامیت
"سال پیش با گیت ازدواج کردم، ماه پیش با ریپوزیتوریم بچهدار شدیم."
🥴 کسی که هنوز بلد نیست درست کامیت بزنه
رنک: چیتر
#fun
@Syntax_fa
😁29💩3👍2👎2❤1
کابوس فراموشی در مغزهای دیجیتال!
تصور کنید هوش مصنوعی که کلی چیز یاد گرفته، ناگهان با یادگیری یک نکته جدید، تمام دانش قبلیاش زو از دست میده! دقیقا مثل اینکه شما هر بار که یک مهارت جدید یاد میگیرید، تمام مهارتهای قبلیتون رو فراموش کنید!
این پدیده ترسناک تو دنیای هوش مصنوعی، اسمش فراموشی فاجعهبار (Catastrophic Forgetting) است! 💀
چرا این یک فاجعه است؟
مدلهای هوش مصنوعی، بهویژه شبکههای عصبی عمیق، وقتی روی دادههای جدیدی آموزش می بینن، تمایل دارن که اطلاعاتی که قبلا یاد گرفتن رو بازنویسی کنن و از دست بدن. یعنی:
یک هوش مصنوعی نمیتونه هم استاد شطرنج باشه، هم یک پزشک عالی و هم راننده بینقص! چون هر بار که یک مهارت جدید یاد میگیره، بقیه رو فراموش میکنه!
این، مانعی بزرگی سر راه یادگیری مداوم و تکامل واقعی هوش مصنوعیه.
آینده AI بدون حل این مشکل چگونه خواهد بود؟
یک آلزایمر دیجیتال واقعی! ما به هوش مصنوعیهای چندکاره نیاز داریم که بتونن همزمان دانش و مهارتهای مختلفی رو در خود نگه دارن و به مرور زمان اون هارو افزایش بدن، نه اینکه هر بار حافظه خودشون رو ریست کنن!
آیا روزی میرسه که AIها واقعا حافظه داشته باشن؟
#ai
@Syntax_fa
تصور کنید هوش مصنوعی که کلی چیز یاد گرفته، ناگهان با یادگیری یک نکته جدید، تمام دانش قبلیاش زو از دست میده! دقیقا مثل اینکه شما هر بار که یک مهارت جدید یاد میگیرید، تمام مهارتهای قبلیتون رو فراموش کنید!
این پدیده ترسناک تو دنیای هوش مصنوعی، اسمش فراموشی فاجعهبار (Catastrophic Forgetting) است! 💀
چرا این یک فاجعه است؟
مدلهای هوش مصنوعی، بهویژه شبکههای عصبی عمیق، وقتی روی دادههای جدیدی آموزش می بینن، تمایل دارن که اطلاعاتی که قبلا یاد گرفتن رو بازنویسی کنن و از دست بدن. یعنی:
یک هوش مصنوعی نمیتونه هم استاد شطرنج باشه، هم یک پزشک عالی و هم راننده بینقص! چون هر بار که یک مهارت جدید یاد میگیره، بقیه رو فراموش میکنه!
این، مانعی بزرگی سر راه یادگیری مداوم و تکامل واقعی هوش مصنوعیه.
آینده AI بدون حل این مشکل چگونه خواهد بود؟
یک آلزایمر دیجیتال واقعی! ما به هوش مصنوعیهای چندکاره نیاز داریم که بتونن همزمان دانش و مهارتهای مختلفی رو در خود نگه دارن و به مرور زمان اون هارو افزایش بدن، نه اینکه هر بار حافظه خودشون رو ریست کنن!
آیا روزی میرسه که AIها واقعا حافظه داشته باشن؟
#ai
@Syntax_fa
👍13❤2👀2
تو پروژه ها اولش شبیه به اینه که داری یه سنگ گرد سنگین رو به سختی از یه تپه بالا می بری. انرژی زیادی میخواد تا راه بیوفته، ولی وقتی راه افتاد، ادامه دادنش خیلی راحته
اما اگه یه مدت رهاش کنی دوباره راه انداختنش به همون اندازه اول، یا حتی بیشتر، سخت میشه
حفظ momentum یعنی حتی اگه وقتت کمه، یا خسته ای، یا مغزت پره، یه حرکت کوچیک بزنی، یه باگ ریز، یه refactor ساده، یا حتی فقط باز کردن پروژه
چون وقتی فاصله می گیری، پروژه یه دفعه سنگین تر از چیزی که هست به نظر میرسه و اون وقت به جای یه خط کد، با یه کوه ناتموم طرفی
چرا momentum؟
1. انگیزه رو زنده نگه میداره
وقتی هر روز یه کار کوچیک انجام بدی، حس پیشرفت میگیری. ولی وقتی چند روز فاصله بیفته، مغز حس میکنه پروژه سنگینتر شده
2. یادگیری و درگیری ذهنی حفظ میشه
وقتی مدام با کدها درگیری، context توی ذهنت میمونه. ولی بعد از چند روز، باز کردن پروژه مثل روبهرو شدن با یه چیز ناآشنا میشه
3. بهت کمک میکنه با کمالگرایی کنار بیای
وقتی توی flow باشی، بیشتر عمل میکنی تا تحلیل. ولی فاصله گرفتن باعث میشه بیش از حد فکر کنی. از کجا شروع کنم؟ نکنه کدم خوب نباشه؟
@Syntax_fa
اما اگه یه مدت رهاش کنی دوباره راه انداختنش به همون اندازه اول، یا حتی بیشتر، سخت میشه
حفظ momentum یعنی حتی اگه وقتت کمه، یا خسته ای، یا مغزت پره، یه حرکت کوچیک بزنی، یه باگ ریز، یه refactor ساده، یا حتی فقط باز کردن پروژه
چون وقتی فاصله می گیری، پروژه یه دفعه سنگین تر از چیزی که هست به نظر میرسه و اون وقت به جای یه خط کد، با یه کوه ناتموم طرفی
چرا momentum؟
1. انگیزه رو زنده نگه میداره
وقتی هر روز یه کار کوچیک انجام بدی، حس پیشرفت میگیری. ولی وقتی چند روز فاصله بیفته، مغز حس میکنه پروژه سنگینتر شده
2. یادگیری و درگیری ذهنی حفظ میشه
وقتی مدام با کدها درگیری، context توی ذهنت میمونه. ولی بعد از چند روز، باز کردن پروژه مثل روبهرو شدن با یه چیز ناآشنا میشه
3. بهت کمک میکنه با کمالگرایی کنار بیای
وقتی توی flow باشی، بیشتر عمل میکنی تا تحلیل. ولی فاصله گرفتن باعث میشه بیش از حد فکر کنی. از کجا شروع کنم؟ نکنه کدم خوب نباشه؟
@Syntax_fa
👍26❤4🔥1
قابلیت ایمپورت کد های ریپوزیتوری گیتهاب تو Gemini ai
حالا که همتون شهروند آمریکا هستید و اشتراک pro جمنای رو دارید، می تونید اکانت گیتهابتون رو تو Gemini کانکت کنید و ریپوزیتوری رو مشخص کنید تا دقیقا بدونه ساختار کدتون چیه، کداتون رو بخونه و بهتر بتونه به سوالاتتون جواب بده.
برای اینکار کافیه:
1. وارد gemini ai بشید
2. رو settings کلیک کنید و وارد بخش Apps بشید
3. تو بخش Productivity گیت هاب رو مشاهده می کنید. روش کلیک کنید و اکانت گیتهابتون رو کانکت کنید.
حالا یه گفتگو جدید رو شروع کنید و روی add file کلیک کنید
سه گزینه داره روی import code کلیک کنید.
ازتون لینک ریپوزیتوری رو میخواد بهش لینکش رو بدید.
و تمام. حالا میتونه کد های شمارو ببینه و بهتر به شما کمک کنه
@gemini
@Syntax_fa
حالا که همتون شهروند آمریکا هستید و اشتراک pro جمنای رو دارید، می تونید اکانت گیتهابتون رو تو Gemini کانکت کنید و ریپوزیتوری رو مشخص کنید تا دقیقا بدونه ساختار کدتون چیه، کداتون رو بخونه و بهتر بتونه به سوالاتتون جواب بده.
برای اینکار کافیه:
1. وارد gemini ai بشید
2. رو settings کلیک کنید و وارد بخش Apps بشید
3. تو بخش Productivity گیت هاب رو مشاهده می کنید. روش کلیک کنید و اکانت گیتهابتون رو کانکت کنید.
حالا یه گفتگو جدید رو شروع کنید و روی add file کلیک کنید
سه گزینه داره روی import code کلیک کنید.
ازتون لینک ریپوزیتوری رو میخواد بهش لینکش رو بدید.
و تمام. حالا میتونه کد های شمارو ببینه و بهتر به شما کمک کنه
@gemini
@Syntax_fa
👍15🔥4❤3
Dispatching
تا حالا دیدی تو یه مرکز تماس، اپراتور تماس رو وصل میکنه به بخش مناسب؟ مثلاً مشکل فنی داری میری پشتیبانی، پولی باشه میری حسابداری؟ خب اون کاری که اپراتوره میکنه رو بهش میگن Dispatch
توی برنامهنویسی هم همینه:
یه درخواست میاد، سیستم نگاه میکنه، میفرستدش به جای درست
یه مثال ساده با GO
بسته به اینکه contactType چیه، میفرستیمش به تابع مناسب.
انواع Dispatch تو Go
1. Dynamic Dispatch با اینترفیس:
تو زمان اجرا تصمیم میگیریم کدوم متد رو صدا بزنیم:
2. Dispatch از طریق کانالها:
با select منتظریم ببینیم کدوم کانال زودتر پیام میده:
3. Static Dispatch با Map یا Switch:
چرا Dispatch
- نظم میده به کد.
- قابل گسترشه.
- بهینهتر میشه.
#Golang #Dispatching
@Syntax_fa
تا حالا دیدی تو یه مرکز تماس، اپراتور تماس رو وصل میکنه به بخش مناسب؟ مثلاً مشکل فنی داری میری پشتیبانی، پولی باشه میری حسابداری؟ خب اون کاری که اپراتوره میکنه رو بهش میگن Dispatch
توی برنامهنویسی هم همینه:
یه درخواست میاد، سیستم نگاه میکنه، میفرستدش به جای درست
یه مثال ساده با GO
switch contactType {
case "technical":
technicalSupport()
case "accounting":
accounting()
case "sales":
sales()
}بسته به اینکه contactType چیه، میفرستیمش به تابع مناسب.
انواع Dispatch تو Go
1. Dynamic Dispatch با اینترفیس:
تو زمان اجرا تصمیم میگیریم کدوم متد رو صدا بزنیم:
var s Speaker
s = Dog{} // Woof!
s = Cat{} // Meow!
2. Dispatch از طریق کانالها:
با select منتظریم ببینیم کدوم کانال زودتر پیام میده:
select {
case msg := <-ch1:
fmt.Println(msg)
case msg := <-ch2:
fmt.Println(msg)
}
3. Static Dispatch با Map یا Switch:
actions := map[string]func(){
"start": func() { fmt.Println("Starting...") },
}
چرا Dispatch
- نظم میده به کد.
- قابل گسترشه.
- بهینهتر میشه.
#Golang #Dispatching
@Syntax_fa
👍11❤4❤🔥1
صفحه بندی داده دادهها: Limit/Offset و Cursor-Based
وقتی صحبت از نمایش حجم زیادی از دادهها در صفحات مختلف میشه، استفاده از pagination ضروری میشه. دو روش رایج برای این کار وجود داره که هر کدوم سادگیها و چالشهای خاص خودشون رو دارن:
صفحه بندی با Limit و Offset سادگی ولی ...
صفحه بندی با Limit و Offset رو میشه سادهترین و اولین روشی دونست که به ذهن میرسه. شما به دیتابیس میگید "فقط Limit تا رکورد بهم بده" و "از Offset مشخصی شروع کن".
سادگی:
پیادهسازی خیلی آسونی داره.
برای صفحات اول که تعداد رکوردها کمه، عملکرد خوبی داره.
چالشها:
عملکرد ضعیف در صفحات بالا: با افزایش
مشکل تغییر دادهها: اگه در حین حرکت بین صفحات، دادهای اضافه یا حذف بشه، ممکنه رکوردهای تکراری ببینید یا بعضی از رکوردها رو از دست بدید.
مرتبسازی (Sorting): معمولاً نیازمند مرتبسازی روی یک فیلد ثابت هستید تا نتیجه قابل پیشبینی باشه.
مثال ساده (SQL):
برای گرفتن ۱۰ رکورد اول از جدول
برای گرفتن ۱۰ رکورد بعدی (صفحه ۲):
صفحه بندی با روش Cursor-Based Pagination: راه حلی برای مقیاسپذیری
صفحه بندی با Cursor-based pagination با استفاده از یک "نشانگر" (cursor) که معمولاً یک فیلد یکتا و مرتبسازی شده (مثل تاریخ ایجاد یا ID) هست، صفحه بعدی رو مشخص میکنه. به جای گفتن "صفحه N رو بیار"، میگیم "رکوردها رو از بعد از این نقطه مشخص بیار".
محدودیتها و نکتهها:
پیچیدگی پیادهسازی: نسبت به Limit/Offset کمی پیچیدهتره و نیازمند طراحی دقیقتر کوئریهاست.
مرتبسازی: باید همیشه بر اساس فیلد Cursor مرتبسازی انجام بشه. این یعنی نمیتونید هر جور دلتون خواست دادهها رو مرتب کنید.
پرش به صفحات دلخواه: معمولاً قابلیت "پرش به صفحه 5" رو نداره و فقط میتونید به صفحه بعدی یا قبلی برید (Next/Previous). مناسب برای فیدها و لیستهای طولانی: برای سیستمهایی مثل فید شبکههای اجتماعی که فقط به اسکرول کردن ادامه دار نیاز دارن و پرش به صفحه خاصی مطرح نیست، عالی عمل میکنه.
مثال ساده (SQL):
فرض کنید آخرین
#pagination #sql
@Syntax_fa
وقتی صحبت از نمایش حجم زیادی از دادهها در صفحات مختلف میشه، استفاده از pagination ضروری میشه. دو روش رایج برای این کار وجود داره که هر کدوم سادگیها و چالشهای خاص خودشون رو دارن:
صفحه بندی با Limit و Offset سادگی ولی ...
صفحه بندی با Limit و Offset رو میشه سادهترین و اولین روشی دونست که به ذهن میرسه. شما به دیتابیس میگید "فقط Limit تا رکورد بهم بده" و "از Offset مشخصی شروع کن".
سادگی:
پیادهسازی خیلی آسونی داره.
برای صفحات اول که تعداد رکوردها کمه، عملکرد خوبی داره.
چالشها:
عملکرد ضعیف در صفحات بالا: با افزایش
Offset، دیتابیس مجبور میشه تعداد زیادی از رکوردها رو اسکن کنه و بعد اونا رو دور بندازه که باعث کندی شدید میشه.مشکل تغییر دادهها: اگه در حین حرکت بین صفحات، دادهای اضافه یا حذف بشه، ممکنه رکوردهای تکراری ببینید یا بعضی از رکوردها رو از دست بدید.
مرتبسازی (Sorting): معمولاً نیازمند مرتبسازی روی یک فیلد ثابت هستید تا نتیجه قابل پیشبینی باشه.
مثال ساده (SQL):
برای گرفتن ۱۰ رکورد اول از جدول
products (صفحه ۱):SELECT *
FROM products
ORDER BY id
LIMIT 10 OFFSET 0;
برای گرفتن ۱۰ رکورد بعدی (صفحه ۲):
SELECT *
FROM products
ORDER BY id
LIMIT 10 OFFSET 10;
صفحه بندی با روش Cursor-Based Pagination: راه حلی برای مقیاسپذیری
صفحه بندی با Cursor-based pagination با استفاده از یک "نشانگر" (cursor) که معمولاً یک فیلد یکتا و مرتبسازی شده (مثل تاریخ ایجاد یا ID) هست، صفحه بعدی رو مشخص میکنه. به جای گفتن "صفحه N رو بیار"، میگیم "رکوردها رو از بعد از این نقطه مشخص بیار".
محدودیتها و نکتهها:
پیچیدگی پیادهسازی: نسبت به Limit/Offset کمی پیچیدهتره و نیازمند طراحی دقیقتر کوئریهاست.
مرتبسازی: باید همیشه بر اساس فیلد Cursor مرتبسازی انجام بشه. این یعنی نمیتونید هر جور دلتون خواست دادهها رو مرتب کنید.
پرش به صفحات دلخواه: معمولاً قابلیت "پرش به صفحه 5" رو نداره و فقط میتونید به صفحه بعدی یا قبلی برید (Next/Previous). مناسب برای فیدها و لیستهای طولانی: برای سیستمهایی مثل فید شبکههای اجتماعی که فقط به اسکرول کردن ادامه دار نیاز دارن و پرش به صفحه خاصی مطرح نیست، عالی عمل میکنه.
مثال ساده (SQL):
فرض کنید آخرین
id محصولی که در صفحه قبلی دیدهاید 1234 بوده:SELECT *
FROM products
WHERE id > 1234
ORDER BY id
LIMIT 10;
#pagination #sql
@Syntax_fa
👍10❤2😁1
در ردیس وقتی ttl یک کلید رو میگیریم، اگه کلید وجود نداشته باشه مقدار بازگشتی:
Anonymous Quiz
22%
مساوی با 0 هستش
44%
مساوی با null هستش
10%
مساوی با -2 هستش
24%
مساوی با -1 هستش
👍5👎1👏1
اگه حس میکنی توی زندگی گم شدی، شاید به این خاطره که داری از نقشه یه نفر دیگه استفاده میکنی!
خیلی از ما ناخودآگاه دنبال راه و رسم بقیه میریم؛ مثلا چون آقای X کارش گرفته و ایده خانم Y ترکیده، ما هم با تقلید همون راه رو میریم!!!
یه چنل یوتیوب بزنم مثل فلانی ... یه پیج اینستاگرام بزنم مثل بمانی ... پایه ای پادکست بزنیم پول پارو کنیم؟ حاجی ترید مثل آب خوردنه بزنیم تو کارش؟
این وسط یه سوال مهم فراموش میشه! ما واقعا مناسب این کارها هستیم؟ روحیاتمون و شرایط خانوادگیمون این اجازه رو میده؟
اکثر این نقشهها مال بقیه ست و مخصوص خودشونه. اگه بخوای راه خودت رو پیدا کنی، باید بشینی و ببینی با توجه به وضعیتت چه چیزی مناسبته!
این روزها همه دارن یوتیوبر میشن ولی قطعا بالای 90 درصدشون شکست میخورن. دلیل؟ تولیدمحتوای ویدیویی در یک بازه زمانی طولانی کار هرکسی نیست و با شرایط زندگی همه آدمها جور در نمیاد.
بهتره بریم سراغ ارزشهای غیرتحمیلی! چیزی که حاصل عشق و تفکر خودمونه نه تحمیل جامعه و سوشال مدیا ...
کولهبار شکستهامون رو با رفتارهای هیجانی سنگینتر نکنیم.
کانال منبع:
source
@Syntax_fa
خیلی از ما ناخودآگاه دنبال راه و رسم بقیه میریم؛ مثلا چون آقای X کارش گرفته و ایده خانم Y ترکیده، ما هم با تقلید همون راه رو میریم!!!
یه چنل یوتیوب بزنم مثل فلانی ... یه پیج اینستاگرام بزنم مثل بمانی ... پایه ای پادکست بزنیم پول پارو کنیم؟ حاجی ترید مثل آب خوردنه بزنیم تو کارش؟
این وسط یه سوال مهم فراموش میشه! ما واقعا مناسب این کارها هستیم؟ روحیاتمون و شرایط خانوادگیمون این اجازه رو میده؟
اکثر این نقشهها مال بقیه ست و مخصوص خودشونه. اگه بخوای راه خودت رو پیدا کنی، باید بشینی و ببینی با توجه به وضعیتت چه چیزی مناسبته!
این روزها همه دارن یوتیوبر میشن ولی قطعا بالای 90 درصدشون شکست میخورن. دلیل؟ تولیدمحتوای ویدیویی در یک بازه زمانی طولانی کار هرکسی نیست و با شرایط زندگی همه آدمها جور در نمیاد.
بهتره بریم سراغ ارزشهای غیرتحمیلی! چیزی که حاصل عشق و تفکر خودمونه نه تحمیل جامعه و سوشال مدیا ...
کولهبار شکستهامون رو با رفتارهای هیجانی سنگینتر نکنیم.
کانال منبع:
source
@Syntax_fa
👍23❤3