首页 > 解决方案 > 使用 Hangfire(共享任务/对象)的多个服务实例,可能吗?

问题描述

出于冗余原因,我需要使用相同的数据库运行同一服务的多个实例。

我发现了一些关于“Hangfire 多个实例”的问题,但与我的目的不同:通常是关于在同一数据库上为不同任务运行多个实例,或类似于此。

我需要知道当 2 个或更多 Hangfire 实例使用同一个数据库(我们想使用 MongoDB)时是否存在并发问题,以及这是否是使服务具有弹性的解决方案。
目标是让实例在另一个实例出现故障时处理所有工作。

任何建议都可以涵盖这种情况。

标签: hangfireresiliency

解决方案


在我们的环境中,我们有一个由大约 10 个 Hangfire 服务器使用的副本集。如果有多个 Hangfire 服务器为同一个队列提供服务,这意味着它们将分担负载,并且无论哪个 Hangfire 服务器首先检查队列,拿起工作并继续。如果您移除除 1 台服务器之外的所有服务器,则作业将继续(只要有足够的工作人员,否则他们将保持排队,直到有工作人员可用)。

要回答您的问题,是的,您可以拥有 2 个或更多使用同一个 MongoDB 的 Hangfire 服务器。MongoDB 提供多线程支持,因此可以安全地让各种服务器访问同一个数据库后端。如果您有两台服务器,两台服务器都将处于活动状态,如果一个实例离线,另一个实例(基于队列)将继续处理队列中的作业。

请记住,Hangfire 服务器处理特定队列中的作业。如果两台服务器都属于同一个队列,那么您将在两台服务器之间对作业进行负载平衡。如果它们是不同队列的一部分,那么您将了解每个 Hangfire 实例处理不同作业的场景(因为它们是不同队列的一部分)。

在此处阅读有关配置作业队列的信息


推荐阅读