событие содержит correlation_id
- перед тем как отпустить событие в бизнес-логику, обработчик запрашивает у некоторого хранилища ответ по ключу correlation_id
- если возвращается true - корреляция, данное событие было обработано - бизнес-логику можно не запускать, рапортуем об ошибке, отпускаем код до следующего события
- если возвращается false - корреляции не было, событие можно пустить в бизнес-логику
- записываем в хранилище по ключу correlation_id
представим себе, что хранилищем будет выступать memory cache с TTL объекта в 10 минут; предполагается, что данное решение сможет защитить сервер от случайных дублей запросов (необработанный на фронте double click по кнопке, например) с клиентской стороны.
вопросы:
- достаточно ли TTL в 10 минут на первый взгляд, или можно взять что-нибудь поменьше (например 1 мин)?
- какие слабые стороны в подобном решении вы видите?
Ты ограничил время любого бизнес процесса на 10мин/количество ретраев
Имхо, но если фронт грешит часто повторными запросами, то это фиговый фронт
Ну и опять же, никто тут не защитился от параллельной обработки одного и того же id. Оба обработчика получат false от кэша и пойдут работать. Надо делать атомарное чтение с локом
Запись в хранилище должна идти с консистентностью ALL, то есть чтобы все ноды твоего кэша или получили этот ID, или нет. Иначе возможны варианты грязного чтения
Обсуждают сегодня