Как должен обрабатываться ответ 409 микросервисом? - PullRequest
2 голосов
/ 23 января 2020

Рассмотрим два микросервиса "A" и "B". Скажем, «A» выполняет POST-вызов к «B», а «B» выполняет операцию, которая проверяет дубликат запроса на основе некоторого идентификатора. Если операция прошла успешно, «B» возвращает ответ 200 OK. Если «B» обнаруживает, что запрос был дубликатом, он возвращает 409.

. Теперь рассмотрим сценарий, в котором «A» выполняет POST-вызов To «B». «B» успешно обрабатывает, но прежде чем он сможет ответить, время соединения истекает, а «A» получает 504 код ошибки тайм-аута. Когда служба «А» повторяет запрос, на этот раз «В» распознает его как дублирующий запрос и возвращает ответ 409, поскольку он успешно обработал первый запрос, сделанный «А». В этом случае должна ли служба «А» рассматривать это как ошибку, которая не подлежит повторению, или она должна рассматривать это как успех (при условии, что первый запрос был успешно обработан)?

Ответы [ 2 ]

0 голосов
/ 27 января 2020

Я прочитал из вашего Q, что B распознает следующий вызов как дубликат, хотя тайм-аут произошел. Во-первых, не полагайтесь на него как на успех. Я бы предпочел посмотреть, где это состояние поддерживается? Как долго оно хранится, в случае тайм-аута либо это состояние может быть освобождено, либо должна быть запущена проверка от А до В, чтобы узнать, была ли эта транзакция действительно успешной? Например, информация о клиенте A Posts, время ожидания B. Теперь, прежде чем повторить попытку, вызовите getCustomerInfo (cusomerName, customerId, x, y, z, ...), чтобы убедиться в том, что, несмотря на истечение времени ожидания, публикация прошла успешно в конце.

Кроме того, вы, возможно, захотите сделать глубокое погружение, чтобы узнать, какова длительность удержания, состояние дублированного идентификатора в B, и можете ли вы работать с командой B, чтобы это было выпущено раньше, чтобы продолжить. ?

Я также вижу возможность поставить эту хореографию между командами микросервисов A и B, и в таких случаях служба очередей может оказаться очень полезной (только если это часто встречающаяся ситуация).

0 голосов
/ 23 января 2020

... "B" распознает это как дублирующий запрос и возвращает ответ 409 ... В этом случае служба "A" должна рассматривать это как ошибку, которая не подлежит повторению, или должна считать это успешной ...

Может ли звонящий сделать четкие выводы относительно того, был ли статус 409 вызван "успехом" их предыдущего вызова или "конфликтом" другого рода? Я не знаю, но я, вероятно, не хотел бы, чтобы моя обработка зависела от этого.

Сомнительно, чтобы какой-либо статус ответа 4xx считался «повторяющимся». По моему мнению, обработка должна предполагать, что вызов потерпел неудачу навсегда.

...