征集贡献:将所有延迟任务迁移到 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_priority,low_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