繁体   English   中英

如何确保 Sidekiq 后台作业针对它们启动的同一数据库运行

[英]How can I ensure Sidekiq background jobs run against the same database they were initiated from

我一直在使用新的本机多数据库连接切换在 Rails 6.1 中实现水平数据库分片。 这通常效果很好,但我正在尝试找到最佳方法,以确保后台作业(通过由共享 Redis DB 支持的 Sidekiq)针对启动它们的同一数据库分片运行。

例如,我有两个水平数据库分片,数据库 A 和数据库 B。作业从 web 进程排队,同时连接到数据库 A(使用 Rack 中间件)。 当该作业稍后在 Sidekiq 进程中运行时,我希望该作业自动针对数据库 A 运行。

一种蛮力的方法是将当前连接的数据库作为参数传递给每个作业,然后在每个作业中,使用https://guides.rubyonrails 中的功能连接到参数中指定的数据库。 org/active_record_multiple_databases.html

如果我使用像 Apartment 这样的水平分片的旧解决方案,那么https://github.com/influitive/apartment-sidekiq gem 正是我所需要的。 但是,我找不到任何关于如何使用 Rails 的新本机功能做类似事情的解决方案。

实现这一目标的最佳方法是什么?

这是不可能的。 作业可以在进程 A 中创建并在进程 B 中执行。进程之间无法进行连接共享。

您想使用客户端中间件保存当前分片并在服务器中间件中恢复它。 请参阅有关ActiveSupport::CurrentAttributesMiddleware wiki 页面的注释。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM