在我们的设计中,我们有一些悖论。我们有一个项目数据库。每个项目都有一个状态。我们有一个REST API来将项目从“Ready”状态更改为“Cleanup”状态。必须要做两件事。
目前RESTful api执行1,如果成功,请执行2.
但有时电子邮件无法发送。但由于(1)已经提交,因此无法回滚。
我不想在提交之前发送电子邮件,因为我想在发送电子邮件之前确保提交成功。
我想过撤消第1步,但这很难。状态更改涉及向历史表添加新记录,因此我需要删除它们。如果另一个人同时进行其他更改,撤消可能会搞砸。
那我该怎么办?如果(2)失败,我应该向客户返回“200 OK”吗?
似乎最好的选择是返回“500 Server Error”,并显示错误消息“项目状态已更改。但是,将电子邮件发送给审批者失败。请采取适当的行动。“
也许我不应该尝试在一次操作中做1 + 2?但这只会给客户带来负担,这更糟糕!
答案 0 :(得分:1)
只是一些随意的想法:
您可以拥有通知发送状态标志以及提交日期时间。当电子邮件成功时,它会翻转,如果没有,则它会保留。提交更改后,您的代码将遍历所有未发送的通知并尝试发送。不知道你在起诉什么后端数据库,但我相信很多人都有发送电子邮件的功能。您可以有一个每小时运行的计划作业(SQL Server Agent for MSSQL),如果提交的日期时间已经过了一定量,则会尝试发送,或者如果失败也会开始设置警报。
如果ti非常重要,那么也许您可以集成第三方服务(如sendgrid)作为备份发送机制。那当然会更多$$但是......
传统上,我总是将这样的功能分离到后端工作进程中,该进程在许多不同的应用程序中处理这种管理任务。有些通知每天早上都会发出。有些人每15分钟就会被送出去。有些是每周摘要。如果我遇到崩溃并烧毁,那么我点亮了事件日志,我们(幸运/不幸)足以拥有服务器监控工具,提醒我们指定的应用程序事件。