Как реализовать гарантию доставки ровно один раз
Python
Middle
Без компании
Как реализовать гарантию доставки ровно один раз
Ответы
Для гарантии доставки ровно один раз (exactly-once) можно использовать идемпотентные операции и механизмы дедупликации. Вот основные подходы:
- **Идемпотентность** - операция даёт одинаковый результат при повторных вызовах:
```
def process_order(order_id, data):
if Order.objects.filter(id=order_id).exists():
return # уже обработан
# логика обработки
```
- **Токены дедупликации** - генерируем уникальный ID для каждой операции:
```
from uuid import uuid4
def handle_request(request_id, data):
if cache.get(request_id):
return
cache.set(request_id, True)
# обработка данных
```
- **Транзакции и журналирование** - используем БД с транзакциями:
```
with transaction.atomic():
if not Message.objects.filter(id=msg_id).exists():
Message.objects.create(id=msg_id, ...)
# бизнес-логика
```
Для распределённых систем можно использовать паттерны вроде:
- Двухфазных коммитов
- Outbox-паттерна
- Подтверждений от потребителя (ack/nack)
Важно учитывать trade-off между надёжностью и производительностью.