24. What is Apache Kafka ?
1.Distributed publish-subscribe
messaging system
2.Fast, Scalable, Durable
3.Created at LinkedIn, is now an Apache
project
4.confluent.io 24
49. Anatomy of topic
Kafka
Topic
P0
P1
P2
msg 0
Topic is
divided
into
multiple
partitions
(P0, P1,
P2)
Each message
has an identifier
called offset
Producer
s write
message
s to the
end of
partitionPartition is a
unit of
parallelism
Consumers
can read from
any offset
Message
can have
key:value
msg 3
msg 1 msg 4 msg 7 msg 8
msg 2 msg 5
msg 6
49
50. Producers
• Publish to topics
• Round-robin
• Murmur 2
• Retry, Batching
• Async
• Broker list
50
51. Kafka Broker
0 1 2 3 4 5 6 7
0 1 2 3
0 1 2 3 4 5
0 1 2 3 4 5 6 7
0 1 2 3
P
0
P
1
P
2
0 1 2 3 4 5 6 7
0 1 2 3
0 1 2 3 4 5 0 1 2 3 4 5
Leader
partition
Replica
Each partition has
exactly one
leader
0 1 2 3 4 5 0 1 2 3 4 5
And >= 0 replicas.
They’re called In-
Sync Replicas
All read and
writes are made
using leader
partitionBroker 1 Broker 2 Broker 3
0 1 2 3 4 50 1 2 3 4 5
0 1 2 3 4 5 6 7
0 1 2 3
P
0
P
1
P
2
P
0
P
1
P
2
51
57. Guarantees
• Messages are appended in the order
they send
• Ordering is guaranteed within partition
• Consumer reads a messages in the
order they are stored
• N - 1 Broker failures57
58. Delivery semantics
• at least once - by default
• at most once - configurable
• exactly once - Kafka Transactions, June
2017
58
60. Service Deployment
• No significant problems in producer side
• Consumers may have issues with blue-
green deployment
• Remember to reserve additional
partitions for blue and green stacks
60
61. Monitoring
• Broker, Producer and Consumer has
JMX support out of the box
• Additional option is to write custom
reporters
61
майже 2 роки на апворку
на апворку можна заробляти, навіть якщо ваш замовник - сам апворк
деколи пишу статті, на своєму сайті, заходьте, підписуйтесь
Почнемо з ревью …
Ідея зрозуміла, ви маєте систему, яка працює в межах одного процесу…
Така система з часом виростає …
І однією з форм еволюції такої системи є перехід на мікросервісну …
В теорії, ви берете вашу монолітну однопроцесну систему, і розбиваєте її на багато - багато сервісів.
В вас буде окрема команда
В вас буде окремий деплоймент
Це все - чиста теорія.
Реальність виглядає ось так.
По-перше, переважно, такі мікросервіси - динамічні, з постійно змінюваною адресою в інтернеті. Якщо вони не динамічні, тоді це не ті мікросервіси, які я знаю.
По друге, таких сервісів багато, всі вони різні, по різному працюють, і мають різні дані.
І останнє, це різні команди, різні підходи, різні думки. Це вносить корективи загалом.
Щоб ще більше розвіяти картину, пропоную подивитись скільки їх може бути. Амазон і Нетфлікс, компанії - гіганти, які одні з перших впровадили мікросервісну архітектуру. Подивіться скільки в них сервісів.
Які ж цілі потрібно ставити в мікросервісній архітектурі ?
Перш за все, це скейлінг в термінах інженерів і спеціалістів.
Як я вже казав, в вас будуть великі і маленькі сервіси, так от для великих …
Також, скейлінг в межах даних.
Якщо ваша організація переходить чи будує мікросервісну архітектуру, то даних в вас буде ну дуже багато.
І дані ці будуть різні. І так як на сьогоднішній день ми маємо багато різних стореджів, ми можемо вибирати.
Для графових даних нам…
Якщо маєте пошукову логіку -
Якщо в вас не стабільна схема, не підходить реляційна структура, то …
І напевно, найголовніше, ви хочете бути незалежними. Незалежними від інших сервісів.
Згадайте ту картинку з амазоном і нетфліксом і подумайте скільки людей працює там.
В мікросервісах, такій команді потрібна незалежність, можливість працювати і не вклинюватись в інші команди.
Така команда буде мати окремі мітинги, окремий пленінг, окремий кодбекс, деплоймент.
Але компанії, так чи інакше, це колекції аплікацій, модулів, підсистем, які повинні працювати разом в якійсь степені, щоб досягти одного спільного результату.
Іншими словами, їм потрібно комунікувати.
Працюючи в моноліті, ви над цим не задумувались, оскільки це була одна аплікація.
Так само і тут, маючи незалежні, окремі сервіси, які бігають по мережі, мають різні бази даних і пишуться окремими командами, їм теж потрібно комунікувати.
Які існують патерни комунікації ?
Перший і найгірший патерн - патерн шареної бази даних.
Ідея полягає в тому, що всі, чи декілька сервісів використовують одну базу даних.
Такий патерн можна ще назвати розподіленим монолітом, оскільки в довгостроковій перспективі ви нічого не вирішуєте. Все лишається те ж, що і в моноліті, тільки сервіси тепер бігають по мережі.
Я довго думав як зобразити цей патерн, і знайшов цей твіт, який класно описує весь сюр, який трапляється при такому підході.
Всі команди завязані на одну базу, комунікують теж через неї. При рості навантаження росте і база. З часом виростає в дуже велику. А чи всім сервісам потрібна така база ?
Загальне правило - мати одну базу на один сервіс.
Ситуація може мінятись від сервісу до сервісу, але ідея зрозуміла - чим більше команд працюють в одній базі даних, тим складніше її підтримувати і тим вона стає більша.
Саме тому найкраще одній команді для одного сервісу мати одну базу даних.
Ок, якщо не шарена база, то що ?
Ми живемо в світі API і ендпоінтів.
Їх потрібно написати, версіонувати, підтримувати.
Це потрібно сусідньому сервісу, не вам.
Створює real time coupling
Не треба забувати, що сервіси не рівні між собою. І якщо більший сервіс викликає меншого - менший може просто завалитись.
Інша річ, що не всі сервіси мають бути частиною критичного шляху, який повинен пройти ріквест перед тим, як віддати відповідь.
Просто тому, що вам не потрібно робити все зразу.
Створюючи якусь покупку і відправляючи запит в OrderService, ви напевно не захочете в ту ж хвилину відправляти запит в Shipping Service, щоб оформити трекінг код.
Просто тому, що ваш домен так не працює. І Це створює додаткове лейтенсі, що негативно скажеться на продукті, який ви розробляєте.
І навіть, якщо б вам потрібно було виконати все і зразу, за допомогою апішок чи ендпоінтів, ви б не зробили достатньо якісно.
Якщо під час виконання цього шляху щось завалиться, а щось вже виконається, що тоді ?
Двох фазний коміт
CAP теорема
І коли ми говорили про те, що комунікація за допомогою сервісних інтерфейсів звязує сервіси докупи, то пофіксити це можна за допомогою третьої сторони: замість того, щоб відправляти повідомлення між сервісами напряму, ми це зробимо за допомогою якогось меседж брокера, який, в доповненні до всього, це ж саме повідомлення може відправити і іншим сервісам, якщо їм це буде потрібно.
Таким чином, виходить, що в нас буде два типи даних - дані, які ми будемо тримати в конкретному сервісі для того, щоб видавати цю інформацію в зовнішній світ, і дані, які будуть бігати через меседж брокер, і які будь який сервіс зможе прочитати.
Такий підхід до комунікації створює більшу координацію і дозволяє новим сервісам створюватись і заходити на платформу без ніяких проблем.
І кафка якраз є той меседж брокер, який буде відправляти зберігати ці повідомлення і відправляти їх всім охочим.
За останні роки дала про себе знати, сьогодні Кафка - це технологія, яка дозволить принести комунікацію між вашими сервісами на новий рівень.
Окей, а як реально можна застосувати Кафку в мікросервісній архітектурі ?
Я виділив три приклади, при яких Кафка може бути дуже корисна
Перше, Івент Сорсінг. Архітектурний підхід, який говорить нам, що стан системи визначається послідним ланцюжком подій.
Таким чином, кожна зміна даних логується і зберігається.
Візьмемо приклад.
В нас є ріквест, який модифікує дані в одному сервісі, і ріквест, який читає якусь інформацію, в іншому сервісі. Як другому сервісі отримати інформацію з першого сервісу ?
Можливо, комусь стало цікаво - а як же перший мікросервіс зберігає інформацію. Одна з хороших якостей івент сорсінгу полягає в тому, що мікросервіс 1 зберігає інформацію за таким ж принципом.
І коли говорять про івент сорсінг системи, не можна не згадати такий патерн, як CQRS. Цей патерн часто використовують в звязці з event sourcing системами.
Ідея в тому, що в вас є дві різні моделі для запису і для читання даних.
Є багато різних думок з приводу цього підходу, є багато різних думок з приводу нього, і єдине, чому я згадав цей патерн - це тому, що він може нам дати відповідь на питання як організувати структуру таких сервісів.
Перш за все, сервіс, який буде приймати write запитиЗа ним слідує сервіс, який буде буде виступати в ролі івент хендлера
і третій - інстанс, який буде читати дані з рід бази.
Вьюшки і Сторед процедури
Event sourcing не для всіх.
Хто чув про цей підхід ???
Почнемо з прикладу. В нас є якийсь сервіс, який повинен записати інформацію в базу, апдейтнути кеш, і зробити реіндекс в серш.
І традиційно, ми послідовно записуємо інформацію спочатку в базу, потім в кеш, потім в серч інжин.
Хто бачить в цьому якусь проблему ?
Проблема в тому, що три сорси даних не можливо постійно апдейтити так, щоб не мати частковий фейлурів
І коли ми говоримо про CDC, то нам потрібно і далі писати в базу, але не писати в Cache і Search Index. На сьогоднішній день, практично всі бази, які в більшій чи меншій мірі активно юзаються, мають можливість читати так званий Write Ahead Log змін, які відбуваються в базі.
В Постгресі це можливо за допомогою Logical Decoding фічі, в MySQL є BinLog, в Oracle Golden Gate і навітьв в монго це можна зробити за допомогою OpLog-а.
І зприходом хороших якісних меседжінг систем це стало особливо актуально, оскільки це дозволяє писати в базу, і з бази паралельно записувати в меседжінг систему.
В Вас Напевно буде стара логіка
Замість того, щоб читати з бази, краще стрімити ці зміни.
Event sourcing не для всіх.
Event sourcing не для всіх.
В Кафці є можливість розміщувати консюмери в межах консюмер групи.
В такій консюмер групі, один партишин буде читати один і тільки один консюмер.
Приклад
Ця ідея consumer груп класно мапиться на мікросервіси
Оскільки консюмери можуть самі вибирати, з якого порядку місця читати повідомлення,
Паттерн Checkpoint. В Кафці все відбувається по інакшому, так як повідомленя постійно стираються
Кейси з мікросервісів, коли це корисно
Так як лог нікуди не дівається, ми можемо використовувати як source of truth
at least once retries
at most once
at least once retries
at most once
Висновок звідси
http://blog.christianposta.com/microservices/the-hardest-part-about-microservices-data/