Традиційні посередники повідомлень та потокові дані


14

За даними сайту Kafka :

" Kakfa використовується для побудови конвеєрів даних у режимі реального часу та потокових програм. "

Шукаючи в Інтернеті далеко і широко, я знайшов таке загальновизнане визначення, що таке " потокові дані ":

  • Дані потоку - це дані, що безперервно надходять від джерела до місця призначення через мережу; і
  • Дані потоку не мають атомної природи, тобто будь-яка частина потоку потоку даних є осмисленою та оброблюваною, на відміну від файлу, байти якого нічого не означають, якщо у вас їх немає; і
  • Дані потоку можна запускати / зупиняти в будь-який час; і
  • Споживачі можуть за бажанням приєднувати та відлучати від потоку даних та обробляти лише ті частини, які вони хочуть

Тепер, якщо щось, про що я говорив вище, є невірним, неповним або абсолютно неправильним, почніть, виправляючи мене! Якщо припустити, що я більш-менш на шляху, то ...

Тепер, коли я розумію, що таке "потокова передача даних", то я розумію, що означають Кафка та Кінесіс, коли вони рахують себе як обробка / посередництво проміжного програмного забезпечення для програм із потоковими даними. Але це викликало мої інтереси: чи можна / слід "передавати проміжне програмне забезпечення" на зразок Kafka або Kinesis для неперетікання даних, як традиційні брокери повідомлень? І навпаки: чи можна / повинні традиційні MQ, такі як RabbitMQ, ActiveMQ, Apollo тощо, використовуватися для потокової передачі даних?

Візьмемо приклад, коли додаток надсилатиме постійний запуск резервного повідомлення JSON-повідомлень, які потрібно обробити, а обробка є досить складною (перевірка, перетворення даних, фільтрація, агрегація тощо):

  • Справа №1: повідомлення - це кожен кадр фільму; це одна помилка JSON на відеокадр, що містить дані кадру та деякі підтримуючі метадані
  • Випадок №2: Повідомлення - це дані часових рядів, можливо, чиєсь серцебиття як функція часу. Отже, повідомлення №1 надсилається, що відображає моє серцебиття при t = 1, повідомлення №2 містить моє серцебиття при t = 2 і т.д.
  • Випадок №3: Дані є абсолютно розрізненими та не пов'язаними з часом або як частина будь-якого "потоку даних". Можливо, події аудиту / безпеки, які звільняються, коли сотні користувачів орієнтуються на додаток, натискаючи кнопки та вживаючи заходів

Виходячи з того, як проводиться облік рахунків Kafka / Kinesis та на моєму розумінні, що таке "потокова передача даних", вони здаються очевидними кандидатами у випадках №1 (суміжні відеодані) та №2 (суміжні дані часових рядів). Однак я не бачу жодної причини, чому традиційний брокер повідомлень, як RabbitMQ, не міг ефективно обробляти обидва ці входи.

А у випадку №3 нам надається лише подія, яка сталася, і нам потрібно обробити реакцію на цю подію. Тож для мене це говорить про необхідність використання традиційного брокера, такого як RabbitMQ. Але також немає жодних причин, через які ви не змогли б також Кафка або Кінесіс обробляти обробку даних про події.

Отже, я прагну створити рубрику, яка говорить: У мене є дані X з характеристиками Y. Я повинен використовувати потоковий процесор, як Kafka / Kinesis, щоб обробити його. Або, навпаки, той, який допомагає мені визначити: у мене є дані W із Z-характеристиками. Я повинен використовувати традиційного брокера повідомлень, щоб обробити його.

Тому я запитую: Які фактори щодо даних (або іншим чином) допомагають керувати рішенням між процесором потоку або брокером повідомлень, оскільки обидва можуть обробляти потокові дані, і обидва можуть обробляти (не потокові) дані повідомлень?

Відповіді:


6

Кафка займається упорядкованими журналами атомних повідомлень. Ви можете переглядати його на зразок pub/subрежиму посередників повідомлень, але з чітким упорядкуванням і можливістю відтворення або пошуку навколо потоку повідомлень у будь-який момент минулого, який все ще зберігається на диску (що може бути назавжди).

Аромат Kafka в потоковому режимі стоїть на противагу віддаленим процедурним викликам, як Thrift або HTTP, і пакетній обробці, як в екосистемі Hadoop. На відміну від RPC, компоненти спілкуються асинхронно: можуть проходити години або дні між тим, коли повідомлення надсилається, і коли одержувач прокидається і діє на нього. У різні моменти часу одержувачів може бути багато, а може, ніхто і ніколи не потрудиться спожити повідомлення. Кілька виробників можуть виробляти одну і ту ж тему без відома споживачів. Кафка не знає, підписалися ви, чи повідомлення було використано. Повідомлення просто передається в журнал, де будь-яка зацікавлена ​​сторона може його прочитати.

