发布于 2026-01-06 5 阅读
0

征集贡献:将所有 DelayedJobs 迁移到 Sidekiq Epic:将任务从 DelayedJobs 迁移到 Sidekiq #5305 任务待办

征集贡献:将所有延迟任务迁移到 Sidekiq

史诗级:将任务从 DelayedJob 迁移到 Sidekiq #5305

待办事项

大家好!!!👋

现在我们已经拥有了一个速度飞快的 Redis 实例,我们将所有后台任务从 DelayedJob 迁移到 Sidekiq!点击下方链接了解更多信息!

里面详细介绍了我们为什么要迁移到 Sidekiq,迁移的具体计划,以及参与贡献的指南,甚至还有一些示例 PR 可以帮助你快速上手。我认为这对任何想要尝试开源项目的人来说都是一个绝佳的机会。如有任何疑问,请随时联系我!

编码快乐😃

史诗级:将任务从 DelayedJob 迁移到 Sidekiq #5305

我们为什么要迁移到 Sidekiq

由于 DelayedJob 依赖数据库来处理作业,当作业量很大时,速度会非常慢。因此,我们正在切换到 Sidekiq,以确保随着作业量的增加,我们能够应对新的负载。此外,由于 DelayedJob 无法很好地处理大量作业,我们之前在生产环境中忽略了所有作业失败,这对于确保可靠性而言并不理想。而 Sidekiq 则不同,我们无需担心作业失败的问题,因为 Sidekiq 借助 Redis 能够快速处理大量作业。

Sidekiq 还拥有许多非常棒的功能和插件,随着我们的任务/工作流程变得越来越复杂,我们可以充分利用它们。如果您想了解更多关于 Sidekiq 为何是一款优秀的后台任务工具的信息,请查看我撰写的这篇关于从 Resque 迁移到 Sidekiq 的博文

为什么不直接将 Sidekiq 集成到 ActiveJob 中呢?是的,Sidekiq 可以集成到 ActiveJob 中,但是这样做有一些缺点。最明显的是,速度会慢 2 到 20 倍。另一个很大的缺点是 ActiveJob 与Sidekiq 的商业功能不兼容,而我们将来可能需要用到这些商业功能。我计划只在 ActiveJob 中用它来发送邮件,因为这类任务比较简单。对于其他任务,如果我们能完全将其迁移到 Sidekiq 并保持界面尽可能简洁,从而获得完全的控制权,那就更有优势了。

跳槽策略

与 Redis 键的处理方式相同,我们将逐个迁移任务。当一个任务从 DJ(DelayedJob)迁移到 Sidekiq 时,我们会将其名称重命名,并在末尾添加 `_`。Worker例如:BustMultipleCachesJob`=>`。BustMultipleCachesWorker这些新的 worker 将存储在一个单独的文件夹中,与原有任务分开,这有助于我们快速评估哪些任务仍需完成。

您可以如何提供帮助!

有很多工作需要迁移,所以我非常希望社区能够帮忙!请认领一个工作,将其迁移到 Sidekiq,然后提交一个 PR 并标记此问题。

换工作时

迁移作业有两种方法: 1. 创建一个新的 Worker 类,并在同一个 PR 中删除原作业:对于运行频率不高的作业,这种方法完全可行。例如,如果一个作业每天只从调度器运行一次,那么我们可以用一个 PR 完成迁移。2 . 创建一个新的 Worker,提交一个 PR。该 PR 合并后,再提交第二个 PR 来移除原作业:对于执行频率高的作业,例如索引或缓存清除作业,我们需要采用这种方法。通过分别合并 PR,我们可以确保在创建新 Worker 时不会出现任何正在运行的作业被阻塞的情况。

我应该把它放到哪个队列里?看看任务的执行频率和重要性。例如,从用户界面启动的、用于更新我们想要的数据的任务,执行速度非常快,以便用户能够立即获取所需数据。而发放徽章的定时任务则没那么重要,可以稍微延迟一下,放到低优先级队列里。我们现有的 Sidekiq 队列如下:

:queues:
  - ["default", 1]
  - ["low_priority", 10]
  - ["medium_priority", 100]
  - ["high_priority", 1000]
  - ["scheduler", 1000]
  - ["mailers", 1000]

