Фон
У меня есть сервер веб-API (asp.net core v2.1), который выполняет некоторые основные операции, например, управление объектами на сервере.Это интерфейс:
[HttpPost]
[Route("create")]
public async Task<ActionResult<NewEntityResponse>> Create(CreateEntityModel model)
{
// 1) Validate the request.
// 2) Create a new row on the database
// 3) Return the new entity in response.
}
Пользователь, выполняющий этот метод REST следующим образом:
POST https://example.com/create
Content-Type: application/json
{
"firstName": "Michael",
"lastName": "Jorden"
}
И получает ответ, подобный этому:
Status 200
{
"id": "123456" // The newly created entity id
}
Проблема
При отправке тысяч таких запросов в определенный момент произойдет сбой из-за сетевых подключений.При сбое соединения это может привести нас к двум различным ситуациям:
- Сетевой вызов был завершен на пути к серверу - в этом случае сервер не знает об этом запросе.Следовательно, сущность не была создана.Пользователь просто должен отправить то же сообщение еще раз.
- Сетевой вызов был отправлен с сервера обратно клиенту, но никогда не насыщал адресата - в этом случае запрос был выполнен полностью, но клиент неЗнаю об этом.Ожидаемое решение - отправить тот же запрос еще раз.В этом случае он создаст одну и ту же сущность дважды - и это проблема.
Запрошенное решение
Я хочу создать общее решение дляweb-api, тот «remmeber», который командует, это уже сделано.если он получил один и тот же запрос дважды, он возвращает код состояния HTTP Conflict
.
Где я дошел до этого
Я подумал добавить клиенту опцию добавления уникального идентификатора в запрос,таким образом:
POST https://example.com/create?call-id=XXX
Добавьте на мой сервер новый фильтр, который проверяет, выполняется ли ключ XXX
.Если да, верните Conflict
.В противном случае - продолжить.
Добавить еще один серверный фильтр, который проверяет ответ метода и помечает его как «завершенный» для дальнейших проверок.
Проблема с этим решением для вызовов параллелизма.Если мой метод требует 5 секунд для возврата, и клиент снова отправил то же сообщение через 1 секунду - он создаст две сущности с одинаковыми данными.
Вопросы:
- Считаете ли вы, что это хороший подход для решения этой проблемы?
- Вы знакомы с готовыми к использованию решениями, которые делают это?
- Как решить мою проблему "параллелизма"?
- Любые другие советы будут отличными!
спасибо.