我正在学习微服务,我明白在我的场景中,我希望微服务使用消息队列和持久性相互通信。这意味着,如果示例崩溃,并且消息没有被消耗,那么当示例反弹回来时(或者可能被另一个示例)消息将被消耗。
现在,既然这些消息是关键的,那么它们不应该是事务性的并参与微数据库事务吗?我看到使用kafka或rabbitmq的示例,但这些队列实现不实现事务。如果他们不这么做,很可能会丢失一些信息。
微服务真的需要事务吗?或者我应该以一种弹性的方式设计我的微服务,以便它们能够丢失信息,并从这种情况中恢复?
也许我的问题说不通。也许我还在以“单片”的方式思考,隔离、锁定和事务才是王道。
1条答案
按热度按时间r9f1avp51#
正如伊万·巴拉努克在评论中所说。大多数消息代理都有
acknowledgement
. 以及死信队列(dlq)。只要车祸发生在
acknowledgement
(可以由您正在使用的库处理,也可以手动处理),您不会丢失消息,因为它将重新排队。如果几次碰撞后仍然发生并且超过maxRetryAttempt
它将被传递给dlq供您处理。就像队列确认等同于db commit一样。
额外:我确实认为db transactional在使用消息时很重要。处理在使用消息时有多个db写入,然后在进程中间应用程序崩溃的情况。当它崩溃的时候,消息不会被删除
ack
-它将重新排队,稍后将再次被消费。这是为了防止在第二次使用消息时出现双写。