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

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

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

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

一种蛮力的方法是将当前连接的数据库作为参数传递给每个作业,然后在每个作业中,使用 [=11 处的功能连接到参数中指定的数据库=].

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

完成此任务的最佳方法是什么?

您想使用客户端中间件保存当前分片并在服务器中间件中恢复它。请参阅有关 ActiveSupport::CurrentAttributes and the Middleware wiki page.

的注释