![]() |
1
2
您最好的选择可能是运行一个实现分布式锁的自定义解决方案——本质上,工作线程都正常运行并从通常的队列中拉出,但是在与另一个系统(redis、rdbms、api等)执行工作检查之前,要验证没有其他工作线程正在执行jo。B给那个房客。如果该租户没有工作,则为该租户设置锁并执行该作业。如果房客被锁了,就不要做这项工作。这取决于很多实现细节,比如是否继续尝试另一个作业,在队列后面重新将作业排队,是否将其视为失败并将其绑定到重试限制,或者完全执行其他操作。这是非常开放的,所以我将把细节留给您,但这里有一些提示:
认真考虑不这样做;这真的是严格要求系统正常运行吗?如果是这样的话,这可能表明了数据模型中的一个潜在缺陷,或者说明了如何围绕该数据构建转换。在考虑对数据的操作时,请尽量在应用程序中使用酸度,这样可以避免很多这些问题。这是一个原因,它不是一个常见的“开箱即用”的功能,对后台求职者。如果有一个潜在的缺陷,它不仅会咬你在这个问题上,但在其他东西-保证! |
![]() |
2
0
如果您试图避免两个不同的工人在同一个租户上工作,那么这是一个糟糕的设计选择。有东西闻起来了。先把它修好。但是,如果您希望相同类型的工作实例在下面的不同属性上工作,则是最简单的解决方案。这些关系是我的假设。
这将为每个租户创建唯一的作业。单个工作实例将在特定租户上工作。但是,也可以有其他类型的工作在同一个租户。这应该是好的。如果需要更小的作用域,只需为工作进程传递更多参数并在查询中使用,然后使用数据库事务来避免冲突。 这些 best practices 对任何背景工作者来说都是正确的。
如果你使用 apartment 宝石和 active job 包装纸。请参阅文档中的示例。 |