Apache Kafka یک سیستم ذخیرهسازی داده توزیعشده برای دریافت و پردازش دادههای جریانی بیدرنگ است. دادههای جریانی، دادههایی هستند که هزاران منبع مدام آن ها را تولید کرده و معمولاً رکوردهای داده بهصورت همزمان ارسال میشوند. نقش پلتفرم جریانی، مدیریت مداوم دادهها و پردازش ترتیبی و افزایشی آنهاست.
Kafka سه عملکرد اصلی برای کاربران خود فراهم میکند:
- انتشار و اشتراکگذاری جریانات رکوردها
- ذخیره جریانات رکوردها به ترتیب تولید آنها
- پردازش بی درنگ جریانات رکوردها
در اصل Kafka برای تولید خطوط داده جریانی بیدرنگ و برنامههایی که به این جریانات پاسخ میدهند، استفاده میشود. این سیستم، ذخیرهسازی و پردازش جریانی را ترکیب میکند تا امکان ذخیره و تحلیل دادههای تاریخی و بیدرنگ را فراهم کند.
موارد استفاده
Kafka برای ساخت خطوط داده جریانی بیدرنگ و برنامههای جریانی بیدرنگ استفاده میشود. یک خط لوله داده، دادهها را از یک سیستم به سیستم دیگر پردازش و منتقل میکند و یک برنامه جریانی، جریانات داده را مصرف میکند. بهعنوان مثال، اگر بخواهیم یک خط لوله داده ایجاد کنیم که دادههای بی درنگ فعالیت کاربران را برای پیگیری نحوه استفاده افراد از وبسایت دریافت کند، از Kafka برای دریافت و ذخیره دادههای جریانی در حین ارائه خوانشها برای برنامههای تأمینکننده خط لوله داده استفاده میشود. Kafka همچنین بهعنوان یک واسط پیام استفاده میشود که پلتفرمی است که ارتباطات بین دو برنامه را پردازش و میانجیگری میکند.
طرز کار Kafka
Kafka دو مدل پیامرسانی، یعنی صفبندی و انتشار-اشتراک را ترکیب میکند تا مزایای کلیدی هر یک را برای مصرفکنندگانش فراهم کند. صفبندی پردازش دادهها را در نمونههای زیادی از مصرفکنندگان ممکن میکند که عامل مقیاسپذیری بالاتر است. بااینحال، صفبندیهای قدیمی چندکاربره نیستند. روش انتشار-اشتراک چندکاربره است، اما ازآنجاکه هر پیام به هر مشترک ارسال میشود، نمیتوان از آن برای توزیع کار بین چندین فرآیند کاری متفاوت استفاده کرد. Kafka از مدل لاگ تقسیمشده برای ترکیب این دو راهحل استفاده میکند. لاگ یک توالی مرتب از رکوردها است و این لاگها به بخشها یا تقسیمبندیهایی تقسیم میشوند که به مشترکین مختلف مربوط میشوند. این بدان معناست که برای یک موضوع چندین مشترک می توانند وجود داشته باشد و هر یک به بخش جدایی اختصاص داده میشود تا مقیاسپذیری بالاتری فراهم شود. در نهایت، مدل Kafka قابلیت پخش مجدد را فراهم میکند که به چندین برنامه مستقل اجازه میدهد تا از جریانات داده خوانده و بهطور مستقل و با سرعت کار کنند.
مزایای Kafka
- مقیاسپذیری: مدل لاگ تقسیمشده Kafka امکان توزیع دادهها در بین چندین سرور را ایجاد میکند که منجر به مقیاسپذیری بیشتری نسبت به یک سرور واحد می شود.
- سرعت: با جداکردن جریانات داده، تأخیر بسیار کمتر و سرعت بالا میرود.
- دوام: بخشها در بین چندین سرور توزیع و تکرار شده و تمام دادهها بر روی دیسک ذخیره میشوند. به این شکل، از سرور در برابر خرابی محافظت شده و دادهها مقاوم و بادوام میشوند.
ادغام مدلهای مختلف در ساختار Kafka
Kafka با انتشار رکوردها در موضوعات مختلف، این دو مدل پیامرسانی را بهبود میبخشد. هر موضوع یک لاگ تقسیمشده دارد که در واقع یک لاگ ساختاریافته است و تمام رکوردها را مرتب پیگیری کرده و رکوردهای جدید بی درنگ را بهصورت به آن اضافه میکند. این بخشها در بین چندین سرور توزیع و تکرار میشوند که مقیاسپذیری بالا، تحمل خطا و موازیسازی ایجاد میکند. هر مصرفکننده به یک بخش در موضوع اختصاص داده میشود که چندکاربره بودن را در حین حفظ ترتیب دادهها ممکن میکند. بهاینترتیب، در ترکیب این مدلهای پیامرسانی، Kafka مزایای هر دو را شامل میشود. Kafka همچنین بهعنوان یک سیستم ذخیرهسازی بسیار مقیاسپذیر و مقاوم با نوشتن و تکرار تمام دادهها روی دیسک عمل میکند. Kafka دادهها را روی دیسک تاحدامکان ذخیره میکند و به کاربر هم امکان تنظیم محدودیت نگهداری را میدهد .Kafka دارای چهار API است:
- API تولیدکننده: برای انتشار جریانی از رکوردها به یک موضوع Kafka استفاده میشود.
- API مصرفکننده: برای اشتراکگذاری موضوعات و پردازش جریانات رکوردهای آنها استفاده میشود.
- API جریانات: به برنامهها اجازه میدهد تا بهعنوان پردازشگران جریانی عمل کنند به شکلی که یک جریانی ورودی از موضوعات را دریافت کرده و آن را به جریانی خروجی تبدیل میکند.
- API اتصالدهنده: به کاربران این امکان را میدهد که افزودن یک برنامه یا سیستم داده دیگر به موضوعات فعلی Kafka خود را اتومات کنند.
تفاوتهای Apache Kafka و RabbitMQ
RabbitMQ یک کارگزار پیام متنباز است که از رویکرد صفبندی پیام استفاده میکند. صفها در بین یک خوشه از گرهها توزیع میشوند و به شیوه ای اختیاری تکرار میشوند، بهطوری که هر پیام فقط به یک مصرفکننده ارائه میشود.
ویژگیها | Apache Kafka | RabbitMQ |
ساختار | Kafka از مدل لاگ تقسیمشده استفاده میکند که رویکردهای صفبندی پیام و انتشار-اشتراک را ترکیب میکند. |
RabbitMQ از صفبندی پیام استفاده میکند. |
مقیاسپذیری | Kafka با اجازه توزیع بخشها در بین سرورهای مختلف، مقیاسپذیری را فراهم میکند. |
با افزایش تعداد مصرفکنندگان در صف، پردازش در بین مصرفکنندگان رقابتیتر میشود. |
نگهداری پیام | بر اساس سیاست: پیامها ممکن است یک روزه ذخیره شوند. کاربر میتواند این پنجره نگهداری را تنظیم کند. |
بر اساس تأیید: پیامها بهمحض مصرفشدن حذف میشوند. |
چندین مصرفکننده | چندین مصرفکننده میتوانند در یک موضوع خاص شریک شوند، چون Kafka اجازه میدهد پیام یکسانی برای یک بازه زمانی خاص پخش شود. |
چندین مصرفکننده نمیتوانند همه پیام یکسانی دریافت کنند چون پیامها بهمحض مصرفشدن حذف میشوند. |
تکرار | موضوعات خودکار تکرار میشوند، اما کاربر هم میتواند بهصورت دستی موضوعات را تنظیم کنند تا تکرار نشوند. |
پیامها خودکار تکرار نمیشوند، اما کاربر میتواند بهصورت دستی آنها را برای تکرارشدن تنظیم کند. |
ترتیب پیام | هر مصرفکننده اطلاعات را با لاگ تقسیم شده به ترتیب دریافت میکند. | پیامها به مصرفکنندگان به ترتیب ورود به صف تحویل داده میشوند. اگر مصرفکنندگان رقابتی وجود داشته باشند، هر مصرفکننده یک زیرمجموعه از آن پیام را پردازش خواهد کرد. |
پروتکلها | Kafka از یک پروتکل باینری روی TCP استفاده میکند. |
استفاده از پروتکل صف پیام پیشرفته (AMQP) با پشتیبانی از طریق افزونهها: MQTT STOMP |