چرا کافکا سریع هست؟

در پاسخ به این سوال باید به یک سوالی دیگر پاسخ دهیم و آنهم این است که سریع بودن از نگاه سیستم به چه معناست؟.در جواب باید گفت که سریع بودن به دو مفهوم تاخیر یاlatency و throughput یا همان توان عملیاتی درانتقال دیتا در یک حجم مشخص، بیشتر اشاره دارد.کافکا طوری طراحی شده تا بتواند تعداد زیادی رکورد را در زمان کوتاه جابجا کند که این کار نشانگر توان عملیاتی بالای آن دارد.یک لوله بزرگ را در نظر بگیرید. هرچه قطر این لوله بیشتر باشد، مایعی که میتواند در این لوله حرکت کند بیشتر میشود. بنابراین سریع بودن کافکا در جابجایی موثر داده هایش هست. حال این چطور اتفاق می افتد.دو مورد در بین مواردی که باعث جابجایی موثر داده ها میشود، تاثیر بیشتری دارد که این دو مورد عبارت است از:· Sequential I/O· Efficiencyورودی و خروجی متوالی یا Sequential I/Oاولین مورد ، تکیه کافکا به ورودی و خروجی متوالی است( خاصیت sequential در کافکا).یک تصور غلط این است که دسترسی به هارد دیسک در مقایسه با دسترسی به memory یا همان حافظه رم سریع تر است، در صورتی که این درست نیست و این مورد به الگوی دسترسی (access pattern )به data بستگی دارد.ما دو نوع الگوی دسترسی به دیسک را داریم :1- تصادفی یا random2- ترتیبی یا sequentialروی هارد دیسک برای خواندن data یک بازوی مکانیکی وجود دارد که برای خواندن data از قسمت های مختلف دیسک مورد استفاده قرار میگیرد و هرچقدر خواندن تصادفی data بیشتر شود این کار زمان بیشتری هم میطلبد که نتیجه این میشود که دسترسی به data کند میشود.اما در دسترسی متوالی یا sequential چون بازوی مکانیکی نیازی به پریدن از یک نقطه به نقطه ی دیگر را ندارد باعث میشود تا خواندن و نوشتن بلاک های data سریع تر انجام شود. کافکا با استفاده از یک append-only log بعنوان data structure اصلی خودش از این مزیت استفاده میکند. در واقع از این روش استفاده میکند تا بتواند یک دیتای جدید را به آخر یک فایل اضافه کند. این یک الگوی دسترسی از نوع sequential است.اگر یک لیستی از این هارد دیسکها را داشته باشیم و آنها را به صورت آرایه ای از یک دیسک ایجاد کنیم ( مثلا RAID ) کنیم، آنگاه خواهیم دید که نوشتن به صورت sequential به صدها مگابایت در ثانیه میرسد در حالی که نوشتن به صورت random روی دیسک به چند صد کیلو بایت خواهد رسید.بنابراین sequential access چندین برابر سریع تر از random access (در این مثال ) است.این تکنیکی که کافکا استفاده میکند جدای اینکه توان عملیاتی را افزایش میدهد، مزیتهای دیگری از جمله کاهش هزینه را در بر دارد چون از دیسکهای ارزان قیمت HDD میتوانیم استفاده کنیم که در این صورت در مقایسه با SSD ها استفاده از HDD ها باعث میشود که از ظرفیت بیشتری با هزینه کمتر استفاده کنیم بدون اینکه هیچ کاهش performance داشته باشیم که این یعنی کافکا میتواند به صورت موثر پیام هارا برای مدت طولانی هم ذخیره و نگهداری کند که این ویژگی کافکا برای سیستم های messaging مفید است.کارایی یا Efficiencyدومین مورد طراحی کافکا که باعث میشود کارایی بیشتری داشته باشیم ، efficiency هست. اما چطور؟کافکا data زیادی را از قسمت های مختلف کارت شبکه میگیرد و بر روی دیسک میگذارد و سپس از روی دیسک میگیرد و به شبکه میفرستد. درنگاهی عمیق تر، این data برای تبادل در درون سیستم ، چندین بار توسط فرایند paging کپی میشود که این کپی ها روی عملکرد سیستم تاثیر میگذارند. بنابراین حذف کپی های اضافه ی dataبین دیسک و شبکه بسیار میتواند به این موضوع تاثیر بگذارد.اینجاست که اصل zero copy وارد عمل میشود.Read without zero copy VS Read with zero copyسیستم های مدرن یونیکسی برای انتقال data از یک دیسک به شبکه در سطوح کوچکتر یعنی برای نقل و انتقال data کمتر بهینه شدند.برای اینکه این اصل zero copy را بهتر درک کنیم ابتدا نگاهی می اندازیم که کافکا چطور یک کپی از data را از روی هارد دیسک برای consumer می فرستد درصورتی که اگر از اصل zero copy استفاده نکند :1- ابتدا data از سمت producer به بافر اپلیکیشن ارسال میشود.2- اپلیکیشن، data را در داخل OS cache ذخیره میکند.3- سپسdata از روی OS cache روی هارد دیسک sync میشود.4- سپس data از روی دیسک برروی OS cache لود میشود.5-بعد data از روی os cache روی بافر برنامه که در اینجا کافکا هست کپی میشود6-سپس data از روی کافکا روی socket buffer کپی میشود.7- سپسdata از socket buffer به NIC buffer ارسال میشود.8-درنهایت data از طریق بافر کارت شبکه به سمت consumer ارسال میشود.باتوجه به موارد بالا میبینیم که زمانی که از اصل zero copy استفاده نکنیم، چقدر فرآیند انتقال ناکارآمد خواهد شد. چرا که در این مثال چهار کپی و دوبار system call داشتیم.اما حالا نگاهی بیاندازیم به زمانی که کافکا از zero copy بخواهد استفاده کند.1- ابتدا data از سمت producer به بافر اپلیکیشن ارسال میشود.2- اپلیکیشن data را در داخل OS Cache ذخیره میکند.3- در این مرحله و بواسطه zero copy کافکا از یک فراخوانی سیستمی به نام ( )sendfile استفاده میکند. تا به سیستم عامل بگوید که data را مستقیما از OS cache به سمت NIC Buffer ارسال کند. روی کارت های شبکه امروزی این کپی کردن با DMA انجام میشود.( DMA=Direct Memory Access ) وقتی از DMA استفاده شود، CPU درگیر نمیشود و باعث کارآمدی کافکا و Node های آن میشود.بنابراین دو مورد Sequential I/O و Zero Copy سنگ بنای عملکرد بالای کافکا هستند. البته کافکا از تکنیک های دیگری هم استفاده میکند تا عملکردش را افزایش دهد اما این دوتکنیک از همه مهم تر هستند.