Java 消息传递的幂等障碍

Java 消息传递的幂等障碍,java,message-queue,messaging,rabbitmq,Java,Message Queue,Messaging,Rabbitmq,我最近看到的一篇文章提到了使用所谓的“幂等屏障”进行消息重复消除。这只是消息汇合器的一个花哨名称,还是更具体的名称。如果是,具体是什么?谷歌搜索产生的结果大多与RabbitMQ有关,几乎没有解释它是什么。是函数的行为,在函数的输出上执行函数n次,结果与执行一次的函数处于相同的状态。这在消息传递环境中很有用,因为延迟的消息不会导致意外行为。虽然合并意味着将集中消息以防止重复,但幂等性意味着消息传递框架将允许重复消息的多次传输和执行,虽然坚持一条消息的多个副本的执行与一条消息的执行具有相同的结果。如

我最近看到的一篇文章提到了使用所谓的“幂等屏障”进行消息重复消除。这只是消息汇合器的一个花哨名称,还是更具体的名称。如果是,具体是什么?谷歌搜索产生的结果大多与RabbitMQ有关,几乎没有解释它是什么。

是函数的行为,在函数的输出上执行函数n次,结果与执行一次的函数处于相同的状态。这在消息传递环境中很有用,因为延迟的消息不会导致意外行为。虽然合并意味着将集中消息以防止重复,但幂等性意味着消息传递框架将允许重复消息的多次传输和执行,虽然坚持一条消息的多个副本的执行与一条消息的执行具有相同的结果。

如果我理解正确,您的最后一句话似乎暗示幂等性实际上是消息使用者的函数,而不是框架的函数。如果是这种情况,那么框架的非独立性意味着什么?如果框架允许执行重复项,则应由客户端检测重复项并忽略它们或保持不受影响。在消息传递环境中,可以通过以下两种方式之一创建幂等行为。您可以将其封装到消息中,考虑尾部递归,或者让客户机实现您所描述的某种缓存机制。您正在考虑的缓存技术在概念上是一种简单的技术,但是它不能很好地扩展,因为当您让消息使用者运行时,缓存需要不断增长。如果服务具有高吞吐量,这可能会导致内存不足。如果您知道延迟消息的SLA是什么,则可以实现滑动窗口(类似于TCP)。也就是说,如果您创建了一个SLA,只需要将最后1000条消息保存在缓存中,那么您就有了有限的内存。这种类型的安排应该足以满足大多数情况,因为它们将有一个实际的延迟上限-但显然不允许“无限”的延迟,如果你曾经需要的话。底线是,找出你的SLA。