Как да разбера дали Apache Kafka е подходящ за вас

Apache Kafka нарасна много в функционалността и обхвата си през последните няколко години. Използва се в производството на една трета от Fortune 500, включително седем от топ 10 глобални банки, осем от топ 10 застрахователни компании и девет от топ 10 американски телекомуникационни компании [източник].

Тази статия ви дава бърза обиколка на основните функционалности, предлагани от Kafka. Ще представя много примери, за да ви помогна да разберете често срещаните модели на използване. Надяваме се, че ще намерите някаква връзка със собствените си работни процеси, за да можете да започнете да използвате силата на Kafka. Нека започнем с разглеждане на две основни функционалности, предлагани от Kafka.

1. Kafka като система за съобщения

Съобщенията се използват широко по два начина:

  • Опашки (SQS, целина и т.н.): Потребителите от опашката действат като работна група. Всяко съобщение отива само до един от процесите на работника, като ефективно разделя работата.
  • Публикуване-Абониране (SNS, PubNub и т.н.): Абонатите обикновено са независими един от друг. Всеки абонат получава копие на всяко съобщение. Той действа като система за уведомяване.

И двете са полезни парадигми. Обръщането на опашки разделя работата и е чудесно за отклонение и мащаб. Publish-Subscribe позволява мулти абонати, които ви позволяват да отделите вашите системи. Красотата на Kafka е, че тя комбинира както опашката, така и публикува-абонирайте парадигми в една единствена здрава система за съобщения.

Горещо препоръчвам да прочетете документацията, която обяснява основния дизайн и как тази комбинация се постига с помощта на теми, дялове и потребителски групи. За да бъдем справедливи, тази функционалност може да бъде постигната и с комбинация RabbitMQ или SNS-SQS.

2. Kafka за обработка на потоци

След като имате здрава, мащабируема система за съобщения, всичко, от което се нуждаете, е лесен начин да обработите потока от съобщения. API на Stream осигурява точно това. Това е клиентска библиотека на Java (сега също Scala), която осигурява абстракция на по-високо ниво от API на производители и потребители.

Улеснява изпълнението:

  • операции без състояние, като филтриране и трансформиране на поточни съобщения
  • състоятелни операции, като например присъединяване и агрегиране през времеви прозорец

API на потока обработва сериализиращата / десериализацията на съобщенията и поддържа състоянието, необходимо за операции със състоянието.

Покажете ми някакъв код

Ето пример за Stream API, който чете обикновен текст във входящия поток, отчита събития на всяка дума и записва броя в изходен поток. Вижте пълната версия тук.

С прозорците е лесно да се агрегира във времеви диапазон и да се следят неща като думи от топ N през този ден (не са демонстрирани тук).

Типични случаи на употреба на Kafka (примери)

  • Представете си, че имате уебсайт за пътуване. Цената на хотелите и полетите продължава да се променя през цялото време. Няколко компонента на вашата система (предупреждения за цени, анализи) трябва да бъдат информирани за тези промени. Вие публикувате промените в темите на Kafka и всеки компонент, който трябва да бъде уведомен, действа като абонат. Всички възли на една абонатна система образуват единна потребителска група. Дадено съобщение се изпраща само до един възел в групата на потребителите. По този начин всеки компонент получава копието на съобщението, плюс работата се разделя ефективно във всеки компонент.
  • Активността на уебсайта (изгледи на страници, търсения или други действия, които потребителите могат да предприемат) може да бъде проследена и анализирана чрез Kafka. Всъщност това беше оригиналният случай на употреба, за който Kafka е изобретен в LinkedIn. Дейностите на уебсайтове се публикуват в централни теми с една тема за тип дейност. Емисия може да бъде обработена в реално време, за да се добие представа за ангажираността на потребителите, отпадащите страни, потоците на страници и т.н.
  • Представете си, че имате данни за местоположението, идващи от GPS маяци или устройства на смартфони, и искате да ги обработите в реално време, за да покажете пътя на превозното средство, изминатото разстояние и т.н. Входящите данни могат да бъдат публикувани по теми на Kafka и да се обработват с Stream API. Състоятелната обработка с прозорци е удобна, когато трябва да извлечете и обработите всички данни за местоположението на даден потребител за определен период от време.

Кога да не използвате Kafka

  • Ако не можете или не искате да се преместите на Java / Scala за услуги, говорещи с клъстер Kafka, тогава ще пропуснете всички абстракции от по-високо ниво, предоставени от Kafka Streams. API на потоците е по същество клиентска библиотека, говореща с клъстера Kafka. В момента Confluent, компанията зад Kafka, е фокусирана върху Java. Популярни езици като Python също имат отворен проблем за поточна поддръжка вече повече от 1,5 години.
  • Ако всичко, от което се нуждаете, е опашка за задачи, помислете вместо RabbitMQ. С Kafka всеки дял може да се консумира само от един потребител. И трябва да решите дяла, докато поставяте задачата на опашката. Така че е възможно потоп от задачи на даден дял да доведе до глад и не можете да направите нищо, тъй като добавянето на потребители не помага.
  • Ако обработвате само няколко хиляди съобщения всеки ден, тогава Kafka вероятно е излишен. Kafka е наистина създаден за работа с мащабна обработка на потоци, така че настройването и поддръжката не си струва, ако нямате / предвиждате мащаб.

Това е всичко приятели. Това обхваща важните неща, които трябва да знаете за Apache Kafka. Ако ви хареса да я четете, следвайте моя блог. Уведомете ме, ако искате да видите преглед на друг инструмент.

Вижте всички публикации от Amit Rathi

Първоначално публикувано на blog.amirathi.com на 3 март 2018 г.