Events 如何避免由于水平缩放而多次处理事件?

Events 如何避免由于水平缩放而多次处理事件?,events,redis,spring-data-redis,Events,Redis,Spring Data Redis,我有一个发布/订阅设置,其中一个应用程序发送事件,一个应用程序接收事件 我使用redis pub/subscribe来实现它,因此: RedisMessageListenerContainer container = new RedisMessageListenerContainer(); container.addMessageListener(new MessageListenerAdapter(listener), "topic1"); 它工作正常,但现在我遇到了一个

我有一个发布/订阅设置,其中一个应用程序发送事件,一个应用程序接收事件

我使用redis pub/subscribe来实现它,因此:

RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.addMessageListener(new MessageListenerAdapter(listener), "topic1");
它工作正常,但现在我遇到了一个问题:在我的生产设置中,我有一个节点的复制,所以发生的情况是,一个事件被触发两次,订阅服务器重复两次相同的代码


是否有任何方法(例如散列)可以阻止redis发布已发送的事件?

您现在不应该在2020年使用redis发布/订阅。它最大的一个缺点是不能持久保存消息。例如,由于某些网络问题,您的消费者服务断开连接。发布者发布消息,然后您的消费者重新连接,它将不会收到消息。它丢了

相反,请使用Redis 5.0中引入的Redis流。消费者群体就是你所寻找的

消费群体最初是由一种叫做Kafka(TM)的流行信息系统引入的。Redis以完全不同的术语重新实现了一个类似的想法,但目标是相同的:允许一组客户端协作使用同一消息流的不同部分

然而,对于当前问题的快速和肮脏的修复。 您的发布者想要发布一条消息,说cusomter 123支付了orderId 1111。现在生成一个随机数字,例如27656。 它将消息27656:123:1111发布到X频道


您的消费者订阅通道X,它解析消息,获得消息编号27656,setnx字符串27656,超时时间为一分钟,如果成功,您知道消息27656是第一次被消费,并继续消费消息正文123:1111。否则,只需默默地丢弃此消息。

流是否也允许我侦听尚未创建的流?或者我需要事先创建一个流吗?另外,我是否可以在应用程序启动时创建一个消费者组,如果它已经存在,请连接到它?是的,是的。两者都可以实现