open atlas
↑ К треку
Очереди, потоки, события QUE · 01 · 09

Гарантии доставки: чтение кода и логов

Читай реальный код консьюмера, SQL и строку метрики, предсказывай поведение гарантий доставки и выбирай фикс с наибольшим рычагом, который senior делает первым.

QUE Senior ◷ 14 min
Уровень
ОсновыJuniorMiddleSenior

Баги гарантий доставки находят в коде консьюмера, в SQL и в строке метрики — редко в брокере. Прочитай каждый сниппет, предскажи, откуда дубликат или потеря, затем выбери фикс, к которому senior тянется первым.

Цель

Отработай цикл, который запускаешь в каждом инциденте двойного списания: прочитай хендлер, найди окно краша или гонку и тянись к структурному фиксу, а не к подкрутке таймаута.

Сниппет 1 — консьюмер SELECT-then-act

def handle(msg):
    if db.execute("SELECT 1 FROM processed WHERE msg_id=%s", msg.id):
        return ack(msg)              # уже обработано, пропускаем
    stripe.charge(msg.amount)        # side effect — побочный эффект
    db.execute("INSERT INTO processed (msg_id) VALUES (%s)", msg.id)
    ack(msg)
Викторина

Два консьюмера получают одно сообщение при ребалансе. Что происходит и какой фикс с наибольшим рычагом?

Сниппет 2 — транзакционный дедуп

BEGIN;
  INSERT INTO processed (msg_id) VALUES ('msg-7a3f');  -- UNIQUE(msg_id)
  UPDATE orders SET status = 'paid' WHERE id = 'O-123';
COMMIT;
-- on UNIQUE violation: ROLLBACK, log "duplicate", ack the broker
Викторина

Консьюмер делает COMMIT этой транзакции, затем падает до ack брокеру. Что происходит при передоставке?

Сниппет 3 — консьюмер с внешним API

def handle(msg):
    resp = stripe.charge(msg.amount,
                         idempotency_key=msg.id)   # внешний дедуп на стороне Stripe
    db.execute("UPDATE intents SET charge_id=%s WHERE msg_id=%s",
               resp.id, msg.id)
    ack(msg)
Викторина

Вызов Stripe удался, затем процесс умирает до UPDATE и ack. Брокер передоставляет через минуты. Каково реальное поведение?

Сниппет 4 — метрика дедупа

metric: dedup_check_hit_rate
  steady state: 0.05%
  14:02-14:12 : 8.0%   (деплоев в этом окне не было)
  14:13+      : 0.06%
Викторина

Читая эту метрику, что вероятнее всего случилось — и это ли аварийная ситуация корректности?

Итог

Каждый инцидент гарантий доставки читается в коде, SQL и метриках: SELECT-then-act гонится при одновременной доставке; INSERT-first в одной транзакции делает передоставку безвредной; Idempotency-Key, выведенный из стабильного ID сообщения, расширяет дедуп через внешний API; а скачок dedup_hit_rate означает, что брокер передоставляет, а не что дедуп сломался. Диагностируй окно краша или гонку, примени структурный фикс (атомарный дедуп, стабильный idempotency-ключ), затем подтверди, что путь дубликата закрыт — прежде чем трогать хоть один таймаут.

Что-то непонятно?

Задай вопрос по этому уроку. Вопросы анонимны и попадают напрямую автору — урок станет лучше.

хоткеи развернуть
поиск
K
пред. пьеса
k
след. пьеса
j
тиры
t
это меню
?
sources3
expand
  1. 01
  2. 02
  3. 03

Trademarks belong to their respective owners. Editorial reference only.