Я отправляю массовые электронные письма на корпоративный сервер обмена, используя клиентское приложение, написанное на С#.
Может случиться, и это произошло, что тайм-аут клиентского приложения (а не сервера). Поскольку невозможно узнать, выполнил ли сервер запрос, как обрабатывать повторные попытки в этом случае?
Нет никаких идентификаторов, которые можно было бы использовать, чтобы избежать дублирования. Установка длительных тайм-аутов или даже бесконечных тайм-аутов не является хорошей политикой.
Я использую экспоненциальный алгоритм отсрочки для повторной попытки. В этом случае он должен отправить только один дубликат, потому что в следующий раз он будет ждать дольше.
Я думаю, что нет решения для пули. В любом случае, поскольку это первый проект такого рода, мне нужно проверить, есть ли у кого-то решение, которое я пропустил.
Обновление: биржа выполняет ретрансляцию. Я использую SmtpClient для отправки электронной почты. Проблема в том, что сервер может отправить сообщение 250 Ok, но получатель никогда его не получит, а затем повторит попытку. Это единственная проблема, которую я пытаюсь решить в этом посте.
В службах Rest рекомендуется использовать ошибку параллелизма. Если клиент публикует что-то и получает статус "409 - конфликт", это означает, что сообщение уже было сохранено на сервере. Но для этого должен быть ключ к сообщению, которое создается клиентом и является частью сообщения. У SMTP, похоже, нет механизма, который мог бы это предотвратить.