ruby-on-rails 如何在两个sidekiq工作者之间共享数据

xqk2d5yq  于 2023-05-19  发布在  Ruby
关注(0)|答案(2)|浏览(154)

想象一下,有数十亿用户,每个用户可以有多个电子邮件ID,任务是在最短的时间内向每个用户发送新年快乐的问候。
有两个sidekiq工作者,一个工作者获取用户的电子邮件ID。
另一个员工只发送电子邮件通知。
思想过程是实现并行性,一个工作者将只获取用户的电子邮件,另一个工作者将只发送电子邮件。
有没有办法用sidekiq实现这一点

2w2cym1i

2w2cym1i1#

只需要让一个worker获取一个email id(不管是什么意思),然后在这个worker中让另一个worker排队发送email(传递email id)。

gr8qqesn

gr8qqesn2#

你确实可以做一些优化,实际上是一些优化。
1.获取所需的实际信息而不是用户ID,因此步骤2根本不需要访问数据库。IE:对于新年问候,您可能需要用户的名字(至少是名字)和他们的电子邮件地址。用户ID可能没有帮助,因为您需要执行数据库查询来查看用户以获得所需的实际信息。不过,将其包含在其他用途中可能仍然有用(参见下面的#3)
1.提前安排尽可能多的电子邮件。步骤1中的一切都可以在您实际需要发送电子邮件之前完成。然而,有可能会错过一些用户(可能是非常小的百分比),所以...
1.向数据库(甚至整个数据库表)添加列,以显示用户是否已排队等待发送新年问候(或其他节日)电子邮件。一列可以是new_years_greeting_email_queued_to_be_sent_at,另一列可以是new_years_greeting_email_sent_at。第一个字段用于标记第一个worker已经运行。第二个字段显示第二个工作进程已运行。添加一个你可以运行的方法来获取所有尚未排队发送 * 今年 * 电子邮件的用户(确保测试好了)。然后,你可以提前运行#1,然后在你发出所有的提前电子邮件后再次运行,以捕捉任何人谁已经加入你做了#1以上。
1.记住#1和#2,更改第一个worker,使其只执行数据库查询,并再次提前填充worker #2的所有作业。
更大的问题是,两个工人可能不够。一个作品一秒钟可以处理一万封邮件?这将需要一天多一点的时间来完成(需要超过12K的电子邮件每秒完成一天)。如果你是说几百万,那么按照这个速度,你应该能按时完成。即使你一秒钟只发送大约12封电子邮件,一天之内就能完成,假设你没有受到费率限制,一秒钟发送100封左右的电子邮件应该不会太麻烦。
尽管你肯定需要与你正在使用的任何服务协调发送电子邮件,以确保它不会成为一个问题。
警告:要小心以上方法,如果你有数十亿封电子邮件要发送(甚至数百万封),你可能会超过redis的存储限制。在这种情况下,您可能需要跳过#1,只存储ID。如果你正在使用Heroku或类似的东西,你可能只是能够启动额外的dynos来处理它,而不是使用worker(#1和#2仍然可以提前完成,只是使用存储在数据库中的数据,然后你可以做一个find_each循环查询,以找到哪些用户仍然需要他们的新年邮件发送。

相关问题