我有一个发布/订户设置,其中一个应用程序发送一个事件,一个应用程序接收它。
我使用redis pub/subscribe来实现它,所以:
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.addMessageListener(new MessageListenerAdapter(listener), "topic1");
它工作得很好,但现在我遇到了一个问题:在我的生产设置中,我有一个节点的复制,所以发生的是一个事件被触发两次,订阅者重复两次相同的代码。
难道没有任何方法(例如哈希)来阻止redis发布已经发送的事件吗?
1条答案
按热度按时间wh6knrhe1#
现在不应该在2020年使用redis pub/sub。它最大的一个缺点是不能持久化消息。e、 例如,由于某些网络问题,您的客户服务中断。发布者发布消息,然后您的使用者重新连接,它将不会收到消息。它丢了。
相反,使用redis5.0中引入的redis流。你要找的是消费者群体。
消费者群体最初是由一种叫做kafka(tm)的流行信息系统引入的。redis以完全不同的术语重新实现了一个类似的想法,但目标是相同的:允许一组客户机协作使用同一消息流的不同部分。
然而,为了快速而肮脏的修复您当前的问题。您的发布者想要发布一条消息,说cusomter 123支付了orderid 1111。现在生成一个随机数字,例如27656。它向x频道发布消息27656:123:1111
您的消费者订阅通道x,它解析消息,得到消息编号27656,setnx字符串27656,超时时间为一分钟,如果成功,您知道消息27656是第一次被消费,并继续消费消息正文123:1111。否则,只需默默地丢弃此消息。