使用 SQL Server 搭配 MSMQ¶

Hangfire.SqlServer.MSMQ 这个扩展更改了Hangfire处理作业队列的方式。与SQL Server默认的 实现 队列的常规方法不同, 它使用事务性MSMQ队列,更有效地处理任务:

特性 原始SQL Server SQL Server + MSMQ
在进程终止后重试 重启后立即执行 重启后立即执行
最差提取时间 轮询时间间隔(默认为15秒) 立即

因此,如果要使用SQL Server存储降低后台处理延迟时间,请考虑切换到使用MSMQ。

安装¶

MSMQ支持SQL Server作业存储实现,像其他Hangfire扩展一样,是一个NuGet包。您可以使用NuGet软件包管理器控制台窗口进行安装:

  1. PM> Install-Package Hangfire.SqlServer.Msmq

配置¶

要使用MSMQ队列,您应该执行以下步骤:

    • 在每个主机上手动创建它们 不要忘记授予适当的权限。请注意,默认情况下,队列存储限制为1048576 KB(大约2百万个入队作业),您可以通过MSMQ属性窗口增加队列存储空间。
    • 在当前所有的 SqlServerStorage 实例中注册MSMQ队列。

如果您 只使用默认队列,请在 UseSqlServerStorage 方法调用后调用 UseMsmqQueues 方法并将路径作为参数传递。
  1. GlobalConfiguration.Configuration
  2. .UseSqlServerStorage("<connection string or its name>")
  3. .UseMsmqQueues(@".\hangfire-{0}");

要使用多个队列,您应该明确地传递它们:

  1. GlobalConfiguration.Configuration
  2. .UseSqlServerStorage("<connection string or its name>")
  3. .UseMsmqQueues(@".\hangfire-{0}", "critical", "default");

限制¶

  • 在ASP.NET中,基于可靠性只支持事务性MSMQ队列。
  • 您不能同时使用SQL Server作业队列和MSMQ作业队列实现(见下文)。此限制仅适用于Hangfire Server。您仍然可以将任务排队到任何类型的队列,并在Hangfire仪表盘中查看。

切换到MSMQ队列¶

请使用 seMsmqQueues 方法新增MSMQ队列。否则,您的系统在SQL Server存储中可能有未处理的作业。由于一个Hangfire Server实例无法处理来自不同类型的队列中的任务,因此您应该部署 多个 Hangfire Server实例 ,一个仅监听MSMQ队列,另一个仅监视SQL Server队列。当后者完成工作(您可以在仪表板中看到这一点 - 您的SQL Server队列将被删除),就可以安全地删除它。

如果您仅使用默认队列,请执行以下操作:

  1. /* This server will process only SQL Server table queues, i.e. old jobs */
  2. var oldStorage = new SqlServerStorage("<connection string or its name>");
  3. var oldOptions = new BackgroundJobServerOptions
  4. {
  5. ServerName = "OldQueueServer" // Pass this to differentiate this server from the next one
  6. };
  7.  
  8. app.UseHangfireServer(oldOptions, oldStorage);
  9.  
  10. /* This server will process only MSMQ queues, i.e. new jobs */
  11. GlobalConfiguration.Configuration
  12. .UseSqlServerStorage("<connection string or its name>")
  13. .UseMsmqQueues(@".\hangfire-{0}");
  14.  
  15. app.UseHangfireServer();

如果您使用多个队列,请执行以下操作:

  1. /* This server will process only SQL Server table queues, i.e. old jobs */
  2. var oldStorage = new SqlServerStorage("<connection string>");
  3. var oldOptions = new BackgroundJobServerOptions
  4. {
  5. Queues = new [] { "critical", "default" }, // Include this line only if you have multiple queues
  6. ServerName = "OldQueueServer" // Pass this to differentiate this server from the next one
  7. };
  8.  
  9. app.UseHangfireServer(oldOptions, oldStorage);
  10.  
  11. /* This server will process only MSMQ queues, i.e. new jobs */
  12. GlobalConfiguration.Configuration
  13. .UseSqlServerStorage("<connection string or its name>")
  14. .UseMsmqQueues(@".\hangfire-{0}", "critical", "default");
  15.  
  16. app.UseHangfireServer();

原文:

http://hangfirezh.zhs.press/configuration/using-sql-server-with-msmq.html