我正在尝试构建一个作业调度程序。我有一个要在 2-3 台不同机器上按时间执行的作业列表。所以任何机器都可以选择任何工作,如果它的next_execution_time < current_time
. 我将所有作业存储在数据库表中,并使用SELECT.... FOR UPDATE
SQL 中的查询来选择要执行的作业。
但是这种方法的问题是,如果一台机器1选择了一个作业,由于只有写锁,其他机器也会选择相同的作业执行,但不能执行,因为它们会等待锁定释放或锁定超时将发生。那么有什么办法让其他机器跳过这个作业并使用 SQL 锁执行其他作业。不应该在数据库中添加其他列?
流程是这样的:
select a job and lock it -> execute the job -> release the lock
我正在使用 ruby-on-rails 来开发它。如果 rails 中没有等待或 set_lock_timeout = 0。它可能可以解决问题。如果存在......语法是什么?