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

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

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

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

Баги гарантий доставки находят в коде консьюмера, в 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)              # already done, skip
    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)   # external dedup
    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%   (no deploy in this window)
  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.