我需要每两周向一组过滤过的用户发送个性化电子邮件(大约100,000)。我正在为它使用营销云API。我设计这个系统的方式如下:
我将使用celery.chord一个接一个地调用这些任务
chord(add_user_data.s(user_id) for user_id in get_user_ids(limit=1000))(send_email)由于市场营销云API对并发请求数量的限制,我将控制add_user_data排队的任务数。
这个设计看起来还好吗?我主要担心的是,如果由于部署而重新启动工作人员,会发生什么?
发布于 2022-04-04 21:36:09
在记忆中打10万次这样的网际网路电话是自找麻烦。
您的程序将崩溃或错误,您将不知道什么已经通过和失败。
当您添加并行性和电子邮件时,会使问题更加复杂。
你需要这样的东西:
for each user
//create email
for each email that is in status "new"
//mark email sending
try
//send email
//mark email sent
catch
//mark email failed即使这还不够,因为发送smtp消息时出现的连接错误可能意味着它已发送,也可能意味着它没有发送。如果出了问题,你想要阻止所有的线程。
如果您想并行发送(并且您可能使用100,000),您也需要某种速率限制,您不希望同时打开10万个网络连接。但是要使用信号量将数字保持在带宽可以处理的范围内。
我们可以进一步讨论计划中的任务,理想情况下,您应该避免这些任务。在这两周的时间里,让一项服务持续运行,每隔几秒钟发送一封电子邮件,这比等到最后一次试着做到这一点要好。
显然,如果你的电子邮件是“热门的新闻媒体股票新闻!”你可能不得不这样做,但对于大多数事情来说,没有必要对其进行分批处理。
如果您正在使用“营销云api”向您发送电子邮件,则应提供您所需的所有工具,用于管理用户数据、创建模板、测试电子邮件、为用户组进行“活动”,并处理所有实际发送给您的邮件,以及报告哪些人阅读了您的电子邮件,哪些人单击了链接,取消订阅按钮等。
除了上传用户数据和单击按钮之外,您不需要做太多其他事情。
发布于 2022-04-07 17:07:07
您可能需要考虑解耦用户列表集合、发送消息和处理错误。
为了这件事,我会在中间排个队。计划的作业接受用户ids并将它们写入队列中。
许多队列解决方案允许侦听队列和处理出现的消息;您可能有一个侦听器任务来实际调用每个消息的api。
如果某个特定的消息无法传递,例如,由于一个错误,您可以将该数据写入另一个队列进行以后的分析。
https://softwareengineering.stackexchange.com/questions/437809
复制相似问题