Node.js 发布/子频道的订阅服务器数和超时

Node.js 发布/子频道的订阅服务器数和超时,node.js,redis,node-redis,Node.js,Redis,Node Redis,目前正在使用多进程/多主机nodeJS应用程序,我面临一个问题,需要您的帮助 我的应用程序由进程组成,每个进程可以承载多个独特的作业。我必须实时知道作业当前是否在我的系统上运行 以下是我当前的解决方案: 每个作业都订阅一个频道“job.job_UUID” 如果进程想知道某个作业当前是否正在运行,我会按“job.job_UUID”并检查订户数量。如果1=正常,则此作业正在运行,如果0未运行 除了出现网络问题外,此解决方案工作得非常好。这可能是因为Redis pub/sub没有超时: Note

目前正在使用多进程/多主机nodeJS应用程序,我面临一个问题,需要您的帮助

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

以下是我当前的解决方案:

  • 每个作业都订阅一个频道“job.job_UUID”
  • 如果进程想知道某个作业当前是否正在运行,我会按“job.job_UUID”并检查订户数量。如果1=正常,则此作业正在运行,如果0未运行
除了出现网络问题外,此解决方案工作得非常好。这可能是因为Redis pub/sub没有超时:

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似乎保留了ghost订户,当我发布到某个频道时,它会返回1个订户,但它并不真实存在

你有办法处理这个案子吗

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

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

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

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

在这种情况下,您始终具有实时性。进程运行时,值将在那里。只有当您的工作在未删除该值的情况下终止时,您才会看到不一致。一旦安全措施超时,TTL将自动删除该值

如果您需要更健壮的实时性,那么您可能在工作中使用了错误的工具。对于流程协调来说,ZooKeeper是相当令人惊讶的。不像Redis那样通用,而且由于问题的分布式性质,设置起来肯定有点复杂,但非常适合流程编排和实时故障切换