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

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

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

  1. 一次性读取出所有用户email, 然后仍到队列中吗? 如何保证队列服务器(独立)宕机 业务逻辑能够恢复?
  2. 能否做到分批读取然后在队列发送?
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《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年前 评论

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