JavaRush/ΠšΡƒΡ€ΡΡ‹/ΠœΠΎΠ΄ΡƒΠ»ΡŒ 5. Spring/ЛСкция 183: ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Kafka: ΠΊΠ°ΠΊ Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ ...

ЛСкция 183: ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Kafka: ΠΊΠ°ΠΊ Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ

ΠžΡ‚ΠΊΡ€Ρ‹Ρ‚Π°

Π’ этой Π»Π΅ΠΊΡ†ΠΈΠΈ ΠΌΡ‹ углубимся Π² ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ… Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ с Kafka, Ρ€Π°Π·Π±Π΅Ρ€Π΅ΠΌ, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ модСль ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΈ подписки, Π° Ρ‚Π°ΠΊΠΆΠ΅ рассмотрим Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΠΈ доставки сообщСний.


ΠŸΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΡ ΠΈ подписка: ΠΊΠ°ΠΊ двиТутся Π΄Π°Π½Π½Ρ‹Π΅ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌΠΈ Kafka

Π”Π°Π²Π°ΠΉΡ‚Π΅ Π½Π°Ρ‡Π½Π΅ΠΌ с основного ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ° ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ…: ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΈ подписки (publish-subscribe). Kafka построСна Π²ΠΎΠΊΡ€ΡƒΠ³ этой ΠΌΠΎΠ΄Π΅Π»ΠΈ, которая позволяСт ΠΏΡ€ΠΎΠ΄ΡŽΡΠ΅Ρ€Π°ΠΌ (отправитСлям) ΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Π² Ρ‚ΠΎΠΏΠΈΠΊΠΈ, Π° ΠΊΠΎΠ½ΡΡŒΡŽΠΌΠ΅Ρ€Π°ΠΌ (получатСлям) ΠΏΠΎΠ΄ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒΡΡ Π½Π° эти Ρ‚ΠΎΠΏΠΈΠΊΠΈ ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅. Π­Ρ‚ΠΎ ΠΏΠΎΡ…ΠΎΠΆΠ΅ Π½Π° ΡΠ»Π΅ΠΊΡ‚Ρ€ΠΎΠ½Π½ΡƒΡŽ рассылку: Π²Ρ‹ отправляСтС письмо Π³Ρ€ΡƒΠΏΠΏΠ΅ людСй, Π° ΠΎΠ½ΠΈ Ρ‡ΠΈΡ‚Π°ΡŽΡ‚ Π΅Π³ΠΎ, ΠΊΠΎΠ³Π΄Π° Ρƒ Π½ΠΈΡ… Π΅ΡΡ‚ΡŒ врСмя β€” Ρ‚ΠΎΠ»ΡŒΠΊΠΎ вмСсто писСм Ρƒ нас сообщСния, Π° вмСсто Π³Ρ€ΡƒΠΏΠΏΡ‹ людСй β€” Ρ‚ΠΎΠΏΠΈΠΊΠΈ ΠΈ ΠΊΠΎΠ½ΡΡŒΡŽΠΌΠ΅Ρ€Ρ‹.