На відміну від пакетної обробки, вас цікавлять окремі повідомлення, а не просто гігантські колекції повідомлень. (Хоча це не рідкість, щоб архівувати повідомлення Kafka у паркетні файли на HDFS та запитувати їх як таблиці вуликів).

Випадок 1 : Кафка не зберігає особливих часових відносин між виробником і споживачем. Це погана придатність для потокового відео, тому що Kafka дозволено сповільнювати, прискорювати, рухатися приступами та ін. Для потокового носія ми хочемо торгувати загальною пропускною здатністю в обмін на низьку і, що ще важливіше, стабільну затримку (інакше відомий як низький тремтіння). Кафка також бере великі болі, щоб ніколи не втрачати повідомлення. За допомогою потокового відео ми зазвичай використовуємо UDP і вміщуємося скидати кадр тут і там, щоб тримати відео. Загальноосвітня література у процесі, що підтримується Кафкою, зазвичай - від секунди до здорової, від годин до днів, коли вона здорова. SLA на потоковому носії становить десятки мілісекунд.

Netflix може використовувати Kafka для переміщення кадрів у внутрішній системі, яка перекодує терабайти відео на годину і зберігає їх на диску, але не пересилає їх на ваш екран.

Випадок 2 : Абсолютно. Ми використовуємо Кафку таким чином у мого роботодавця.

Випадок 3 : Ви можете використовувати Кафку для подібних речей, і ми, але ви платите непотрібні накладні витрати, щоб зберегти замовлення. Оскільки вам не байдуже замовлення, ви, можливо, могли би вичавити ще одну продуктивність із іншої системи. Якщо ваша компанія вже підтримує кластер Kafka, хоча, ймовірно, найкраще повторно використовувати його, а не взяти на себе тягар підтримки іншої системи обміну повідомленнями.


1
Дякую @closeparen (+1) - я отримую більшість того, що ви говорите, за одним великим винятком. У вашому абзаці, що починається з речення " Аромат Кафки в потоковому режимі стоїть протилежним ... ", я схильний думати, що міг би замінити більшість екземплярів слова "Кафка" на "Кролик", і вирок буде справедливим. Для RabbitMQ: виробники можуть надіслати повідомлення, і споживач відкине його та обробить його години / дні. Споживачі можуть приєднатися до черги в будь-який час, і тому у RabbitMQ може бути багато різних одержувачів у різні моменти часу.
smeeb

1
Подумайте про Кафку як про двигун бази даних із своєрідною структурою, орієнтованою на журнал. Виробники додають, споживачі читають. Читання жодним чином не впливає на стан Кафки. Споживач може підтримувати курсор, що збільшується, для створення семантики, ідентичної пабі / sub RabbitMQ, і це звичайний випадок використання, але це не єдиний випадок використання.
closeparen

1
Подумайте про RabbitMQ як розподілену версію структури даних черги пам'яті. Як тільки ви вискакуєте щось із черги, воно вже не стоїть на черзі. Зрозуміло, у вас може бути топологія, де вона копіюється на інші черги на користь інших споживачів, але ви, як правило, не зможете сказати "дайте мені повідомлення, яке я обробляв 500 повідомлень тому" або "запускайте чергу B як копію" черги A, звідки в черзі A була вчора ".
closeparen

2
Система на основі Кафки прощає. Якщо вам не подобається, як поводилася ваша програма, ви можете натиснути зміну коду, а потім перемотати його введення. Ви можете зупинити споживача RabbitMQ, не впливаючи на виробників, але ви не зможете переглянути минуле.
closeparen

1
Аааа: лампочка: спасибі (+1 для всіх 3)! Тож це безумовно вагомий випадок для Кафки: здатність переглянути минуле. Я припускаю, що має бути якась верхня межа або усікання, що відбувається? Інакше пам’ять Кафки завжди буде просто підніматися вгору. Навіть якщо дані перекидаються на диск, файли, де зберігаються дані теми, дуже швидко заповнять диск, так?
smeeb

6

