gpt4 book ai didi

node.js - 发布/订阅 channel 的订阅者数量和超时

转载 作者:IT王子 更新时间:2023-10-29 06:02:50 25 4
gpt4 key购买 nike

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

我的应用由进程组成,每个进程都可以承载多个独特的作业。我必须实时了解我的系统上当前是否正在运行作业。

这是我目前的解决方案:

  • 每个工作订阅一个 channel “job.JOB_UUID”
  • 如果进程想知道作业当前是否正在运行,我将推送到“job.JOB_UUID”并检查订阅者数量。如果为 1 = 正常,则此作业正在运行,如果为 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 似乎保留了幽灵订阅者,当我发布到一个 channel 时,它返回给我 1 个订阅者,但它实际上并不存在。

您有处理此案的想法吗?

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

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

最佳答案

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

每个作业在redis中设置一个键“job_UUID”,TTL设置为N(一个足够大的数字让进程完成,它只会作为超时)作业完成,捕获执行期间的任何异常。作业完成后,它会从 Redis 中删除 key

在这种情况下,你总是有实时的。当进程运行时,值将在那里。只有当你的工作在没有删除值的情况下结束时,你才会看到不一致。一旦安全超时过去,TTL 将自动删除该值。

如果您需要更强大的实时功能,那么您可能使用了错误的工具来完成这项工作。对于进程协调,ZooKeeper 相当了不起。不像 Redis 那样通用,而且由于问题的分布式性质,设置起来肯定更复杂一些,但非常适合流程编排和实时故障转移。

关于node.js - 发布/订阅 channel 的订阅者数量和超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23102962/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com