Upgrade to Pro — share decks privately, control downloads, hide ads and more …

CodeFest 2019. Григорий Кошелев (Контур) — А вы Кафку пробовали?

CodeFest
April 05, 2019

CodeFest 2019. Григорий Кошелев (Контур) — А вы Кафку пробовали?

Apache Kafka — распределённый программный брокер сообщений, применяемый в обработке в реальном времени данных большого объёма. К отличительным особенностям Apache Kafka можно отнести: надёжность, масштабируемость и высокую производительность. В докладе разберём основные архитектурные особенности и сценарии использования Apache Kafka. Рассмотрим неочевидные моменты и грабли, которые мы собрали на пути Востока.

CodeFest

April 05, 2019
Tweet

More Decks by CodeFest

Other Decks in Technology

Transcript

  1. А вы Кафку пробовали? Apache Kafka – распределённый брокер сообщений

    Григорий Кошелев СКБ Контур CodeFest, Новосибирск, 2019 =1
  2. План 1. Зачем нам Apache Kafka 2. Введение в Кафку

    3. Архитектура 4. Неочевидности 5. Выводы =2
  3. Зачем нам Apache Kafka - Vostok Hercules https://github.com/vostok - Логи

    - Метрики - Трассировки - Бизнес-события =8
  4. Зачем нам Apache Kafka - Vostok Hercules [Kafka 2.0+] -

    Search & Recommendation Systems (SRS) =10
  5. Зачем нам Apache Kafka - Vostok Hercules [Kafka 2.0+] -

    Search & Recommendation Systems (SRS) [Kafka 0.11.x] =11
  6. Архитектура Kafka Topic topic = {partition} 0 1 2 3

    4 5 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 partition 0 partition 1 partition 2 =27
  7. Архитектура Kafka Topic topic = {partition} 0 1 2 3

    4 5 6 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 partition 0 partition 1 partition 2 =28
  8. Архитектура Kafka Topic topic = {partition} 0 1 2 3

    4 5 6 0 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 partition 0 partition 1 partition 2 =29
  9. Архитектура Kafka Topic topic = {partition} 0 1 2 3

    4 5 6 0 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 partition 0 partition 1 partition 2 =30
  10. Архитектура Kafka Topic topic = {partition} 0 1 2 3

    4 5 6 0 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 partition 0 partition 1 partition 2 offset = 0 =31
  11. Архитектура Kafka Topic topic = {partition} 0 1 2 3

    4 5 6 0 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 partition 0 partition 1 partition 2 offset = 1 =32
  12. Архитектура Kafka Topic topic = {partition} 0 1 2 3

    4 5 6 0 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 partition 0 partition 1 partition 2 offset = 2 =33
  13. Архитектура Kafka Topic topic = {partition} 0 1 2 3

    4 5 6 0 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 partition 0 partition 1 partition 2 offset = 3 =34
  14. Архитектура Kafka Topic partition = {segment} 0 1 2 3

    4 5 6 7 8 9 … … … n … … … =36
  15. Архитектура Kafka Topic partition = {segment} 0 1 2 3

    4 5 6 7 8 9 … … … n … … … segment =37
  16. Архитектура Kafka Topic partition = {segment} 0 1 2 3

    4 5 6 7 8 9 … … … n … … … segment =38
  17. Архитектура Kafka Topic partition = {segment} 0 1 2 3

    4 5 6 7 8 9 … … … n … … … segment =39
  18. Архитектура Kafka Topic partition = {segment} 0 1 2 3

    4 5 6 7 8 9 … … … n … … … base offset =40
  19. Архитектура Kafka Topic segment = (base_offset, data, index, timeindex) 00000000001234567890.log

    00000000001234567890.index 00000000001234567890.timeindex log =45 Index record = (relative offset, posit
  20. Архитектура Kafka Topic segment = (base_offset, data, index, timeindex) 00000000001234567890.log

    00000000001234567890.index 00000000001234567890.timeindex offset = 1234567890 log size = 100 =46 relative offset = 0 position = 0 Index record = (relative offset, posit
  21. Архитектура Kafka Topic segment = (base_offset, data, index, timeindex) 00000000001234567890.log

    00000000001234567890.index 00000000001234567890.timeindex offset = 1234567891 log size = 100 =47 relative offset = 1 position = 100 Index record = (relative offset, posit
  22. Архитектура Kafka Topic segment = (base_offset, data, index, timeindex) 00000000001234567890.log

    00000000001234567890.index 00000000001234567890.timeindex offset = 1234567892 log size = 50 =48 relative offset = 2 position = 200 Index record = (relative offset, posit
  23. Архитектура Kafka Topic segment = (base_offset, data, index, timeindex) 00000000001234567890.log

    00000000001234567890.index 00000000001234567890.timeindex offset = 1234567893 log size = 150 =49 relative offset = 3 position = 250 Index record = (relative offset, posit
  24. Архитектура Kafka Broker broker 1 broker 2 broker 3 Controller

    – координирует работу кластера =52
  25. Архитектура Kafka Broker broker 1 partition 0 topic = {partition}

    broker 2 partition 1 broker 3 partition 2 partition 3 =53
  26. Архитектура Kafka Broker broker 1 partition 0 partition 1 partition

    2 partition 3 broker 2 partition 0 partition 1 partition 2 partition 3 broker 3 partition 0 partition 1 partition 2 partition 3 replication factor = 3 =54
  27. Архитектура Kafka Broker broker 1 partition 0 partition 1 partition

    2 partition 3 partition 4 broker 2 partition 0 partition 1 partition 2 partition 3 partition 4 broker 3 partition 0 partition 1 partition 2 partition 3 partition 4 Добавление partition =55
  28. Архитектура Kafka Broker broker 1 partition 0 partition 1 partition

    2 partition 3 partition 4 broker 2 partition 0 partition 1 partition 2 partition 3 partition 4 broker 3 partition 0 partition 1 partition 2 partition 3 partition 4 broker 1 – leader для partition 0. =56 leader
  29. Архитектура Kafka Broker broker 1 partition 0 partition 1 partition

    2 partition 3 partition 4 broker 2 partition 0 partition 1 partition 2 partition 3 partition 4 broker 3 partition 0 partition 1 partition 2 partition 3 partition 4 broker 2 – leader для partition 1 =57 leader
  30. Архитектура Kafka Broker broker 1 partition 0 partition 1 partition

    2 partition 3 partition 4 broker 2 partition 0 partition 1 partition 2 partition 3 partition 4 broker 3 partition 0 partition 1 partition 2 partition 3 partition 4 broker 3 – leader для partition 2 =58 leader
  31. Архитектура Kafka Broker broker 1 partition 0 partition 1 partition

    2 partition 3 partition 4 broker 2 partition 0 partition 1 partition 2 partition 3 partition 4 broker 3 partition 0 partition 1 partition 2 partition 3 partition 4 broker 3 – leader для partition 3 =59 leader
  32. Архитектура Kafka Broker broker 1 partition 0 partition 1 partition

    2 partition 3 partition 4 broker 2 partition 0 partition 1 partition 2 partition 3 partition 4 broker 3 partition 0 partition 1 partition 2 partition 3 partition 4 broker 2 – leader для partition 4 =60 leader
  33. Архитектура Kafka Broker broker 1 partition 0 partition 1 partition

    2 partition 3 partition 4 broker 2 partition 0 partition 1 partition 2 partition 3 partition 4 broker 3 partition 0 partition 1 partition 2 partition 3 partition 4 Репликация с лидера на другие брокеры =61 leader
  34. Архитектура Kafka Broker broker 1 partition 0 partition 1 partition

    2 partition 3 partition 4 broker 2 partition 0 partition 1 partition 2 partition 3 partition 4 broker 3 partition 0 partition 1 partition 2 partition 3 partition 4 ISR (in sync replica) – реплика, синхронизированная с лидером =62 leader ISR
  35. Все реплики синхронизированы Архитектура Kafka Broker broker 1 partition 0

    partition 1 partition 2 partition 3 partition 4 broker 2 partition 0 partition 1 partition 2 partition 3 partition 4 broker 3 partition 0 partition 1 partition 2 partition 3 partition 4 =63 leader ISR
  36. Недоступность лидера у partition 2 Архитектура Kafka Broker broker 1

    partition 0 partition 1 partition 2 partition 3 partition 4 broker 2 partition 0 partition 1 partition 2 partition 3 partition 4 broker 3 partition 0 partition 1 partition 2 partition 3 partition 4 =64 leader ISR failed
  37. Выбор нового лидера в случае недоступности Архитектура Kafka Broker broker

    1 partition 0 partition 1 partition 2 partition 3 partition 4 broker 2 partition 0 partition 1 partition 2 partition 3 partition 4 broker 3 partition 0 partition 1 partition 2 partition 3 partition 4 =65 leader ISR failed
  38. Репликация с нового лидера Архитектура Kafka Broker broker 1 partition

    0 partition 1 partition 2 partition 3 partition 4 broker 2 partition 0 partition 1 partition 2 partition 3 partition 4 broker 3 partition 0 partition 1 partition 2 partition 3 partition 4 =66 leader ISR failed
  39. Архитектура Kafka Broker broker 1 partition 0 partition 1 partition

    2 partition 3 partition 4 broker 2 partition 0 partition 1 partition 2 partition 3 partition 4 broker 3 partition 0 partition 1 partition 2 partition 3 partition 4 =67 leader ISR failed
  40. Архитектура Kafka Broker broker 1 partition 0 partition 1 partition

    2 partition 3 partition 4 broker 2 partition 0 partition 1 partition 2 partition 3 partition 4 broker 3 partition 0 partition 1 partition 2 partition 3 partition 4 Синхронизация реплики с лидером после восстановления =68 leader ISR failed
  41. Архитектура Kafka Broker broker 1 partition 0 partition 1 partition

    2 partition 3 partition 4 broker 2 partition 0 partition 1 partition 2 partition 3 partition 4 broker 3 partition 0 partition 1 partition 2 partition 3 partition 4 =69 leader ISR failed
  42. Перебалансировка лидеров Архитектура Kafka Broker broker 1 partition 0 partition

    1 partition 2 partition 3 partition 4 broker 2 partition 0 partition 1 partition 2 partition 3 partition 4 broker 3 partition 0 partition 1 partition 2 partition 3 partition 4 =70 leader ISR failed
  43. Архитектура Kafka Producer message = (key, value) partition = murmur2(key)

    % partitions // key != null https://ru.wikipedia.org/wiki/MurmurHash2 =76
  44. Архитектура Kafka Producer message = (key, value) partition = murmur2(key)

    % partitions // key != null partition = round_robin(partitions) =77
  45. Архитектура Kafka Producer message = (key, value) partition = murmur2(key)

    % partitions // key != null partition = round_robin(partitions) // key == null =78
  46. Архитектура Kafka Producer 0 1 2 3 4 5 6

    7 8 replica 0 replica 1 replica 2 0 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 8 =80
  47. Архитектура Kafka Producer 0 1 2 3 4 5 6

    7 8 replica 0 replica 1 replica 2 0 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 8 leader =81
  48. Архитектура Kafka Producer 0 1 2 3 4 5 6

    7 8 replica 0 replica 1 replica 2 0 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 8 leader ISR =82 ISR
  49. Архитектура Kafka Producer Acknowledgement (ack) – подтверждение записи 0 1

    2 3 4 5 6 7 8 replica 0 replica 1 replica 2 0 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 8 acks = 0 =83
  50. Архитектура Kafka Producer Acknowledgement (ack) – подтверждение записи 0 1

    2 3 4 5 6 7 8 replica 0 replica 1 replica 2 0 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 8 acks = 0 =84
  51. Архитектура Kafka Producer Acknowledgement (ack) – подтверждение записи 0 1

    2 3 4 5 6 7 8 replica 0 replica 1 replica 2 0 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 8 9 acks = 0 =85 процесс записи
  52. Архитектура Kafka Producer Acknowledgement (ack) – подтверждение записи 0 1

    2 3 4 5 6 7 8 replica 0 replica 1 replica 2 0 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 8 9 acks = 0 =86 процесс записи
  53. Архитектура Kafka Producer Acknowledgement (ack) – подтверждение записи 0 1

    2 3 4 5 6 7 8 replica 0 replica 1 replica 2 0 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 8 acks = 1 =87 процесс записи
  54. Архитектура Kafka Producer Acknowledgement (ack) – подтверждение записи 0 1

    2 3 4 5 6 7 8 replica 0 replica 1 replica 2 0 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 8 9 acks = 1 =88 процесс записи
  55. Архитектура Kafka Producer Acknowledgement (ack) – подтверждение записи 0 1

    2 3 4 5 6 7 8 replica 0 replica 1 replica 2 0 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 8 9 acks = 1 =89 процесс записи успешная запись
  56. Архитектура Kafka Producer Acknowledgement (ack) – подтверждение записи replica 0

    replica 1 replica 2 0 1 2 3 4 5 6 7 8 9 acks = 1 0 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 8 =90 процесс записи успешная запись
  57. Архитектура Kafka Producer Acknowledgement (ack) – подтверждение записи replica 0

    replica 1 replica 2 0 1 2 3 4 5 6 7 8 9 acks = 1 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 =91 процесс записи успешная запись
  58. Архитектура Kafka Producer Acknowledgement (ack) – подтверждение записи 0 1

    2 3 4 5 6 7 8 replica 0 replica 1 replica 2 0 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 8 acks = all =92 процесс записи успешная запись
  59. Архитектура Kafka Producer Acknowledgement (ack) – подтверждение записи 0 1

    2 3 4 5 6 7 8 replica 0 replica 1 replica 2 0 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 8 9 acks = all =93 процесс записи успешная запись
  60. Архитектура Kafka Producer Acknowledgement (ack) – подтверждение записи 0 1

    2 3 4 5 6 7 8 replica 0 replica 1 replica 2 0 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 8 9 acks = all =94 процесс записи успешная запись
  61. Архитектура Kafka Producer Acknowledgement (ack) – подтверждение записи replica 0

    replica 1 replica 2 0 1 2 3 4 5 6 7 8 9 acks = all 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 =95 процесс записи успешная запись
  62. Архитектура Kafka Producer Acknowledgement (ack) – подтверждение записи replica 0

    replica 1 replica 2 0 1 2 3 4 5 6 7 8 9 acks = all 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 =96 процесс записи успешная запись
  63. Архитектура Kafka Producer Acknowledgement (ack) – подтверждение записи replica 0

    replica 1 replica 2 0 1 2 3 4 5 6 7 8 9 acks = all 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 =97 процесс записи успешная запись
  64. Архитектура Kafka Producer Acknowledgement (ack) – подтверждение записи replica 0

    replica 1 replica 2 0 1 2 3 4 5 6 7 8 9 acks = all 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 =98 процесс записи успешная запись
  65. Архитектура Kafka Producer Acknowledgement (ack) – подтверждение записи replica 0

    replica 1 replica 2 0 1 2 3 4 5 6 7 8 9 acks = all 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 min.insync.replicas = 3 =99 процесс записи успешная запись
  66. Архитектура Kafka Consumer 0 1 2 3 4 5 6

    7 8 partition 0 partition 1 partition 2 0 1 2 3 4 5 0 1 2 3 4 5 6 7 =101
  67. Архитектура Kafka Consumer 0 1 2 3 4 5 6

    7 8 partition 0 partition 1 partition 2 0 1 2 3 4 5 0 1 2 3 4 5 6 7 =102 след. сообщение
  68. Архитектура Kafka Consumer 0 1 2 3 4 5 6

    7 8 partition 0 partition 1 partition 2 0 1 2 3 4 5 0 1 2 3 4 5 6 7 =103 след. сообщение прочитано
  69. Архитектура Kafka Consumer 0 1 2 3 4 5 6

    7 8 partition 0 partition 1 partition 2 0 1 2 3 4 5 0 1 2 3 4 5 6 7 =104 след. сообщение прочитано
  70. Архитектура Kafka Consumer 0 1 2 3 4 5 6

    7 8 partition 0 partition 1 partition 2 0 1 2 3 4 5 0 1 2 3 4 5 6 7 =105 след. сообщение прочитано
  71. Архитектура Kafka Consumer 0 1 2 3 4 5 6

    7 8 partition 0 partition 1 partition 2 0 1 2 3 4 5 0 1 2 3 4 5 6 7 =106 след. сообщение прочитано
  72. Архитектура Kafka Consumer 0 1 2 3 4 5 6

    7 8 partition 0 partition 1 partition 2 0 1 2 3 4 5 0 1 2 3 4 5 6 7 =107 след. сообщение прочитано
  73. Архитектура Kafka Consumer 0 1 2 3 4 5 6

    7 8 partition 0 partition 1 partition 2 0 1 2 3 4 5 0 1 2 3 4 5 6 7 =108 след. сообщение прочитано
  74. Архитектура Kafka Consumer 0 1 2 3 4 5 6

    7 8 partition 0 partition 1 partition 2 0 1 2 3 4 5 0 1 2 3 4 5 6 7 =109 след. сообщение прочитано
  75. Архитектура Kafka Consumer 0 1 2 3 4 5 6

    7 8 partition 0 partition 1 partition 2 0 1 2 3 4 5 0 1 2 3 4 5 6 7 =110 след. сообщение прочитано
  76. Архитектура Kafka Consumer 0 1 2 3 4 5 6

    7 8 partition 0 partition 1 partition 2 0 1 2 3 4 5 0 1 2 3 4 5 6 7 =111 след. сообщение прочитано
  77. Архитектура Kafka Consumer 0 1 2 3 4 5 6

    7 8 partition 0 partition 1 partition 2 0 1 2 3 4 5 0 1 2 3 4 5 6 7 =112 след. сообщение прочитано
  78. Архитектура Kafka Consumer 0 1 2 3 4 5 6

    7 8 partition 0 partition 1 partition 2 0 1 2 3 4 5 0 1 2 3 4 5 6 7 =113 след. сообщение прочитано
  79. Архитектура Kafka Consumer 0 1 2 3 4 5 6

    7 8 partition 0 partition 1 partition 2 0 1 2 3 4 5 0 1 2 3 4 5 6 7 =114 след. сообщение прочитано
  80. Архитектура Kafka Consumer 0 1 2 3 4 5 6

    7 8 partition 0 partition 1 partition 2 0 1 2 3 4 5 0 1 2 3 4 5 6 7 =115 след. сообщение прочитано
  81. Архитектура Kafka Consumer Commit offset partition 0 0 1 2

    3 4 5 6 7 =118 commit offset прочитано
  82. Архитектура Kafka Consumer Commit offset partition 0 0 1 2

    3 4 5 6 7 =119 commit offset прочитано
  83. Архитектура Kafka Consumer Commit offset partition 0 0 1 2

    3 4 5 6 7 =120 commit offset прочитано
  84. Архитектура Kafka Consumer Commit offset partition 0 0 1 2

    3 4 5 6 7 =121 commit offset прочитано не закоммичено
  85. Архитектура Kafka Consumer Commit offset partition 0 0 1 2

    3 4 5 6 7 =122 commit offset прочитано не закоммичено
  86. Архитектура Kafka Consumer Commit offset partition 0 0 1 2

    3 4 5 6 7 =123 commit offset прочитано не закоммичено
  87. Архитектура Kafka Consumer 0 1 2 3 4 5 6

    7 8 partition 0 partition 1 partition 2 0 1 2 3 4 5 0 1 2 3 4 5 6 7 Consumer Group =124 commit offset прочитано не закоммичено
  88. Архитектура Kafka Consumer 0 1 2 3 4 5 6

    7 8 partition 0 partition 1 partition 2 0 1 2 3 4 5 0 1 2 3 4 5 6 7 Consumer Group =125 commit offset прочитано не закоммичено
  89. Архитектура Kafka Consumer 0 1 2 3 4 5 6

    7 8 partition 0 partition 1 partition 2 0 1 2 3 4 5 0 1 2 3 4 5 6 7 Consumer Group =126 commit offset прочитано не закоммичено
  90. Архитектура Kafka Consumer 0 1 2 3 4 5 6

    7 8 partition 0 partition 1 partition 2 0 1 2 3 4 5 0 1 2 3 4 5 6 7 Consumer Group =127 commit offset прочитано не закоммичено
  91. Архитектура Kafka Consumer 0 1 2 3 4 5 6

    7 8 partition 0 partition 1 partition 2 0 1 2 3 4 5 0 1 2 3 4 5 6 7 Consumer Group =128 commit offset прочитано не закоммичено
  92. Архитектура Kafka Consumer 0 1 2 3 4 5 6

    7 8 partition 0 partition 1 partition 2 0 1 2 3 4 5 0 1 2 3 4 5 6 7 Consumer Group =129 commit offset прочитано не закоммичено
  93. Consumer Group Архитектура Kafka Consumer 0 1 2 3 4

    5 6 7 8 partition 0 partition 1 partition 2 0 1 2 3 4 5 0 1 2 3 4 5 6 7 =130 commit offset прочитано не закоммичено
  94. Consumer Group Архитектура Kafka Consumer 0 1 2 3 4

    5 6 7 8 partition 0 partition 1 partition 2 0 1 2 3 4 5 0 1 2 3 4 5 6 7 =131 commit offset прочитано не закоммичено
  95. Consumer Group Архитектура Kafka Consumer 0 1 2 3 4

    5 6 7 8 partition 0 partition 1 partition 2 0 1 2 3 4 5 0 1 2 3 4 5 6 7 =132 commit offset прочитано не закоммичено
  96. Consumer Group Архитектура Kafka Consumer 0 1 2 3 4

    5 6 7 8 partition 0 partition 1 partition 2 0 1 2 3 4 5 0 1 2 3 4 5 6 7 =133 commit offset прочитано не закоммичено
  97. Consumer Group Архитектура Kafka Consumer 0 1 2 3 4

    5 6 7 8 partition 0 partition 1 partition 2 0 1 2 3 4 5 0 1 2 3 4 5 6 7 =134 commit offset прочитано не закоммичено
  98. Архитектура Kafka Consumer 0 1 2 3 4 5 6

    7 8 partition 0 partition 1 partition 2 0 1 2 3 4 5 0 1 2 3 4 5 6 7 Consumer Group =135 commit offset прочитано не закоммичено
  99. Архитектура Kafka Consumer 0 1 2 3 4 5 6

    7 8 partition 0 partition 1 partition 2 0 1 2 3 4 5 0 1 2 3 4 5 6 7 Consumer Group =136 commit offset прочитано не закоммичено
  100. Архитектура Kafka Consumer 0 1 2 3 4 5 6

    7 8 partition 0 partition 1 partition 2 0 1 2 3 4 5 0 1 2 3 4 5 6 7 Consumer Group =137 commit offset прочитано не закоммичено
  101. МЫ ХОТИМ ВЫБРАТЬ POSTGRESQL ДЛЯ НОВОГО ПРОЕКТА… НЕТ! УЖЕ ЕСТЬ

    KAFKA!!! НО У НАС ВСЕГО 100-500 RPS… ТОЛЬКО KAFKA!!! И НЕЧЕГО ДУМАТЬ!! Я =143
  102. МЫ ХОТИМ ВЫБРАТЬ POSTGRESQL ДЛЯ НОВОГО ПРОЕКТА… НЕТ! УЖЕ ЕСТЬ

    KAFKA!!! НО У НАС ВСЕГО 100-500 RPS… ТОЛЬКО KAFKA!!! И НЕЧЕГО ДУМАТЬ!! … И ДАННЫЕ В ОБЩЕМ-ТО РЕЛЯЦИОННЫЕ… Я =144
  103. МЫ ХОТИМ ВЫБРАТЬ POSTGRESQL ДЛЯ НОВОГО ПРОЕКТА… НЕТ! УЖЕ ЕСТЬ

    KAFKA!!! НО У НАС ВСЕГО 100-500 RPS… ТОЛЬКО KAFKA!!! И НЕЧЕГО ДУМАТЬ!! KAFKA! KAFKA! KAFKA! … И ДАННЫЕ В ОБЩЕМ-ТО РЕЛЯЦИОННЫЕ… Я =145
  104. Неочевидности в Kafka … или что мы пережили за год

    эксплуатации (в очень кратком изложении) =148
  105. Настройки – Как разломать кластер log.dirs unclean.leader.election.enable=false KIP-106 - Change

    Default unclean.leader.election.enabled from True to False (0.11) =156 0 1 2 3 4 5 6 7 replica 0 replica 1 0 1 2 3 4 5 6 7 8
  106. Настройки – Как разломать кластер log.dirs =159 0 1 2

    3 4 5 6 7 replica 0 replica 1 Брокер упал ☹
  107. Настройки – Настройки по умолчанию (2) - Настройки Broker, Consumer

    и Producer должны быть
 согласованы - message.max.bytes =168
  108. Настройки – Настройки по умолчанию (2) - Настройки Broker, Consumer

    и Producer должны быть
 согласованы - message.max.bytes (Broker, 1_000_012) =169
  109. Настройки – Настройки по умолчанию (2) - Настройки Broker, Consumer

    и Producer должны быть
 согласованы - message.max.bytes (Broker, 1_000_012) - max.request.size =170
  110. Настройки – Настройки по умолчанию (2) - Настройки Broker, Consumer

    и Producer должны быть
 согласованы - message.max.bytes (Broker, 1_000_012) - max.request.size (Producer, 1_048_576) =171
  111. Настройки – Настройки по умолчанию (2) - Настройки Broker, Consumer

    и Producer должны быть
 согласованы - message.max.bytes (Broker, 1_000_012) - max.request.size (Producer, 1_048_576) - max.partition.fetch.bytes (Consumer, 1_048_576) =172
  112. Настройки – Умножение - message.max.bytes (Broker, 1_000_012) - max.request.size (Producer,

    1_048_576) - max.partition.fetch.bytes (Consumer, 1_048_576) - batch.size (Producer, 16_384) =174
  113. Настройки – Умножение - message.max.bytes (Broker, 1_000_012) - max.request.size (Producer,

    1_048_576) - max.partition.fetch.bytes (Consumer, 1_048_576) - batch.size (Producer, 16_384) - KIP-126 - Allow KafkaProducer to split and resend oversized batches (0.11) =175
  114. API – Блокирующий send - Если мета-данные не доступны –

    producer.send() блокируется - max.block.ms = 60_000 =178
  115. API – Блокирующий send - Если мета-данные не доступны –

    producer.send() блокируется - max.block.ms = 60_000 - KIP-286: producer.send() should not block on metadata update (discuss) =179
  116. API – Бесконечная десериализация =181 while(true) {
 ConsumerRecords<Key, Event> records

    =
 consumer.poll(1_000); for (var record : records) {
 /* do something */ } }
  117. API – Бесконечная десериализация =182 try { /* parsing */


    } catch (RuntimeException e) {
 throw new SerializationException( "Error deserializing key/value for partition " + partition + " at offset " + record.offset() + ". If needed, please seek past the record to continue consumption.", e);
 }

  118. API – Бесконечная десериализация =183 try { /* parsing */


    } catch (RuntimeException e) {
 throw new SerializationException( "Error deserializing key/value for partition " + partition + " at offset " + record.offset() + ". If needed, please seek past the record to continue consumption.", e);
 }
 consumer.seek(partition, offset);
  119. API – Бесконечная десериализация =184 try { /* parsing */


    } catch (RuntimeException e) {
 throw new SerializationException( "Error deserializing key/value for partition " + partition + " at offset " + record.offset() + ". If needed, please seek past the record to continue consumption.", e);
 }
 consumer.seek(partition, offset); 0 1 2 3 4 5 6 7 8
  120. API – Бесконечная десериализация =185 try { /* parsing */


    } catch (RuntimeException e) {
 throw new SerializationException( "Error deserializing key/value for partition " + partition + " at offset " + record.offset() + ". If needed, please seek past the record to continue consumption.", e);
 }
 consumer.seek(partition, offset); 0 1 2 3 4 5 6 7 8
  121. API – Бесконечная десериализация =186 try { /* parsing */


    } catch (RuntimeException e) {
 throw new SerializationException( "Error deserializing key/value for partition " + partition + " at offset " + record.offset() + ". If needed, please seek past the record to continue consumption.", e);
 }
 consumer.seek(partition, offset); 0 1 2 3 4 5 6 7 8
  122. API – Бесконечная десериализация =187 try { /* parsing */


    } catch (RuntimeException e) {
 throw new SerializationException( "Error deserializing key/value for partition " + partition + " at offset " + record.offset() + ". If needed, please seek past the record to continue consumption.", e);
 }
 consumer.seek(partition, offset); 0 1 2 3 4 5 6 7 8
  123. API – Бесконечная десериализация =188 try { /* parsing */


    } catch (RuntimeException e) {
 throw new SerializationException( "Error deserializing key/value for partition " + partition + " at offset " + record.offset() + ". If needed, please seek past the record to continue consumption.", e);
 }
 consumer.seek(partition, offset); 0 1 2 3 4 5 6 7 8
  124. API – Бесконечная десериализация =189 try { /* parsing */


    } catch (RuntimeException e) {
 throw new SerializationException( "Error deserializing key/value for partition " + partition + " at offset " + record.offset() + ". If needed, please seek past the record to continue consumption.", e);
 }
 consumer.seek(partition, offset); 0 1 2 3 4 5 6 7 8
  125. API – Бесконечная десериализация =191 Наш выбор: кастомный десериализатор, который

    вернёт null
 в случае ошибки while(true) {
 ConsumerRecords<Key, Event> records =
 consumer.poll(1_000); for (var record : records) { if (record.getValue() == null) { continue; }
 /* do something */ } }
  126. API – Бесконечная десериализация =192 Наш выбор: кастомный десериализатор, который

    вернёт null
 в случае ошибки while(true) {
 ConsumerRecords<Key, Event> records =
 consumer.poll(1_000); for (var record : records) { if (record.getValue() == null) { continue; }
 /* do something */ } }
  127. Чтение по 3 сообщения API – НЕчестное чтение 0 1

    2 3 4 5 6 7 8 partition 0 partition 1 partition 2 0 1 2 3 4 5 0 1 2 3 4 5 6 7 =194
  128. Чтение по 3 сообщения API – НЕчестное чтение 0 1

    2 3 4 5 6 7 8 partition 0 partition 1 partition 2 0 1 2 3 4 5 0 1 2 3 4 5 6 7 =195
  129. Чтение по 3 сообщения API – НЕчестное чтение 0 1

    2 3 4 5 6 7 8 partition 0 partition 1 partition 2 0 1 2 3 4 5 0 1 2 3 4 5 6 7 =196
  130. Чтение по 3 сообщения API – НЕчестное чтение 0 1

    2 3 4 5 6 7 8 partition 0 partition 1 partition 2 0 1 2 3 4 5 0 1 2 3 4 5 6 7 =197
  131. Чтение по 3 сообщения API – НЕчестное чтение 0 1

    2 3 4 5 6 7 8 partition 0 partition 1 partition 2 0 1 2 3 4 5 0 1 2 3 4 5 6 7 =198
  132. API – НЕчестное чтение - KIP-41: KafkaConsumer Max Records (0.10)

    - Жадный round-robin - KIP-387: Fair Message Consumption Across Partitions in KafkaConsumer (discuss) =201
  133. Рутина – Место на диске - Нет автораспределения партиций по

    новым дискам - KIP-113: Support replicas movement between log directories (1.1) =208
  134. Рутина – Место на диске - Нет автораспределения партиций по

    новым дискам - KIP-113: Support replicas movement between log directories (1.1) - Равномерное распределение партиций по количеству =209
  135. Рутина – Место на диске - Нет автораспределения партиций по

    новым дискам - KIP-113: Support replicas movement between log directories (1.1) - Равномерное распределение партиций по количеству - KIP-178: Size-based log directory selection strategy (discuss) =210
  136. Рутина – Новый Брокер - Нет автораспределения партиций на нового

    Брокера - Руками делать partition reassignment =214 { "version": 1, "partitions": [ { "topic": "topic", "partition" : partition, "replicas": [brokerIds] }, ... ] }
  137. Рутина – Новый Брокер - Нет автораспределения партиций на нового

    Брокера - Руками делать partition reassignment =215 { "version": 1, "partitions": [ { "topic": "topic", "partition" : partition, "replicas": [brokerIds] }, ... ] }
  138. Рутина – Новый Брокер - Нет автораспределения партиций на нового

    Брокера - Руками делать partition reassignment =216 { "version": 1, "partitions": [ { "topic": "hg2tg", "partition" : partition, "replicas": [brokerIds] }, ... ] }
  139. Рутина – Новый Брокер - Нет автораспределения партиций на нового

    Брокера - Руками делать partition reassignment =217 { "version": 1, "partitions": [ { "topic": "hg2tg", "partition" : 42, "replicas": [brokerIds] }, ... ] }
  140. Рутина – Новый Брокер =218 { "version": 1, "partitions": [

    { "topic": "hg2tg", "partition" : 42, "replicas": [1, 2, 3] }, ... ] }
  141. Рутина – Новый Брокер - Preferred leader – первый брокер

    в списке реплик =219 { "version": 1, "partitions": [ { "topic": "hg2tg", "partition" : 42, "replicas": [1, 2, 3] }, ... ] }
  142. Выводы - Внимательное отношение к настройкам - Особенности (недоработки?) клиентского

    API - Большое количество рутины - Документация о многом умалчивает =224
  143. Выводы - Внимательное отношение к настройкам - Особенности (недоработки?) клиентского

    API - Большое количество рутины - Документация о многом умалчивает - Kafka – лучшее, что есть… =225
  144. Выводы - Внимательное отношение к настройкам - Особенности (недоработки?) клиентского

    API - Большое количество рутины - Документация о многом умалчивает - Kafka – лучшее, что есть… И она классная =226
  145. МНОГО ЖЕ ВСЕГО!
 ДАВАЙ ДЕТАЛИ! ОБЕЩАЮТ ХАЙЛОАД, БИГ-ДАТУ, ВОТ ЭТО

    ВСЁ! Я =231 НОВЫЙ ПРОЕКТ НАМЕЧАЕТСЯ, ДУМАЕМ НАД ВЫБОРОМ ТЕХНОЛОГИЙ…
  146. А-А-А!
 К ЧЁРТУ ВСЁ!!! Я ОБЕЩАЮТ ХАЙЛОАД, БИГ-ДАТУ, ВОТ ЭТО

    ВСЁ! МНОГО ЖЕ ВСЕГО!
 ДАВАЙ ДЕТАЛИ! =232 НОВЫЙ ПРОЕКТ НАМЕЧАЕТСЯ, ДУМАЕМ НАД ВЫБОРОМ ТЕХНОЛОГИЙ…
  147. KAFKA! KAFKA! KAFKA! Я НОВЫЙ ПРОЕКТ НАМЕЧАЕТСЯ, ДУМАЕМ НАД ВЫБОРОМ

    ТЕХНОЛОГИЙ… А-А-А!
 К ЧЁРТУ ВСЁ!!! ОБЕЩАЮТ ХАЙЛОАД, БИГ-ДАТУ, ВОТ ЭТО ВСЁ! МНОГО ЖЕ ВСЕГО!
 ДАВАЙ ДЕТАЛИ! =233
  148. Консистентность и доступность 0 1 2 3 4 5 6

    7 8 replica 0 replica 1 replica 2 0 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 8 =235
  149. Консистентность и доступность 0 1 2 3 4 5 6

    7 8 replica 0 replica 1 replica 2 0 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 8 acks = 1 =236
  150. Консистентность и доступность 0 1 2 3 4 5 6

    7 8 replica 0 replica 1 replica 2 0 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 8 acks = 1 =237 процесс записи успешная запись недоступность
  151. Консистентность и доступность 0 1 2 3 4 5 6

    7 8 replica 0 replica 1 replica 2 0 1 2 3 4 5 6 7 8 acks = 1 0 1 2 3 4 5 6 7 8 9 =238 процесс записи
  152. Консистентность и доступность 0 1 2 3 4 5 6

    7 8 replica 0 replica 1 replica 2 0 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 8 9 acks = 1 =239 процесс записи успешная запись
  153. Консистентность и доступность replica 0 replica 1 replica 2 0

    1 2 3 4 5 6 7 8 9 acks = 1 0 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 8 =240 процесс записи успешная запись
  154. Консистентность и доступность replica 0 replica 1 replica 2 0

    1 2 3 4 5 6 7 8 9 acks = 1 0 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 8 =241 процесс записи успешная запись недоступность
  155. Консистентность и доступность replica 0 replica 1 replica 2 0

    1 2 3 4 5 6 7 8 9 acks = 1 0 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 8 =242 процесс записи успешная запись недоступность
  156. unclean leader election Консистентность и доступность replica 0 replica 1

    replica 2 0 1 2 3 4 5 6 7 8 9 acks = 1 0 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 8 =243 процесс записи успешная запись недоступность
  157. unclean leader election (но это не точно) Консистентность и доступность

    replica 0 replica 1 replica 2 0 1 2 3 4 5 6 7 8 9 acks = 1 0 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 8 =244 процесс записи успешная запись недоступность
  158. Консистентность и доступность 0 1 2 3 4 5 6

    7 8 replica 0 replica 1 replica 2 0 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 8 acks = all min.insync.replicas = 3 =245 процесс записи успешная запись недоступность
  159. Консистентность и доступность replica 0 replica 1 replica 2 0

    1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 8 =246 acks = all min.insync.replicas = 3 процесс записи успешная запись недоступность
  160. Консистентность и доступность replica 0 replica 1 replica 2 0

    1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 8 =247 acks = all min.insync.replicas = 3 процесс записи успешная запись недоступность
  161. Консистентность и доступность replica 0 replica 1 replica 2 0

    1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 8 =248 процесс записи успешная запись недоступность
  162. Консистентность и доступность 0 1 2 3 4 5 6

    7 8 replica 0 replica 1 replica 2 0 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 8 acks = all min.insync.replicas = 2 =249 процесс записи успешная запись недоступность
  163. Консистентность и доступность replica 0 replica 1 replica 2 0

    1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 8 =250 acks = all min.insync.replicas = 2 процесс записи успешная запись недоступность
  164. Консистентность и доступность replica 0 replica 1 replica 2 0

    1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 8 =251 acks = all min.insync.replicas = 2 процесс записи успешная запись недоступность
  165. Консистентность и доступность replica 0 replica 1 replica 2 0

    1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 8 =252 acks = all min.insync.replicas = 2 процесс записи успешная запись недоступность
  166. Консистентность и доступность replica 0 replica 1 replica 2 0

    1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 8 9 =253 acks = all min.insync.replicas = 2 процесс записи успешная запись недоступность
  167. Консистентность и доступность replica 0 replica 1 replica 2 0

    1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 8 9 =254 acks = all min.insync.replicas = 2 процесс записи успешная запись недоступность
  168. Консистентность и доступность replica 0 replica 1 replica 2 0

    1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 8 9 =255 acks = all min.insync.replicas = 2 процесс записи успешная запись недоступность
  169. Консистентность и доступность 0 1 2 3 4 5 6

    7 8 replica 0 replica 1 replica 2 0 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 8 =256 acks = all min.insync.replicas = 2 процесс записи успешная запись недоступность
  170. Консистентность и доступность replica 0 replica 1 replica 2 0

    1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 8 =257 acks = all min.insync.replicas = 2 процесс записи успешная запись недоступность
  171. Консистентность и доступность replica 0 replica 1 replica 2 0

    1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 8 =258 acks = all min.insync.replicas = 2 процесс записи успешная запись недоступность
  172. Консистентность и доступность replica 0 replica 1 replica 2 0

    1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 8 =259 acks = all min.insync.replicas = 2 процесс записи успешная запись недоступность
  173. Консистентность и доступность replica 0 replica 1 replica 2 0

    1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 8 =260 acks = all min.insync.replicas = 2 процесс записи успешная запись недоступность
  174. Консистентность и доступность replica 0 replica 1 replica 2 0

    1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 8 =261 acks = all min.insync.replicas = 2 процесс записи успешная запись недоступность
  175. Консистентность и доступность replica 0 replica 1 replica 2 0

    1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 8 =262 acks = all min.insync.replicas = 2 процесс записи успешная запись недоступность
  176. Консистентность и доступность replica 0 replica 1 replica 2 0

    1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 8 =263 acks = all min.insync.replicas = 2 процесс записи успешная запись недоступность
  177. Консистентность и доступность replica 0 replica 1 replica 2 0

    1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 8 =264 acks = all min.insync.replicas = 2 процесс записи успешная запись недоступность
  178. Консистентность и доступность replica 0 replica 1 replica 2 0

    1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 =265 acks = all min.insync.replicas = 2 процесс записи успешная запись недоступность
  179. Консистентность и доступность replica 0 replica 1 replica 2 0

    1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 =266 acks = all min.insync.replicas = 2 процесс записи успешная запись недоступность