Microservices 微服务-持久化到RDBMS&;事务中的队列

Microservices 微服务-持久化到RDBMS&;事务中的队列,microservices,message-queue,messaging,vert.x,distributed-transactions,Microservices,Message Queue,Messaging,Vert.x,Distributed Transactions,我有一个REST服务——它的所有请求都被持久化到它自己的关系数据库中。到目前为止,很好。但是,还有一个小企业功能(电子邮件通知、sms警报),应该在新接收/更新的数据上运行。为了让这个过程在后台处理数据,它需要某种方式来了解持久化数据——消息队列可以解决这个问题。我看到的三种常见的设计方法 REST服务插入到数据库中,并发布到队列中 这里的问题是,分布式事务—在一个事务中组合不同的类型—关系数据库和队列。有些工具可能支持,有些可能不支持 像往常一样,REST服务只保留到其数据库。此外,它还将

我有一个REST服务——它的所有请求都被持久化到它自己的关系数据库中。到目前为止,很好。但是,还有一个小企业功能(电子邮件通知、sms警报),应该在新接收/更新的数据上运行。为了让这个过程在后台处理数据,它需要某种方式来了解持久化数据——消息队列可以解决这个问题。我看到的三种常见的设计方法

  • REST服务插入到数据库中,并发布到队列中

    • 这里的问题是,分布式事务—在一个事务中组合不同的类型—关系数据库和队列。有些工具可能支持,有些可能不支持
  • 像往常一样,REST服务只保留到其数据库。此外,它还将数据插入另一个表中,定时作业将查询到该表,并将其发布到队列(后台作业应从该队列开始工作)

    • 我看到的问题是调度器-不反应、批处理、受时间限制、不实时、速度慢等
  • REST端点将数据直接发布到
    主题
    。使用者将其持久化到数据库,而另一个使用者则在后台处理它

    • 类似事件源的东西。TMU,随着服务数量的增长,实现起来有点复杂。此外,如果数据库关闭,持久性服务将无法保存数据,但是后台服务(例如,emailer)将发送功能错误的电子邮件。这可能导致服务之间的不一致,也可能导致功能不一致
  • 我也曾想过阅读数据库
    事务日志
    ,但它似乎更复杂,需要工具配置才能使其工作,而且,它似乎适合于数据处理系统而不是我们的用例

    你是怎么想的?我错过什么了吗?您如何管理这些场景?应该寻找什么?思考反应,比如说
    Vertx


    如果这看起来很幼稚,我深表歉意,但我必须问一下。

    如果您不需要在写入后立即读取一致性,我通常会推荐选项3。如果数据库记录仍然没有被其处理的消息更新,则后台作业应重试

    你的文章举例说明了为什么队列不应该用于这些类型的场景。它们有利于提供分析数据或日志,但对于任务编排,开发人员每次都必须重新发明轮子

    更好的方法是使用这样的任务编排系统,这样可以消除您描述的问题,并使多服务编排更加简单


    请参见解释Cadence编程模型的内容。

    我认为最好的方法是使用CDC(更改数据捕获)系统(如debezium)


    请参见[

    我认为您将方法和实现混为一谈。微服务应该写入DB并将该事件发布到队列中,因此请坚持使用这种好方法(选项1).我不确定你在细节中的意思,但我想你是在问应该使用哪些工具?你应该考虑FIFO、QoS、持久性、故障处理,以及它如何可以有多个消费者。AWS的SNS目前还没有提供FIFO,但我听说RabbitMQ很好。你能详细说明方法和实现吗?是的,我可以使用rabbitmq、activemq甚至kafka在进程之间传递消息,但是,如果我将数据发布到队列时,数据会持久化到数据库中,如果我无法将数据发布到队列时,数据会回滚。如果您可以写入db但发布失败,那么这就是处理失败发布的另一个问题。我不知道您的要求t但如果您返回200 OK,则它应该保留到数据库,并可能写入另一个发布失败的表,然后它应该稍后重试发布。那么,让我的服务中的逻辑在这种失败的情况下工作,这不是多余的吗?此外,我随后设计了一个调度程序,用于查询并推回队列。很抱歉,这也是na吗假设业务需要是,发送短信(我不能放弃任何请求)。后台进程准备来自请求的sms有效负载,并将其转发给某个外部sms提供程序。此外,Debezium还支持事务发件箱模式。这样,就不需要对发件箱表进行轮询,但可以使用CDC有效地提取发件箱表中的新事件。