Как это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚?

  1. ΠŸΡ€ΠΎΠ΄ΡŽΡΠ΅Ρ€ ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ΅Ρ‚ сообщСниС: ΠΏΡ€ΠΎΠ΄ΡŽΡΠ΅Ρ€, ΠΊΠ°ΠΊ Π³Π»Π°Π²Π½Ρ‹ΠΉ рассказчик Π² ΠΊΠΎΠΌΠ½Π°Ρ‚Π΅, отправляСт свои сообщСния Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ Ρ‚ΠΎΠΏΠΈΠΊ. Π­Ρ‚ΠΈ сообщСния автоматичСски Ρ€Π°ΡΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ ΠΏΠΎ партициям Π΄Π°Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΎΠΏΠΈΠΊΠ°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ.
  2. Π‘Ρ€ΠΎΠΊΠ΅Ρ€Ρ‹ хранят Π΄Π°Π½Π½Ρ‹Π΅: Kafka-Π±Ρ€ΠΎΠΊΠ΅Ρ€Ρ‹ β€” это своСобразныС Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π°, Π³Π΄Π΅ сообщСния ΠΎΡΡ‚Π°ΡŽΡ‚ΡΡ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° ΠΎΠ½ΠΈ Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Ρ‹ ΠΊΠΎΠ½ΡΡŒΡŽΠΌΠ΅Ρ€Π°ΠΌΠΈ (ΠΈΠ»ΠΈ ΠΏΠΎΠΊΠ° Π½Π΅ истСчСт ΠΈΡ… срок хранСния).
  3. ΠšΠΎΠ½ΡΡŒΡŽΠΌΠ΅Ρ€ считываСт сообщСниС: ΠΊΠΎΠ½ΡΡŒΡŽΠΌΠ΅Ρ€, ΠΊΠ°ΠΊ ΠΆΠ°Π΄Π½Ρ‹ΠΉ ΡΠ»ΡƒΡˆΠ°Ρ‚Π΅Π»ΡŒ, подписываСтся Π½Π° Ρ‚ΠΎΠΏΠΈΠΊ (ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ ΠΏΠ°Ρ€Ρ‚ΠΈΡ†ΠΈΠΈ) ΠΈ Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ сообщСния. Он отслСТиваСт, ΠΊΠ°ΠΊΠΎΠ΅ сообщСниС ΠΎΠ½ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π» послСдним, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ offset (оффсСт) β€” ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ Π½ΠΎΠΌΠ΅Ρ€ сообщСния Π² Ρ‚ΠΎΠΏΠΈΠΊΠ΅.

Π“Π°Ρ€Π°Π½Ρ‚ΠΈΠΈ доставки: At Least Once, At Most Once, Exactly Once

Π Π°Π±ΠΎΡ‚Π° с ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ΠΉ Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΠ΅ΠΆΠ΄Ρƒ систСмами всСгда связана с вопросами надСТности ΠΈ консистСнтности. Kafka ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ Ρ‚Ρ€ΠΈ уровня Π³Π°Ρ€Π°Π½Ρ‚ΠΈΠΈ доставки сообщСний:

1. At Least Once (Доставка ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·)

Основной ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ: сообщСниС ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ доставлСно нСсколько Ρ€Π°Π·, Π½ΠΎ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ потСряно.

ΠŸΡ€ΠΎΠ΄ΡŽΡΠ΅Ρ€ отправляСт сообщСниС, ΠΈ Kafka Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ записано Π² Ρ‚ΠΎΠΏΠΈΠΊ. ΠšΠΎΠ½ΡΡŒΡŽΠΌΠ΅Ρ€ ΠΌΠΎΠΆΠ΅Ρ‚ случайно ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅ сообщСниС Π΄Π²Π°ΠΆΠ΄Ρ‹ ΠΈΠ·-Π·Π° сбоя ΠΏΡ€ΠΈ ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€: Π² ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚-ΠΌΠ°Π³Π°Π·ΠΈΠ½Π΅ Π·Π°ΠΊΠ°Π· Π½Π° Ρ‚ΠΎΠ²Π°Ρ€ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ случайно ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½ Π΄Π²Π°ΠΆΠ΄Ρ‹, ΠΈ ΠΏΠΎΠΊΡƒΠΏΠ°Ρ‚Π΅Π»ΡŽ отправят Π΄Π²Π΅ ΠΊΠΎΠΏΠΈΠΈ Ρ‚ΠΎΠ²Π°Ρ€Π° вмСсто ΠΎΠ΄Π½ΠΎΠΉ.

2. At Most Once (Доставка максимум ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·)

Основной ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ: сообщСниС доставляСтся ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·, Π½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ потСряно (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² случаС сбоя).

ΠŸΡ€ΠΎΠ΄ΡŽΡΠ΅Ρ€ отправляСт сообщСниС, Π½ΠΎ Ссли ΠΎΠ½ΠΎ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΎ, Kafka допускаСт, Ρ‡Ρ‚ΠΎ сообщСниС потСряСтся.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€: ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ Π·Π°Π΄Π°Ρ‡ΠΈ Π² систСмС ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡ‚Π΅Ρ€ΡΡ‚ΡŒ ΠΎΠ΄Π½ΠΎ ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅, Π½ΠΎ Π²Π°ΠΆΠ½ΠΎ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ дублирования.

