awesome-everything EN
↑ Обратно к восхождению

Очереди, потоки, события

Порядок сообщений: чтение кода и конфига

Суть Читай реальные сниппеты продюсера и consumer'а, предскажи поведение порядка и выбери фикс с наибольшим рычагом, который senior сделает первым.
Высота — путь к senior
НольJuniorMiddleSenior
Ты на senior-высоте — в орбите
◷ 14 min

Баги порядка живут в конфиге продюсера и обработчике consumer’а, а не в брокере. Читай код, предсказывай, где порядок ломается, и выбирай фикс, к которому senior потянется первым.

Цель

Отработай цикл, который запускаешь на каждом инциденте порядка: читай partition key и конфиг продюсера, найди, где два сообщения могут погнаться или поменяться местами, и тянись к структурному фиксу — выбор ключа, идемпотентный продюсер, version guard — прежде чем винить брокер.

Сниппет 1 — partition key

// События одного аккаунта должны оставаться упорядоченными друг относительно друга.
ProducerRecord<String, Event> record =
    new ProducerRecord<>("account-events", UUID.randomUUID().toString(), event);
producer.send(record);
Викторина

Требование — порядок по аккаунту. Что на самом деле делает этот выбор ключа и каков фикс?

Сниппет 2 — конфиг продюсера

enable.idempotence=false
max.in.flight.requests.per.connection=5
retries=10
acks=all
Викторина

Ключ верный, и всё на одной partition. Почему два сообщения всё равно могут поменяться местами и каков фикс в одну строку?

Сниппет 3 — обработчик consumer’а

def handle(msg):
    user = db.get(msg.user_id)
    user.name = msg.new_name      # last write wins на том, что пришло последним
    db.save(user)
Викторина

Consumer'ы конкурентны на at-least-once очереди. Два обновления одного пользователя могут прийти не по порядку или дважды. Каков самый сильный фикс?

Сниппет 4 — DLQ replay

# Ночная задача: дренировать dead-letter queue обратно в основной топик
for failed in dead_letter_queue.drain_all():
    main_topic.produce(failed.key, failed.value)   # на полной скорости, без троттлинга
Викторина

Consumer идемпотентен и version-guard'нут. Что всё равно делает этот replay с живым порядком и как запускать его безопасно?

Итог

Порядок читается в продюсере и consumer’е, а не в брокере: случайный partition key разбрасывает события сущности и должен быть границей консистентности; неидемпотентный продюсер с несколькими in-flight переупорядочивает у источника, чинится через enable.idempotence=true; конкурентным consumer’ам на at-least-once очереди нужен per-entity version guard, а не только транзакция или дедуп; DLQ replay переупорядочивает против живого трафика, безопасен при version guard, но только с rate-limit. Сначала чини структуру, потом проверяй, что порядок держится под нагрузкой.

Продолжить восхождение ↑Порядок сообщений: построй consumer, переживающий порядок
хоткеи развернуть
поиск
K
пред. пьеса
k
след. пьеса
j
тиры
t
это меню
?
sources2
expand
  1. 01
  2. 02

Trademarks belong to their respective owners. Editorial reference only.