Долгожданная фича наконец добралась до v1.6.0: теперь для обработки задач не обязательно поднимать пул потоков. Вместо этого можно запускать fibers внутри одного потока-реактора. Автор идеи — @crmne, реализация вошла в PR #728. Настройка элементарная: в конфигурации workers достаточно указать не количество threads, а количество fibers, примерно так:
workers:
- queues: "api*"
fibers: 100
polling_interval: 0.05
Под капотом используется библиотека Async, так что она должна быть прописана в зависимостях. Кроме того, в Rails обязательно включить изоляцию файберов через config.active_support.isolation_level = :fiber. Связка заточена под I/O-bound-нагрузки, особенно когда много времени уходит на ожидание ответа от внешних сервисов — например, вызовов к LLM.
Попутно в релизе подчистили баги. Если тестовая джоба падала и воркер умирал, транзакции могли оставаться открытыми и засорять базу. Теперь в тестовом окружении такие транзакции автоматически откатываются — спасибо @rosa и PR #773. Ещё @wintan1418 добавил в документацию понятное описание, как правильно обновлять динамические повторяющиеся задачи (PR #777). Полный список изменений лежит в сравнении v1.5.1...v1.6.0.