【问题标题】:redis pub/sub on multiple consumersRedis 发布/订阅多个消费者
【发布时间】:2019-11-27 00:09:09
【问题描述】:

我有一个使用 redis 的 pub sub 功能进行事件消息传递的小型系统。我正在使用 nodejs 和 redis 库。

我制作了一个小脚本来让我的消费者更容易,问题是当我收到任何事件时,每个人都会运行,而不仅仅是我想要的。

这是我的脚本:

const redis = require("redis");
const subscriberClient = redis.createClient(redisConf);

const subscribe = (event, callback) => {
  subscriberClient.on("message", (channel, message) => {
    console.log("log: ", { channel, message });
    callback(JSON.parse(message));
  });
  subscriberClient.subscribe(event);
};

然后,在我的消费者中,我这样称呼它:

const init = () => {
  eventHandler.subscribe("userWasRegistered", message => console.log("save the registered user here", message)
  );
};

另一个这样的消费者:

const init = () => {
      eventHandler.subscribe("publicationWasCreated", message => console.log("save the publication data", message)
      );
    };

我在一个文件中调用我所有的消费者来执行所有,然后可以监听事件:

userWasRegistered.init();
publicationWasCreated.init();

问题是当我发送例如“userWasRegistered”事件时,publicationWasCreated 也被调用,出于某种原因,这也是监听其他事件。

我该如何解决?我在这里做错了什么?我的脚本肯定是问题,但我不知道为什么

【问题讨论】:

    标签: node.js redis publish-subscribe


    【解决方案1】:

    好的,我可以用一个简单的 if 来修复它,我只验证通道和事件是否相同:

    const subscribe = (event, callback) => {
      subscriberClient.on("message", (channel, message) => {
        console.log("channel: ", channel);
        console.log("event: ", event);
    
        if (channel === event) {
          console.log("log: ", { channel, message });
          callback(JSON.parse(message));
        }
      });
      subscriberClient.subscribe(event);
    };
    

    这不是最漂亮的方法,但它确实有效。

    如果有更好的答案,我会将问题留待一段时间。

    【讨论】: