Node.js 以最小重叠在工作实例之间分发主题

Node.js 以最小重叠在工作实例之间分发主题,node.js,mongodb,heroku,rabbitmq,distributed-computing,Node.js,Mongodb,Heroku,Rabbitmq,Distributed Computing,我正在做一个Twitter项目,使用他们的流式API,基于Heroku和Node.js构建 我有一组我的应用程序需要处理的主题,这些主题来自MongoDB。我需要通过API跟踪这些主题中的每一个,但是需要这样做,即每个主题只跟踪一次。由于每个工作进程在大约1小时后过期,因此当工作进程收到SIGTERM时,它需要取消跟踪分配的每个主题,并再次将其释放回池中 我一直在使用RabbitMQ在应用程序和工作进程之间进行通信,但是有点卡住了。有什么好的例子或建议可以提供正确的方法吗?当应用程序收到SIGT

我正在做一个Twitter项目,使用他们的流式API,基于Heroku和Node.js构建

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


我一直在使用RabbitMQ在应用程序和工作进程之间进行通信,但是有点卡住了。有什么好的例子或建议可以提供正确的方法吗?

当应用程序收到SIGTERM时,工作人员难道不能通过messagequeue向应用程序发送消息吗?根据法律规定,在该进程被预测性地终止之前,允许它停留几秒钟(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中实现此行为。

当工作程序接收到SIGTERM时,它难道不能通过messagequeue向应用程序发送消息吗?根据法律规定,在该进程被预测性地终止之前,允许它停留几秒钟(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中使用实现此行为。

rabbitmq不会为您这样做

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

您想要的是一种控制从多个进程访问特定“资源”的方法。。。一种确保在给定时间只有一个进程在特定资源上工作的方法。在您的情况下,“资源”将是主题。。。但它仍然是您想要控制访问的资源

FWIW,过去曾讨论过使用RabbitMQ实现分布式信号量:

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


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

RabbitMQ不会为您这样做

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

您想要的是一种控制从多个进程访问特定“资源”的方法。。。一种确保在给定时间只有一个进程在特定资源上工作的方法。在您的情况下,“资源”将是主题。。。但它仍然是您想要控制访问的资源

FWIW,过去曾讨论过使用RabbitMQ实现分布式信号量:

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


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

你说的“我有点卡住了”到底是什么意思?你到底想知道什么?你说的“我有点被卡住了”到底是什么意思?你到底想知道什么?