3. Exactly Once (Доставка Ρ€ΠΎΠ²Π½ΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·)

Основной ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ: сообщСниС Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎ доставляСтся Ρ€ΠΎΠ²Π½ΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·.

Π­Ρ‚Π° гарантия рСализуСтся Ρ‡Π΅Ρ€Π΅Π· слоТныС ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹ настройки Kafka ΠΈ рСтрансляции Π΄Π°Π½Π½Ρ‹Ρ…. Π­Ρ‚ΠΎ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ слоТный Π²Π°Ρ€ΠΈΠ°Π½Ρ‚, Π½ΠΎ ΠΎΠ½ Π·Π°Ρ‰ΠΈΡ‰Π°Π΅Ρ‚ ΠΎΡ‚ ошибок ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€: подсчСт Π΄Π΅Π½Π΅ΠΆΠ½Ρ‹Ρ… Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ Π² Π±Π°Π½ΠΊΠ΅, Π³Π΄Π΅ Π²Π°ΠΆΠ½ΠΎ Π½Π΅ ΠΏΠΎΡ‚Π΅Ρ€ΡΡ‚ΡŒ Π½ΠΈ ΠΎΠ΄Π½Ρƒ запись ΠΈ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ.

ΠšΡΡ‚Π°Ρ‚ΠΈ, Π·Π½Π°Π»ΠΈ, Ρ‡Ρ‚ΠΎ Ρ€Π°Π½ΡŒΡˆΠ΅ "Exactly Once" Π±Ρ‹Π»Π° Π»Π΅Π³Π΅Π½Π΄ΠΎΠΉ ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ ΠΌΠΈΡ„ΠΎΠΌ Π² ΠΌΠΈΡ€Π΅ распрСдСлённых систСм? Kafka сдСлала Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌ ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΠ»Π° эту Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡŽ, Ρ‡Π΅ΠΌ Π²Π·Π±ΡƒΠ΄ΠΎΡ€Π°ΠΆΠΈΠ»Π° ΡƒΠΌΡ‹ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ².


Как Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ подходящий ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΠΈ?

Π’Π°Ρˆ Π²Ρ‹Π±ΠΎΡ€ зависит ΠΎΡ‚ бизнСс-Π»ΠΎΠ³ΠΈΠΊΠΈ ΠΈ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ вашСй систСмы:

  • Если потСря сообщСний Π½Π΅ΠΏΡ€ΠΈΠ΅ΠΌΠ»Π΅ΠΌΠ° (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ Π² Π±Π°Π½ΠΊΠ΅), ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Exactly Once.
  • Если Π²Π°ΠΆΠ½Π΅Π΅ ΠΈΠ·Π±Π΅Π³Π°Ρ‚ΡŒ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ, Ρ‡Π΅ΠΌ потСря сообщСния (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, увСдомлСния), Π²Ρ‹Π±ΠΈΡ€Π°ΠΉΡ‚Π΅ At Most Once.
  • Если допустима повторная ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° сообщСний (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π°Π½Π°Π»ΠΈΡ‚ΠΈΠΊΠ°), Π²Ρ‹Π±ΠΈΡ€Π°ΠΉΡ‚Π΅ At Least Once.

Как сообщСниС ΠΏΡƒΡ‚Π΅ΡˆΠ΅ΡΡ‚Π²ΡƒΠ΅Ρ‚ ΠΏΠΎ Kafka: ΠΎΡ‚ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ Π΄ΠΎ получСния

Π”Π°Π²Π°ΠΉΡ‚Π΅ прослСдим ΠΏΡƒΡ‚ΡŒ сообщСния ΠΎΡ‚ ΠΏΡ€ΠΎΠ΄ΡŽΡΠ΅Ρ€Π° Π΄ΠΎ ΠΊΠΎΠ½ΡΡŒΡŽΠΌΠ΅Ρ€Π°. Π­Ρ‚ΠΎ ΠΊΠ°ΠΊ ΠΎΡ‚ΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ доставку посылки β€” Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ быстрСС!

1. ΠŸΡ€ΠΎΠ΄ΡŽΡΠ΅Ρ€ отправляСт сообщСниС

