Я ищу некоторые мнения здесь, я создаю веб-приложение, которое имеет довольно стандартную функциональность:
- Зарегистрируйтесь, заполнив и отправив форму.
- Получите письмо со ссылкой для подтверждения кода
- Нажмите на ссылку, чтобы подтвердить новую учетную запись и войти в систему
Когда вы отправляете электронные письма из вашего веб-приложения, часто (как правило) случается, что в слое постоянства происходят некоторые изменения. Например:
- Новый пользователь регистрируется для учетной записи на вашем сайте - новый пользователь создается в базе данных, и ему отправляется электронное письмо со ссылкой для подтверждения
- Пользователь назначает кому-либо еще ошибку или проблему - проблема обновляется и отправляются уведомления по электронной почте.
Способ отправки этих электронных писем может иметь решающее значение для успеха вашего приложения. Способ их отправки зависит от того, насколько важно, чтобы предполагаемый получатель получил электронное письмо.
Мы рассмотрим следующие четыре стратегии в отношении случая, когда почтовый сервер не работает, используя пример 1.
СДЕЛКА И СИНХРОННАЯ
Не удается отправить электронное письмо, и пользователю выдается сообщение об ошибке, в котором говорится, что его учетная запись не может быть создана. Приложение будет работать медленно и не отвечает, поскольку приложение ожидает тайм-аут соединения. Учетная запись не создана в базе данных, поскольку транзакция откатывается.
ТРАНЗАКЦИОННЫЙ И АСИНХРОННЫЙ
Определение транзакции здесь относится к отправке электронного письма в очередь JMS или сохранению его в таблице базы данных для другого фонового процесса, который можно было бы забрать и отправить.
Учетная запись пользователя создается в базе данных, электронное письмо отправляется в очередь JMS для последующей обработки. Сделка прошла успешно и совершена. Пользователю показывается сообщение о том, что его учетная запись была создана, и проверяет свою электронную почту для подтверждения ссылки. В этом случае возможно, что электронное письмо никогда не будет отправлено из-за какой-либо другой ошибки, однако пользователю сообщают, что электронное письмо было отправлено ему. Может быть некоторая задержка в получении электронного письма пользователю, если для диагностики проблемы с электронной почтой необходимо вызвать службу поддержки приложений.
нетранзакционный и синхронный
Пользователь создается в базе данных, но приложение получает ошибку времени ожидания при попытке отправить электронное письмо со ссылкой для подтверждения. Пользователю показывается сообщение об ошибке, в котором говорится, что произошла ошибка. Приложение работает медленно и не отвечает, поскольку ожидает время ожидания соединения
Когда почтовый сервер возвращается к жизни и пользователь пытается зарегистрироваться снова, ему сообщают, что его учетная запись уже существует, но не подтверждена, и ему предоставляется возможность повторно отправить ему электронное письмо.
нетранзакционный и асинхронный
Единственное различие между этим и транзакционным и асинхронным заключается в том, что в случае ошибки при отправке электронного письма в очередь JMS или сохранении его в базе данных учетная запись пользователя все еще создается, но электронное письмо никогда не отправляется до тех пор, пока пользователь не попытается снова зарегистрироваться.
Что я хотел бы знать, что другие люди здесь делают? Можете ли вы порекомендовать какие-либо другие решения, кроме 4, которые я упомянул выше? Каков разумный способ решения этой проблемы? Я не хочу чрезмерно проектировать систему, которая имеет дело с (надеюсь) редкой ситуацией, когда мой почтовый сервер выходит из строя!
Самое простое, что нужно сделать, это закодировать его синхронно, но есть ли другие подводные камни в этом подходе? Я думаю, мне интересно, есть ли лучшая практика, я не смог бы найти что-то там, прибегая к помощи.