【问题标题】:How to avoid processing events multiple times due to horizontal scaling?如何避免由于水平缩放而多次处理事件?
【发布时间】:2020-07-16 16:32:56
【问题描述】:

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

我正在使用 redis pub/subscribe 来实现它:

RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.addMessageListener(new MessageListenerAdapter(listener), "topic1");

它工作正常,但现在我有一个问题:在我的生产设置中,我有一个节点的复制,所以会发生一个事件被触发两次并且订阅者重复两次相同的代码。

有没有办法,比如hash,来阻止redis发布已经发送的事件?

【问题讨论】:

    标签: events redis spring-data-redis


    【解决方案1】:

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

    改为使用 Redis 5.0 中引入的 Redis Stream。消费者群体正是您要寻找的。​​p>

    消费者组最初是由称为 Kafka (TM) 的流行消息传递系统引入的。 Redis 用完全不同的术语重新实现了一个类似的想法,但目标是相同的:允许一组客户端合作使用同一消息流的不同部分。

    但是,为了快速而肮脏地解决您当前的问题。 您的发布者想要发布一条消息,说客户 123 支付了 orderId 1111。现在您生成一个随机数字,例如 27656。 它向通道 X 发布消息 27656:123:1111

    你的消费者订阅了X频道,它解析消息,得到消息号27656,setnx String 27656 超​​时一分钟,如果成功,你知道消息27656是第一次被消费,然后去on 以使用消息正文 123:1111 。否则,就默默地丢弃这条消息。

    【讨论】:

    • 流还允许我收听尚未创建的流吗?还是我需要事先创建一个流?另外,我可以在应用程序启动时创建一个消费者组,如果它已经存在,连接到它吗?
    • 是的,是的。两者都可以完成
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多