ΠŸΡ€ΠΎΠ΄ΡŽΡΠ΅Ρ€ обращаСтся ΠΊ Kafka Ρ‡Π΅Ρ€Π΅Π· Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΡΠΊΡƒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ Kafka Π½Π° Java). КаТдоС сообщСниС сопровоТдаСтся ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹ΠΌΠΈ, Ρ‚Π°ΠΊΠΈΠΌΠΈ ΠΊΠ°ΠΊ ΠΊΠ»ΡŽΡ‡ ΠΈΠ»ΠΈ врСмСнная ΠΌΠ΅Ρ‚ΠΊΠ°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠΌΠΎΠ³Π°ΡŽΡ‚ Ρ€Π°ΡΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ сообщСния ΠΏΠΎ партициям.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ΄Π° ΠΏΡ€ΠΎΠ΄ΡŽΡΠ΅Ρ€Π° Π½Π° Java

import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.ProducerRecord;
import java.util.Properties;

public class SimpleProducer {
    public static void main(String[] args) {
        Properties props = new Properties();
        props.put("bootstrap.servers", "localhost:9092");
        props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
        props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");

        KafkaProducer<String, String> producer = new KafkaProducer<>(props);
        ProducerRecord<String, String> record = new ProducerRecord<>("my-topic", "key", "Hello Kafka!");

        producer.send(record);
        producer.close();
    }
}
  • bootstrap.servers β€” адрСс Kafka-Π±Ρ€ΠΎΠΊΠ΅Ρ€Π°.
  • key.serializer ΠΈ value.serializer β€” сСриалайзСры для прСвращСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π² Π±Π°ΠΉΡ‚ΠΎΠ²ΡƒΡŽ строку.

3. Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ записываСтся Π² Ρ‚ΠΎΠΏΠΈΠΊ

Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ "призСмляСтся" Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ ΠΏΠ°Ρ€Ρ‚ΠΈΡ†ΠΈΡŽ Ρ‚ΠΎΠΏΠΈΠΊΠ°. Kafka сохраняСт Π΅Π³ΠΎ Π² Π»ΠΎΠ³, Π° оффсСт увСличиваСтся.

4. ΠšΠΎΠ½ΡΡŒΡŽΠΌΠ΅Ρ€ считываСт сообщСниС

ΠšΠΎΠ½ΡΡŒΡŽΠΌΠ΅Ρ€ обращаСтся ΠΊ Kafka посрСдством Consumer API. Он подписываСтся Π½Π° Ρ‚ΠΎΠΏΠΈΠΊ ΠΈ Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ сообщСния ΠΈΠ· ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… ΠΏΠ°Ρ€Ρ‚ΠΈΡ†ΠΈΠΉ. Kafka Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ оффсСт Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ Π½Π° послСднСС считанноС сообщСниС для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΊΠΎΠ½ΡΡŒΡŽΠΌΠ΅Ρ€Π°.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ΄Π° ΠΊΠΎΠ½ΡΡŒΡŽΠΌΠ΅Ρ€Π° Π½Π° Java

import org.apache.kafka.clients.consumer.Consumer;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.KafkaConsumer;

import java.time.Duration;
import java.util.Collections;
import java.util.Properties;

public class SimpleConsumer {
    public static void main(String[] args) {
        Properties props = new Properties();
        props.put("bootstrap.servers", "localhost:9092");
        props.put("group.id", "my-consumer-group");
        props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
        props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");

        Consumer<String, String> consumer = new KafkaConsumer<>(props);
        consumer.subscribe(Collections.singletonList("my-topic"));

        while (true) {
            for (ConsumerRecord<String, String> record : consumer.poll(Duration.ofMillis(100))) {
                System.out.printf("Received message: %s, at offset: %d%n", record.value(), record.offset());
            }
        }
    }
}
  • group.id β€” Π³Ρ€ΡƒΠΏΠΏΠ° ΠΊΠΎΠ½ΡΡŒΡŽΠΌΠ΅Ρ€ΠΎΠ², которая позволяСт Ρ€Π°ΡΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ ΠΌΠ΅ΠΆΠ΄Ρƒ нСсколькими ΠΊΠΎΠ½ΡΡŒΡŽΠΌΠ΅Ρ€Π°ΠΌΠΈ.
  • poll(Duration) β€” ΠΌΠ΅Ρ‚ΠΎΠ΄ для получСния сообщСний.

