以最小的重叠在工作实例之间分布主题



我正在做一个Twitter项目,使用他们的流媒体API,用Node.js在Heroku上构建。

我有一个主题的集合,我的应用程序需要处理,这是从MongoDB拉。我需要通过API跟踪每个主题,但是需要这样做,每个主题只跟踪一次。由于每个工作进程在大约1小时后过期,当一个工作进程接收到SIGTERM时,它需要取消对分配的每个主题的跟踪,并再次将其释放回池。

我一直在使用RabbitMQ在应用程序和工作进程之间进行通信,但是我有点卡住了。你能提供一些好的例子或建议来正确地做到这一点吗?

当worker接收到SIGTERM时,它不能通过消息队列向应用程序发送消息吗?根据heroku文档在关闭进程时允许几秒钟(10),然后它将被有效地杀死。

你可以这样做:

// listen for SIGTERM sent by heroku
process.on('SIGTERM', function () {
    // - notify app that this worker is shutting down
    messageQueue.sendSomeMessageAboutShuttingDown();
    // - shutdown process (might need to wait for async completion
    // of message delivery to not prevent it from being delivered)
    process.exit()
});

或者你可以把你的工作分解成更小的块,让工人只"接受"工作,最多只能运行几分钟甚至几秒钟。您的主要应用程序应该是簿记员,如果一个进程没有在指定的时间内完成其任务,则假定它已经丢失,并将该任务提供给另一个进程来处理。你也可以在rabbitmq中使用confirm来实现这个行为。

RabbitMQ不会为你做这些。

它允许您将工作分配给另一个进程和/或计算机,但它不提供防止多个进程/计算机处理特定主题所需的那种机制。

你想要的是一个信号量-一种控制从多个进程访问特定"资源"的方法…一种确保在给定时间只有一个进程在处理特定资源的方法。在你的情况下,"资源"将是主题……但是它仍然是你想要控制访问的资源。

顺便说一下,过去有关于使用RabbitMQ实现分布式信号量的讨论:

  • https://www.rabbitmq.com/blog/2014/02/19/distributed-semaphores-with-rabbitmq/
  • https://aphyr.com/posts/315-call-me-maybe-rabbitmq

但是普遍的共识是这是一个坏主意。有太多的边缘情况和场景,RabbitMQ将无法作为适当的信号量工作。

有一些node.js信号量库可用。我建议你看看它们,并使用其中的一个。让一个进程管理信号量,并决定哪个进程可以/不可以处理哪个主题。

相关内容

最新更新