发布/订阅者频道的订阅者数量和超时

时间:2014-04-16 07:39:20

标签: node.js redis node-redis

目前正在处理多进程/多主机nodeJS应用程序我遇到了问题,我需要你的帮助。

我的应用程序包含流程,每个人都可以托管几个独特的工作。我必须实时知道我的系统上当前是否正在运行作业。

这是我目前的解决方案:

  • 每个作业都订阅了一个频道" job.JOB_UUID"
  • 如果某个进程想知道某个作业当前是否正在运行,我会推送到" job.JOB_UUID"并检查订户数量。如果它1 = ok这个作业正在运行,如果0不是。

此解决方案非常有效,除非出现网络问题。这可能是因为Redis发布/暂停不会超时:

Note that the timeout only applies to number clients and it **does not apply** to Pub/Sub clients, since a Pub/Sub connection is a push style connection so a client that is idle is the norm.

Redis似乎保留了幽灵订阅者,当我发布到频道时,它会返回1个订阅者,但它并不存在。

您有想法管理此案例吗?

ps:我之前的解决方案是:

  • 每个作业设置一个键" job_UUID"在redis中,TTL设置为5s。
  • 每个作业每秒更新一次TTL
  • 检查作业是否存在,我只是检查" job_UUID"关键存在 问题是它不是实时的。

1 个答案:

答案 0 :(得分:0)

如果您可以保证您的工作不会崩溃,您可以随时使用原始解决方案的变体。

每个作业设置一个键" job_UUID"在redis中将TTL设置为N(一个足够大的数字用于完成该过程,它将仅作为超时) 作业完成,在执行期间捕获任何异常。 作业完成后,将从redis中删除密钥

在这种情况下,您总是有实时的。当进程正在运行时,值将存在。只有当您的工作在不删除值的情况下死亡时,您才会看到不一致。一旦安全防护超时通过,TTL将自动删除该值。

如果您需要实时更强大的功能,那么您可能会使用错误的工具来完成工作。对于进程协调,ZooKeeper非常棒。不像Redis那样通用,由于问题的分布式特性,设置肯定有点复杂,但对于流程编排和实时故障转移非常有用。