hangfire_distributedlock

        引子:项目中使用azure hangfire来处理定时任务,hangfire的机制要求在db中创建一些列内置表,其中包括 hangfire_distributedlock, 用于实现分布式锁,在一些环境中,当需要删除重建db时,偶尔会出现 hangfire_distributedlock 上的锁长时间未释放导致无法重建db, 目前还没找到导致死锁的具体原因,chatgpt给了一些规避策略,这里记录一下

在使用 Hangfire 和 MySQL 的环境中,Hangfire 使用 hangfire_distributedlock 表来实现分布式锁机制,确保同一时间只有一个任务在执行特定操作。如果在删除和重建数据库 schema 时遇到 hangfire_distributedlock 表被锁住的问题,可以采取以下几个步骤来排查和解决这个问题:

  1. 检查锁的持有者:

    • 使用 SQL 查询来查看 hangfire_distributedlock 表中当前持有锁的记录:
      SELECT * FROM hangfire_distributedlock; 
    • 通过这个查询可以查看到哪些锁是被持有的。
  2. 手动释放锁:

    • 如果确定没有任何任务正在运行并且需要强制删除锁,可以手动删除 hangfire_distributedlock 表中的锁记录:
      DELETE FROM hangfire_distributedlock WHERE `Key` = 'your_lock_key'; 
    • 请确保在执行此操作之前,确认没有其他任务依赖这些锁,否则可能会导致数据不一致或其他问题。
  3. Hangfire 配置优化:

    • 确保 Hangfire 的配置中设置了合理的锁超时时间。例如,可以在 Hangfire 的配置中设置锁的超时时间:
      GlobalConfiguration.Configuration .UseStorage(
              new MySqlStorage(
                      "your_connection_string", 
                      new MySqlStorageOptions 
                      { 
                              DistributedLockTimeout = TimeSpan.FromMinutes(5) // 设置超时时间为5分钟 
                      }
              )
      ); 
  4. 清理旧任务:

    • 确保定期清理 Hangfire 中的旧任务和数据,以防止数据库中的锁和任务堆积。可以使用 Hangfire 的定期任务清理功能:
      var options = new BackgroundJobServerOptions 
      { 
              SchedulePollingInterval = TimeSpan.FromMinutes(1) // 每分钟检查一次任务 }; 
              using (var server = new BackgroundJobServer(options)) 
              {
                       RecurringJob.AddOrUpdate(() => 
                              Console.WriteLine("清理任务"), Cron.Daily); 
              } 
      }
  5. 监控和日志记录:

    • 通过 Hangfire 的日志记录和监控工具,查看哪些任务在什么时候获取了锁,并监控任务的执行情况。可以启用 Hangfire 的仪表盘来监控任务的状态:
      app.UseHangfireDashboard(); 
  6. 数据库操作顺序:

    • 在进行数据库 schema 的删除和重建操作时,确保正确的操作顺序,并在必要时停止 Hangfire 的任务服务器,以确保不会在删除 schema 时有任务尝试运行。
      // 停止Hangfire服务器 
      server.SendStop(); 
      
      // 执行数据库schema删除和重建操作 
      
      // 重新启动Hangfire服务器 
      server.Start(); 

通过以上步骤,应该能够帮助你排查和解决 hangfire_distributedlock 表被锁住的问题。如果问题仍然存在,可以进一步查看 MySQL 的锁定状态和 Hangfire 的详细日志,以找出问题的根源。

---------------------------------日常的分割线-----------------------------

  • 24
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值