Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我是否需要MicroService中的事务队列?_Java_Transactions_Microservices_Message Queue - Fatal编程技术网

Java 我是否需要MicroService中的事务队列?

Java 我是否需要MicroService中的事务队列?,java,transactions,microservices,message-queue,Java,Transactions,Microservices,Message Queue,我正在学习微服务,我知道在我的场景中,我希望微服务使用消息队列和持久性相互通信。这意味着,如果实例崩溃并且消息未被使用,那么当实例反弹回来时(或者可能被另一个实例使用),消息将被使用 现在,既然这些消息是关键的,它们不应该是事务性的,并且参与微数据库事务吗?我看到了使用Kafka或RabbitMQ的示例,但这些队列实现没有实现事务。如果他们不这么做,很可能会丢失一些信息 微服务真的需要事务吗?或者我应该以一种弹性的方式设计我的微服务,以便它们能够丢失信息并从这种情况中恢复 也许我的问题没有意义。

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

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

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


也许我的问题没有意义。也许我仍在以“整体式”的方式思考,隔离、锁定和事务是王道。

正如伊万·巴拉努克在评论中所说。大多数消息代理都有
确认
。还有死信队列(DLQ)

只要崩溃发生在
确认之前
(可以由您正在使用的库处理,也可以手动处理),您就不会丢失消息,因为它将重新排队。如果崩溃在几次之后仍然发生,并且超过了
maxretrytry
,它将被传递给DLQ供您处理

就像队列确认等同于数据库提交一样


额外:我确实认为DB事务性在使用消息时很重要。处理在使用消息时有多个DB写入,然后在处理过程中应用程序崩溃的情况。当它崩溃时,消息将不会被
ack
-ed,它将被重新排队,稍后将再次被消费。这是为了防止在第二次使用消息时重复写入。

我认为所有队列基本上都支持“确认”(或更新偏移量的其他操作),如果您需要确保消息已被接收和处理,则您的流将为:1。投票2。处理3。确认在(1)和(2)的情况下,您已确认(3)。若您的进程在发送确认消息之前被压碎,那个么MessageBroker仍然会认为该消息不是由客户端处理的。关于(3)-我实际上在想,这一步可能会引起您的担忧,不幸的是,我无法分散它。我想您应该知道分布式事务!!我认为你是对的。最近几天我读了很多书,重点是要避免2PC的“安全而缓慢”技术(例如JMS)。现在,对于幂等消息和ACK策略,您指出应该没有问题。