توسعه و مانیتور برنامهها با معماری یکپارچه سنتی ساده است اما وقتی مقیاس برنامهها بزرگ میشود توسعه و نوآوری در اینگونه پلتفرمها چالشبرانگیز خواهد بود. به همین دلیل اکثر برنامهها و پلتفرمهای نرمافزاری امروزه با معماری میکروسرویس توسعه داده میشوند. معماری میکروسرویس با بهرهگیری از پیادهسازی مولفهای، بسیاری از این چالشها را حل میکند. مولفهها یا همان سرویسها به صورت مستقل و کوچک طراحی و توسعه داده میشوند و هرکدام شامل واسطهای خاصی هستند که برای یک عملکرد خاص پیادهسازی شدهاند.
با توجه به این معماری مولفهای، خطایابی در اینگونه سیستمها چالشهای زیادی دارد، زیرا سرویسها به صورت توزیعشده اجرا میشوند و هر درخواست شامل یک توالی از فراخوانی APIهای مختلف از سرویسهای مختلف میباشد. Distributed Tracing روشی برای بررسی کامل مسیر یک درخواست است که از سمت Frontend به سمت Backend میآید. به طور مثال وقتی یک کاربر در سمت Front بر روی یک دکمه کلیک میکند تا زمانی که درخواستش به Backend و سرویس پایگاهداده میرسد.
سیستم های Distributed Tracing نمای دقیقی از نحوه عملکرد موازی چندین سرویس برای پردازش یک درخواست ارائه می دهند.
یک سیستم Distributed Tracing شامل سه مولفه اصلی زیر است:
Trace: کل مسیر End-To-End یک درخواست کاربر در طی حرکت بین سرویسهای مختلف
Span: هر عملی در طول مسیر Trace را یک Span میگویند که شامل زمان آغاز، زمان پایان و تعدادی متادیتا میباشد.
Context Propagation: انتقال اطلاعات یک درخواست در طول اجرای یک مسیر (شناسههای Trace و Span) بین سرویسهای مختلف
پلتفرمهای Distributed Tracing از زمانی که یک درخواست فرستاده میشود، به طور مثال زمانی که کاربر درخواست خرید خود را ارسال میکند، شروع به جمعآوری دادهها میکنند. این عمل باعث ایجاد یک Trace ID یکتا و یک Span اولیه به نام Span پدر خواهد شد . Trace، کل مسیر اجرای درخواست را نشان میهد و هر Span در طول trace یک واحد کاری مانند فراخوانی یک API، احراز هویت کاربر یا یک کوئری دیتابیسی را نشان میدهد. هر span نیز شامل یک Trace ID و یک Span ID و همچنین مدت زمان اجرای Span و دادههای خطا و متادیتاهای دیگری میشود. با ارزیابی زمان اجرای Span ها میتوان فهمید که کدام سرویس و کدام Span بیشتر طول کشیده و همچنین خطاهای هر Span را نیز میتوان مشاهده و ارزیابی کرد.
این مسیر معمولا با نمودار Flame Graph به صورت زیر نمایش داده میشود. محور افقی این نمودار زمان اجرای هر Span و محور عمودی Call Stack را نمایش میدهد. با توجه به این نمودار میتوان سرویسهای کندتر و همچنین مواردی که باعث کاهش سرعت و کارایی کلی میشوند را مشخص کرد.
یکی از مشکلات رایجی که امروزه در دنیای فناوری دیده میشود استفاده از مفهوم و ابزارهای tracing به جای مانیتورینگ است. در حالی که تمرکز مانیتورینگ بر روی جمعآوری و ثبت متریکهای از پیش تعریفشده است تا سلامت کلی سرویسها بررسی شوند و در صورت رد کردن آستانههای تعریف شده به کاربر اطلاع دهد، تمرکز Tracing بر روی تشخیص آنومالیها و زمان اجرای درخواست در هر سرویس و نحوه ارتباط سرویسهای مختلف باهم است تا بتوان با استفاده از آنها کارایی سرویسها را افزایش داد و همچنین عملیات خطایابی یا دیباگینگ راحت تر شود.
با گسترش نیاز به Tracing روشها و ابزارهایی برای افزودن این امکان به سرویسهای مختلف به صورت سازگار به صورت open-source ارائه شدند:
در انتها به طور خلاصه به بیان مزایا و معایب Distributed Tracing میپردازیم. از مزایای استفاده از Distributed Tracing میتوان به موارد زیر اشاره کرد:
با وجود داشتن این مزایا بهتر است بدانیم که پیادهسازی Distributed Tracing چالشهایی هم دارد:
مراجع