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

Do I need transactional queues in Microservices?

我正在学习微服务,我知道在我的场景中我希望微服务使用消息队列相互通信,并具有持久性。这意味着如果实例崩溃并且消息未被消耗,它将在实例反弹时被消耗(或者可能被另一个实例)。

现在,既然这些消息很关键,它们不应该是事务性的并参与 micro 数据库事务吗?我看到使用 Kafka 或 RabbitMQ 的示例,但这些队列实现不实现事务。如果他们不这样做,很可能会丢失一些消息。

微服务真的需要事务吗?或者我应该以弹性方式设计我的微服务,以便它们可以丢失信息并从这种情况中恢复?

也许我的问题没有意义。也许我还在以隔离、锁定和事务为王的“单体”方式思考。

正如 Ivan Baranuk 在评论中所说。大多数消息代理有 acknowledgement。还有死信队列 (DLQ)。

只要崩溃发生在 acknowledgement 之前(可以由您正在使用的库处理或者您可以手动处理),您就不会丢失您的消息,因为它会重新排队.如果多次后还是崩溃,超过maxRetryAttempt,就会交给DLQ给你处理。

想想队列确认等同于数据库提交。

额外:我确实认为在使用消息时数据库事务很重要。要处理在使用消息时有多个数据库写入,然后在进程中间您的应用程序崩溃的情况。当它崩溃时,消息不会被 ack 编辑,它会重新排队,稍后会再次被消费。防止消息第二次消费时双写。