Kafka / Kinesis моделюється як потік. Потік має інші властивості, ніж повідомлення.

  • Потоки мають для них контекст. Вони мають порядок. Ви можете застосувати функції вікон до потоків. Хоча кожен елемент у потоці є значущим, він може мати більше значення з контекстом навколо нього
  • Оскільки потоки мають порядок, ви можете використовувати це для того, щоб робити певні твердження про семантику обробки. Наприклад, тризуб Apache нібито має рівно семантику при споживанні з потоку Kafka.
  • Ви можете застосувати функції до потоків. Ви можете трансформувати потік, фактично не споживаючи його. Можна ліниво споживати потік. Ви можете пропустити частини потоку.
  • Ви можете відтворювати потоки в Kafka, але ви не можете (без додаткового програмного забезпечення) відтворювати черги повідомлень. Це корисно, коли ви навіть не знаєте, що ще хочете зробити з даними. Це також корисно для тренування ШІ.

Як правило, використовуйте Kafka для обробки потоку в режимі офлайн, використовуйте черги повідомлень для повідомлень клієнта-сервера в реальному часі.

Приклад використання випадків з основного :

Kafka: Відстеження активності веб-сайтів, метрики, агрегація журналів, обробка потоків, пошук подій та журнали фіксації

RabbitMQ: обмін повідомленнями загального призначення ..., часто використовується для того, щоб веб-сервери могли швидко відповідати на запити, а не змушувати їх виконувати важкі для ресурсів процедури, поки користувач чекає результату. Використовуйте, коли вам потрібно використовувати існуючі протоколи, такі як AMQP 0-9-1, STOMP, MQTT, AMQP 1.0

Іноді може бути корисним використання обох! Наприклад, у Use Case # 2, якби це був потік даних з пейдмейкера, скажімо, я мав би виробник темпу передавати дані про серцебиття до черги повідомлень RabbitMQ (використовуючи класний протокол, як MQTT), де він негайно обробляється подивіться, чи все ще б’ється серце джерела. Це може призвести до роботи приладової панелі та системи надзвичайних ситуацій. Черга повідомлень також передасть дані часового ряду в Kafka, щоб ми могли аналізувати дані серцебиття з часом. Наприклад, ми можемо реалізувати алгоритм виявлення серцевих захворювань, помітивши тенденції в потоці серцебиття.


1
Дякуємо @Samuel (+1) - це чудова відповідь і допомагає поставити речі в контекст трохи краще. Насправді у мене є кілька запитувальних питань для вас (якщо ви не заперечуєте), але всі вони залежать від одного початкового уточнення, яке мені потрібно: коли ви говорите " Ви можете застосувати функції до потоків. Ви можете трансформувати потік. фактично не споживаючи його ... ", чи виконуються ті функції / перетворення на Kafka , чи їх потрібно спочатку споживати перед обробкою потоків за допомогою функцій / перетворень?
smeeb

1
Значення, у вас є KafkaProducer, Kafkaі KafkaConsumer. Скажімо, KafkaProducerіснує всередині Java-програми, і KafkaConsumerце працює в якомусь додатку / сервісі Ruby. KafkaProducerпосилає Message1Кафку, яку потрібно перетворити через Function1. Де Function1живе код? У Kafka (належним чином) або всередині KafkaConsumerдодатка Ruby?
smeeb

2
Ви не можете виконувати функції або виконувати будь-яку обробку в самій Kafka. Apache Spark Streaming та Apache Storm - це два розподілені потокові рамки обробки, які можуть споживати Kafka. Вони бігають за межами Кафки і підключаються до неї так, ніби це база даних. Каркаси розкривають такі корисні функції, як розщеплення, агрегація, відкривання вікон тощо. Ви можете реалізувати основні функції у свого споживача Ruby, але я дуже рекомендую одну з фреймворків. spark.apache.org/streaming storm.apache.org/releases/2.0.0-SNAPSHOT/Trident-tutorial.html
Самуїл

1
Добре, спасибі та ще раз +1 - це було б чудово, хоча якби Кафка могла б обробити самі потоки! Отже, щоб грати в захисника диявола, чи не могли б ви просто споживача RabbitMQ знищити повідомлення з черги, агрегувати їх на основі часової позначки (або насправді будь-яких інших критеріїв / атрибутів) та виконувати те саме вікно та перетворювати функції на дані, що Spark Потік чи Шторм забезпечують?
smeeb

1
Так, я думаю, ви могли б зробити це з RabbitMQ, оскільки RabbitMQ має гарантії щодо замовлення повідомлень. Можливо, ви не зможете це зробити з кожною чергою повідомлень. І це було б складно будувати. Наприклад, якщо ваш споживач RabbitMQ, який агрегує, виходить з ладу? З Кафкою ви можете відслідковувати, куди в потоці, який ви обробляли, щоб ви могли запустити свого споживача в момент, який ви зупинили
Самуель
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.