События, очереди и потоки
Как повторить доставку без повторного бизнес-эффекта?
Содержание слайдов
1. События, очереди и потоки
Как повторить доставку без повторного бизнес-эффекта?
2. Повторяется доставка, а не бизнес-намерение
Одно событие сохраняет идентичность во всех попытках.
3. Хранение, доставка и эффект происходят отдельно
Каждый этап имеет собственное подтверждение.
4. Подтверждения отвечают на разные вопросы
Publisher ACK и consumer ACK не взаимозаменяемы.
5. Порядок журнала не равен порядку завершения
Параллельные исполнители меняют наблюдаемый порядок.
6. Распределение работы требует явного лимита
Незавершённые сообщения занимают ресурсы.
7. Хранение определяет окно повторного чтения
Очередь не является бесконечной историей.
8. Позиция потребителя не хранит бизнес-результат
Прогресс брокера и состояние etcd различаются.
9. Ранний ACK способен потерять задачу
Падение после подтверждения оставляет пустой результат.
10. Поздний ACK делает повтор нормальным
Результат уже есть, подтверждение ещё неизвестно.
11. Ключ дедупликации обозначает логическое действие
Он переживает рестарт и повтор доставки.
12. Эффект и память о нём фиксируются вместе
etcd Txn объединяет три изменения.
13. Одновременные повторы встречаются в одной проверке
Только одна успешная ветка создаёт эффект.
14. ACK следует за подтверждённым локальным исходом
При неизвестном commit сначала читаем состояние.
15. Повтор читает прежний результат
Код запускается снова, запись эффекта остаётся одна.
16. Внешний эффект требует отдельного протокола
Оплату нельзя включить в локальный etcd Txn.
17. Relay завершает намерение после публикации
Неопределённость оставляет возможность повтора.
18. Порядок сущности выражается в её состоянии
Событие должно соответствовать ожидаемому переходу.
19. Параллельность требует допустимых перестановок
Независимость проверяется по эффекту, а не по времени.
20. Повторное чтение имеет собственную цель
Повтор эффекта и построение проекции различаются.
21. Очистка памяти сужает гарантию повтора
Срок dedup согласуется с возможным replay.
22. Невыполнимая задача требует явного исхода
Бесконечный повтор не является восстановлением.
23. Отставание связывает вход и мощность обработки
Если вход быстрее, очередь растёт.
24. Восстановите обработчик после двух падений
Проверьте результат и память о нём.
Разобрать commit до ACK
Учесть конкурентный повтор
Проверить очистку dedup
25. Безопасный повтор замыкает всю цепочку
Каждая граница имеет устойчивое продолжение.
26. Решения для нашего сервиса
Разделить сохранение, доставку, выполнение и ACK.
Построить атомарный обработчик с дедупликацией.
Обосновать порядок обработки и срок памяти о событии.