如何确保 Sidekiq 后台作业针对它们启动的同一数据库运行
Posted
技术标签:
【中文标题】如何确保 Sidekiq 后台作业针对它们启动的同一数据库运行【英文标题】:How can I ensure Sidekiq background jobs run against the same database they were initiated from 【发布时间】:2022-01-21 02:42:48 【问题描述】:我一直在使用新的原生多数据库连接切换在 Rails 6.1 中实现水平数据库分片。总的来说,这很有效,但我正在努力寻找确保后台作业(通过由共享 Redis DB 支持的 Sidekiq)在启动它们的同一数据库分片上运行的最佳方法。
例如,我有两个水平数据库分片,数据库 A 和数据库 B。该作业在连接到数据库 A(使用 Rack 中间件)时从 Web 进程中排队。当该作业稍后在 Sidekiq 进程中运行时,我希望该作业自动针对数据库 A 运行。
执行此操作的蛮力方法是将当前连接的数据库作为参数传递给每个作业,然后在每个作业中,使用https://guides.rubyonrails.org/active_record_multiple_databases.html 处的功能连接到参数中指定的数据库。
如果我使用像 Apartment 这样的较旧的水平分片解决方案,https://github.com/influitive/apartment-sidekiq gem 正是我所需要的。但是,我找不到任何关于如何使用 Rails 的新本机功能做类似事情的解决方案。
最好的方法是什么?
【问题讨论】:
我强烈建议不要尝试这个。这是一条通往分布式事务的道路,我从未见过任何值得付出代价的实现。 @BroiSatse 感谢您的回复。我相信我最初的问题令人困惑,因此澄清了措辞。我不认为这里应该有任何分布式事务。 【参考方案1】:您想使用客户端中间件保存当前分片并在服务器中间件中恢复它。请参阅有关 ActiveSupport::CurrentAttributes 和 Middleware wiki page 的注释。
【讨论】:
以上是关于如何确保 Sidekiq 后台作业针对它们启动的同一数据库运行的主要内容,如果未能解决你的问题,请参考以下文章
ActiveJob + Sidekiq 6.0.3:如何写入日志文件?
为啥我的 sidekiq 计划的 cron 作业没有在 heroku 上运行?