大批量队列发送邮件的处理

目前有这么一个需求, 站点需要定期的针对某分组的用户发送推广邮件

假设该分组用户是5W. 在使用Queue进行邮件发送时该如何设计?

  1. 一次性读取出所有用户email, 然后仍到队列中吗? 如何保证队列服务器(独立)宕机 业务逻辑能够恢复?
  2. 能否做到分批读取然后在队列发送?
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 1

默认你使用了 redis 缓存和 redis 队列。

方案

  1. 根据 ID 正序每次取100或者更多的用户,放入队列
  2. 用 Cache 来标记当前发送的用户 ID,并缓存时间为1天(这里我认为应该不会1天发多次吧,并且一天内发送完毕)
  3. 每发送一条就去检查当前发送的用户 ID 是否是最后一条。如果是,那么调用发送邮件的命令,根据 Cached 的 ID 继续取下100 条放入队列,如果没有用户了,那么就自动终止了该程序

你的疑惑

  1. redis 是持久化存储,宕机后重启自动继续,队列和数据不会丢失。
  2. 每次发送一定的数据,不会因为数据量大而超过了运行内存崩溃。
  3. 哪怕在运行过程中有新的用户注册(运行时间可能不短),也不用担心,因为该方案按照 ID 正序去取用户。
  4. 你只需要写一个 command 和一个 queue job 即可。
8年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!