我需要微服务中的事务队列吗?

lokaqttq  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(314)

我正在学习微服务,我明白在我的场景中,我希望微服务使用消息队列和持久性相互通信。这意味着,如果示例崩溃,并且消息没有被消耗,那么当示例反弹回来时(或者可能被另一个示例)消息将被消耗。
现在,既然这些消息是关键的,那么它们不应该是事务性的并参与微数据库事务吗?我看到使用kafka或rabbitmq的示例,但这些队列实现不实现事务。如果他们不这么做,很可能会丢失一些信息。
微服务真的需要事务吗?或者我应该以一种弹性的方式设计我的微服务,以便它们能够丢失信息,并从这种情况中恢复?
也许我的问题说不通。也许我还在以“单片”的方式思考,隔离、锁定和事务才是王道。

r9f1avp5

r9f1avp51#

正如伊万·巴拉努克在评论中所说。大多数消息代理都有 acknowledgement . 以及死信队列(dlq)。
只要车祸发生在 acknowledgement (可以由您正在使用的库处理,也可以手动处理),您不会丢失消息,因为它将重新排队。如果几次碰撞后仍然发生并且超过 maxRetryAttempt 它将被传递给dlq供您处理。
就像队列确认等同于db commit一样。
额外:我确实认为db transactional在使用消息时很重要。处理在使用消息时有多个db写入,然后在进程中间应用程序崩溃的情况。当它崩溃的时候,消息不会被删除 ack -它将重新排队,稍后将再次被消费。这是为了防止在第二次使用消息时出现双写。

相关问题