【发布时间】:2021-03-16 22:52:25
【问题描述】:
我正在学习微服务,我知道在我的场景中,我希望微服务使用消息队列相互通信,并具有持久性。这意味着如果实例崩溃并且消息没有被消费,它将在实例反弹(或者可能被另一个实例)时消费。
现在,既然这些消息很关键,它们不应该是事务性的并参与微数据库事务吗?我看到使用 Kafka 或 RabbitMQ 的示例,但这些队列实现不实现事务。如果他们不这样做,很可能会丢失一些消息。
微服务真的需要事务吗?或者我应该以一种有弹性的方式设计我的微服务,以便它们可以丢失信息并从这种情况中恢复?
也许我的问题没有意义。也许我还在以隔离、锁定和事务为王的“单体”方式思考。
【问题讨论】:
-
我认为所有队列都支持“确认”(或其他一些将更新偏移量的操作)基本上,如果您需要确保收到并处理您的流程,您的流程将是:1. 轮询 2. 处理3.承认
-
如果对 (1) 和 (2) 感到迷恋,您已经确认 (3)。如果您的进程在发送确认消息之前被破坏,Broker 仍然会认为该消息未由客户端处理。关于 (3) - 实际上我认为这一步可能会引起您的担忧,不幸的是,我无法驱散它。
-
我猜你知道分布式事务!
标签: java transactions microservices message-queue