Π’ΠΈΠΏΠΈΡ‡Π½Ρ‹Π΅ ошибки ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΠΈΡ… устранСниС

Иногда Π²ΡΡ‚Ρ€Π΅Ρ‡Π°ΡŽΡ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹:

  • Π”ΡƒΠ±Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сообщСний: Ссли ΠΊΠΎΠ½ΡΡŒΡŽΠΌΠ΅Ρ€ Π½Π΅ успСл ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€Π΄ΠΈΡ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ сообщСния, Kafka ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Π΅Π³ΠΎ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ. Π­Ρ‚ΠΎ устраняСтся Ρ‡Π΅Ρ€Π΅Π· ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ "Exactly Once".
  • ΠŸΠΎΡ‚Π΅Ρ€Ρ сообщСний: Ссли конфигурация ΠΏΡ€ΠΎΠ΄ΡŽΡΠ΅Ρ€Π° настроСна Π½Π° "fire-and-forget", сообщСния ΠΌΠΎΠ³ΡƒΡ‚ Ρ‚Π΅Ρ€ΡΡ‚ΡŒΡΡ ΠΏΡ€ΠΈ сбоях. ВсСгда настраивайтС ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠ΅ записи (acks=all).
  • НСравномСрноС распрСдСлСниС Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ срСди ΠΏΠ°Ρ€Ρ‚ΠΈΡ†ΠΈΠΉ: Ссли сообщСния Π·Π°ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ Π±Π΅Π· указания ΠΊΠ»ΡŽΡ‡Π°, Kafka ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°ΡΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΈΡ… Ρ…Π°ΠΎΡ‚ΠΈΡ‡Π½ΠΎ. УстановитС ΠΊΠ»ΡŽΡ‡ для сообщСний, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ Ρ€Π°Π²Π½ΠΎΠΌΠ΅Ρ€Π½Ρ‹ΠΉ баланс.

Π—Π°Ρ‡Π΅ΠΌ это Π½ΡƒΠΆΠ½ΠΎ Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΉ ΠΆΠΈΠ·Π½ΠΈ?

Kafka ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, Π³Π΄Π΅ Π²Π°ΠΆΠ½Π° Ρ€Π°Π±ΠΎΡ‚Π° с большими ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ… Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. НапримСр:

  • Π’Ρ€Π΅ΠΊΠ΅Ρ€Ρ‹ активности ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ: Π°Π½Π°Π»ΠΈΠ· активности ΠΌΠΈΠ»Π»ΠΈΠΎΠ½ΠΎΠ² ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ.
  • Π–ΡƒΡ€Π½Π°Π»Ρ‹ ΠΈ Π°Π½Π°Π»ΠΈΡ‚ΠΈΠΊΠ°: сбор ΠΈ Π°Π½Π°Π»ΠΈΠ· Π»ΠΎΠ³ΠΎΠ² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ.
  • Онлайн-ставки ΠΈ ΠΈΠ³Ρ€Ρ‹: ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° миллисСкундных событий.
  • ЀинансовыС систСмы: обСспСчСниС Π½Π°Π΄Π΅ΠΆΠ½ΠΎΠΉ доставки Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ.

Π’ΠΎΡ‚ Ρ‚Π°ΠΊ Kafka ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π΄Π°Π½Π½Ρ‹Π΅ Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π² ΠΌΠΎΡ‰Π½Ρ‹ΠΉ инструмСнт для построСния соврСмСнных систСм! Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅, ΠΊΠ°ΠΊ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅, ΠΈ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ шагам: установкС Kafka ΠΈ созданию своих ΠΏΡ€ΠΎΠ΄ΡŽΡΠ΅Ρ€ΠΎΠ² ΠΈ ΠΊΠΎΠ½ΡΡŒΡŽΠΌΠ΅Ρ€ΠΎΠ².

ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ
  • популярныС
  • Π½ΠΎΠ²Ρ‹Π΅
  • старыС
Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ Π’Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ
Π£ этой страницы Π΅Ρ‰Π΅ Π½Π΅Ρ‚ Π½ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ коммСнтария