Проверяет понимание идемпотентности, конкурентных запросов и бизнес-инвариантов.
Уникальный индекс помогает избежать дублирования данных, но не гарантирует корректную идемпотентность бизнес-операции. Между проверкой и записью могут возникать гонки, а часть побочных эффектов уже может быть выполнена.
Многие разработчики считают, что достаточно создать уникальный индекс:
CREATE UNIQUE INDEX idx_order_id ON orders(order_id);и проблема идемпотентности решена.
На практике это не так.
Представим сценарий:
Приходит запрос на создание заказа.
Заказ успешно создаётся.
После этого отправляется событие в Kafka.
Сервис падает.
Клиент делает повторный запрос.
Уникальный индекс защитит таблицу от дубля заказа, но:
событие может быть отправлено повторно;
письмо пользователю может уйти второй раз;
деньги могут списаться повторно.
Поэтому идемпотентность обычно строится через:
idempotency key;
таблицу обработанных операций;
outbox pattern;
атомарную запись результата операции.
Пример:
CREATE TABLE idempotency_keys (
key TEXT PRIMARY KEY,
response JSONB
);При повторном запросе возвращается сохранённый результат.
Вывод:
Уникальный индекс - это лишь один из инструментов идемпотентности, но не полноценное решение.
Уровень
Рейтинг:
4
Сложность:
7
Навыки
Golang
Postgres
Ключевые слова
Подпишись на Golang Developer в телеграм