auc*_*cls 5 c# parallel-processing hangfire hangfire-sql
我遇到一个问题,hangfire 上的某些作业使用相同的参数排队不止一次,这些作业几乎同时排队。
我尝试将工作人员的数量限制为一名,然后用DisableConcurrentExecution.
我使用 sqlserver 作为存储。有人遇到过这个问题吗?有一些技巧可以避免吗?
PS:我DisableConcurrentExecution之所以使用它,是因为在hangfire文档中说互斥体和信号量不能保证该作业仅被调用一次。
PS2:检查我的hangfire 服务器,我注意到我有两个实例,每个实例有 1 个工作人员,所以我认为这是一个并行问题而不是并发问题。
这个工作环境适合我。我使用了MaximumConcurrentExecutions(1)装饰hangfire运行的接口方法。
这并不能单独解决我的问题,因为有多个服务器(自动扩展)。
因此,在启动类中,我创建另一个backgroundjobserveroptions来为此作业创建一个独占服务器,以保证当应用程序扩展时不会使用另一个队列创建另一个服务器,我必须在sqlserverhangfire.server中查询并检查我的队列已经存在。
if(!HangfireServerInfo.QueueExists("queuename", AppSettings.GetConnectionString("Hangfire"))){
var hangfireServerOptions = new BackgroundJobServerOptions { WorkerCount = 1, Queues = new[] {"queuename"} };
app.UseHangfireServer(hangfireServerOptions);
}
public static class HangfireServerInfo
{
public static bool QueueExists(string queueName, string connectionString)
{
using (var connection = new SqlConnection(connectionString))
{
var cmd = connection.CreateCommand();
cmd.CommandText =
$@"SELECT COUNT(*)
FROM {YOURHANGFIRESERVER.server}
WHERE JSON_QUERY(data, '$.queues') = '[""{queueName}""]'";
connection.Open();
var result = (int)cmd.ExecuteScalar();
connection.Close();
return result > 0;
}
}
}
Run Code Online (Sandbox Code Playgroud)
也许这是解决问题的更好方法,但这确实有效。