右侧的数字表示队列的重要性。数字越高,队列越重要,执行速度也越快。这些数字实际上是一个比率。如果所有队列都已满,我们将执行 1000 个任务,每 10 个任务执行 1000 个high_priority任务medium_prioritylow_priority以此类推。

当你更换工作时,请务必仔细审视工作本身,并努力改进工作表现或执行方式。例如:

  • 即使旧作业没有测试,也请为新工作进程添加测试。此外,请添加新的shared_context 示例规范,以确保为每个作业设置正确的队列。感谢@rhymes ,我们还添加了一些其他测试辅助工具供您使用。
  • 当数据缺失时,添加提前返回语句以避免不必要的工作
  • 这项工作是否正在悄无声息地失败?或许有些时候,我们不希望工作再这样悄无声息地失败了。
  • 这些参数是对象吗?我们不希望传递任何对象参数,我们的目标是简单的字符串,所以请花点时间将它们更改为字符串、ID 或其他类型。

示例 PR

单个 PR 迁移:https://github.com/thepracticaldev/dev.to/pull/5269多个 PR 迁移:PR 1 - https://github.com/thepracticaldev/dev.to/pull/5302

待办事项

告诉我你想做什么!

文章:

  • [x] bust_multiple_caches_job
  • [x] detect_human_language_job.rb
  • [x] score_calc_job.rb
  • [x] update_analytics_job.rb
  • [x] update_main_image_background_hex_job.rb

审计

  • [x] save_to_persistent_storage_job.rb

徽章成就

  • [x] send_email_notification_job.rb

聊天频道

  • [x] index_job.rb

机密

  • [x] bust_cache_job.rb

评论

  • [x] bust_cache_job.rb
  • [x] calculate_score_job.rb
  • [x] create_first_reaction_job.rb
  • [x] create_id_code_job.rb
  • [x] send_email_notification_job.rb
  • [x] touch_user_job.rb

活动

  • [x] bust_cache_job.rb

跟随

  • [x] create_chat_channel_job.rb
  • [x] send_email_notification_job.rb
  • [x] touch_follower_job.rb

提及

  • [x] create_all_job.rb
  • [x] send_email_notifications_job.rb

通知

  • [x] 提及_job.rb
  • [x] new_badge_achievement_job.rb
  • [x] new_reaction_job.rb
  • [x] remove_all_job.rb
  • [x] welcome_notification_job.rb
  • [x] 里程碑作业.rb
  • [x] new_comment_job.rb
  • [x] notifiable_action_job.rb
  • [x] tag_adjustment_notification_job.rb
  • [x] moderation_notification_job.rb
  • [x] new_follower_job.rb
  • [x] remove_all_by_action_job.rb
  • [x] update_job.rb

组织

  • [x] bust_cache_job

  • [x] bust_cache_job

播客剧集

  • [x] bust_cache_job
  • [x] 创建作业
  • [x] 更新可响应作业

播客

  • [x] bust_cache_job
  • [x] 获取剧集工作

专业会员资格

  • [x] 热门历史职位

反应

  • [x] bust_homepage_cache_job.rb
  • [x] bust_reactable_cache_job.rb
  • [x] create_job.rb
  • [x] update_reactable_job.rb

搜索

  • [x] index_job
  • [x] 从索引中移除作业

  • [x] twitch_webhook..._job

标签

  • [x] bust_cache_job

用户

  • [x] bust_cache_job.rb
  • [x] follow_job.rb
  • [x] self_delete_job.rb
  • [x] touch_job.rb
  • [x] estimate_default_language_job.rb
  • [x] resave_articles_job.rb
  • [x] subscribe_to_mailchimp_newsletter_job.rb

Webhook

  • [x] 销毁作业
  • [x] dispatch_event_job

其他

  • [x] html_variant_trial_create_job.rb
  • [x] html_variant_success_create_job.rb
  • [x] export_content_job.rb
  • [x] slack_bot_ping_job.rb
  • [x] rss_reader_fetch_user_job.rb
文章来源:https://dev.to/devteam/call-for-contributions-move-all-delayedjobs-to-sidekiq-246k