是否有可能通过RabbitMQ发送消息有一些延迟?例如,我希望在30分钟后使客户端会话到期,并且我发送一条消息,该消息将在30分钟后处理.
我要描述的内容实际上是两个不同系统之间的两阶段提交问题,我正在寻找有关如何处理它的建议.在我们的Web应用程序中,我们将一些昂贵的/第三方操作(例如发送电子邮件)卸载到带外后台工作进程(我们称之为我们的作业基础结构).
例如,要发送电子邮件,我们会在数据库中创建电子邮件对象和电子邮件作业.然后,我们必须等待我们的工作监视器获取电子邮件作业并发送它.作业监视器基本上通过在空闲时每隔几秒轮询一次数据库来工作.
但是,这会增加电子邮件发送的延迟,并通过轮询添加我在数据库中视为过度负载的内容.如果我们能够在创建电子邮件后立即将电子邮件作业放入队列,那将会更好.
然而,这目前失败有两个原因.首先,队列通常比Web请求快得多.在Web请求提交其数据库事务之前,将拾取电子邮件以进行处理,因此无法正确生成电子邮件.其次,如果Web请求失败,它将回滚其数据库事务,这意味着不应该发送电子邮件.但是,如果它已经被放入队列,则它不再在请求的控制之下.
在队列和数据库之间创建两阶段提交是否有良好的策略?作为参考,我们使用RabbitMQ和MySQL与InnoDB表.我提出的一个想法是在提交数据库事务后将电子邮件作业粘贴到队列中,但这样就可能使电子邮件永远不会排队.我仍然需要创建一个轮询流程来监视应该已发送但未发送的电子邮件.