gpt4 book ai didi

ruby-on-rails - delayed_job : One job per tenant at a time?

转载 作者:行者123 更新时间:2023-12-02 00:54:47 25 4
gpt4 key购买 nike

我有一个包含多个 delayed_job worker 的 Multi-Tenancy Rails 应用。

为了避免特定于租户的工作重叠,我想将工作人员彼此分开,以便每个人一次只处理一项特定于租户的任务。

我考虑过使用(命名的)queue 列并添加“tenant_1”、“tenant_2”等。不幸的是,队列必须在配置期间命名,所以这个原则对于许 Multi-Tenancy 来说不够灵活。

有没有办法自定义 delayed_job 选择下一个任务的方式?还有另一种定义范围的方法吗?

最佳答案

你最好的选择可能是旋转一个实现分布式锁的自定义解决方案 - 本质上,工作人员都正常运行并从通常的队列中拉出,但在执行工作检查之前与另一个系统(Redis,RDBMS,API,等等)以验证没有其他 worker 正在为该租户执行工作。如果该租户没有工作,则为有问题的租户设置锁并开始工作。如果租户被锁定,请不要执行该工作。这是您对许多实现细节的要求,例如是否继续尝试另一项工作,将工作重新排到队列的后面,是否将其视为失败并将其绑定(bind)到您的重试限制,或者做其他事情完全。这是非常开放的,所以我会把细节留给你,但这里有一些提示:

  • 继承将是你的 friend ;在基础作业上定义此行为,并在您希望工作人员运行的作业上继承它。这还允许您自定义行为,如果您对某些工作有“特殊”情况,但不会破坏其他一切。
  • 假设您没有运行 ActiveJob(因为没有提到),请阅读 delayed_job Hook :https://github.com/collectiveidea/delayed_job/#hooks - 它们可能是合适的和/或有用的工具
  • 熟悉悲观和乐观锁定策略的一些差异和权衡 - 这个答案是一个很好的起点:Optimistic vs. Pessimistic locking
  • 阅读有关分布式锁概念的一般实践,以便您可以为自己选择最好的工具和策略(它不一定是一个疯狂复杂的解决方案,数据库中存储租户标识符的简单表是足够了,但你需要考虑失败案例——例如,如何管理被放弃的锁)

认真考虑不这样做;系统正常运行真的有严格要求吗?如果是这样,这可能表明您的数据模型存在潜在缺陷,或者您如何围绕该数据构建转换。在考虑对数据的操作时,在您的应用程序中争取 ACIDity,您可以避免很多此类问题。它不是后台作业运行器上普遍可用的“开箱即用”功能是有原因的。如果存在潜在缺陷,它不仅会在这个问题上影响您,还会在其他问题上影响您 - 保证!

关于ruby-on-rails - delayed_job : One job per tenant at a time?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55110898/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com