大批量推送邮件,请教如何提升推送速率
线上环境 php7.3 laravel8.5+,服务器 8核16G。
如题,由于业务需要,经常需要通过代码端动态配置邮件然后进行邮件推送,而且是大批量的邮件推送,邮件推送采用的是laravel的邮件队列,通过supervisor控制的。
服务器 supervisor配置如下:
[program:my-project]
process_name=%(program_name)s_%(process_num)02d
command=php /myproject/artisan queue:work --sleep=3 --tries=3
autostart=true
autorestart=true
user=root
numprocs=8
redirect_stderr=true
stdout_logfile=/var/log/supervisor/supervisor.log
采用的是阿里云的邮件推送服务,通过阿里云官方文档查询得知邮件推送频率限制如下:

文档地址:help.aliyun.com/document_detail/29...
在以上配置的前提,邮件推送的qps统计如图:

应该是远远没到阿里云官网给出的推送频率限制的,今天推送大约32000封邮件花了差不多3个半小时。
请教如何在此基础之上提升邮件推送速率。
本作品采用《CC 协议》,转载必须注明作者和本文链接
关于 LearnKu
使用多进程解决吧。可以使用 swoole, workman 等,你在 laravel 处理好数据,另起一个框架用来跑多任务。
这种业务用 serverless 也不错呀,部署在杭州地域,然后走内网去调用邮箱接口。数据通过MQ来推送。
怎么说呢,提升性能,还是要多检查自己的资源/链路情况,在大量信息不清楚的情况下也没办法推荐的。
用上 curl 多线程
业务上:如果内容都是一样的,且可以接受抄送,可以在一封邮件抄送给几十乃至上百个人……这样可以降低请求数量,这个速度的提示效果是非常可观的!
代码上:在进入队列之前,建议将邮件通知用到的数据都查出来预处理好,队列中就不要再做其他业务数据的查询了!
将 Web 服务与 Queue 分开部署(为了不影响其他业务),Queue 单独一台机器,调大
numprocs设置,看是否能一定程度的提高发送效率!大批量的邮件推送,一般都是运营业务需要,你的卡点是
supervisor设置8个进程消费邮件推送,每分钟也才推送158个,要么增加进程消费(实现简单,但是需要吃服务器资源),要么在进程中使用异步并发处理(增加了业务复杂度)。个人推荐异步并发处理,php有异步并发处理的包,例如
amphp,以下chatgpt简单示例,仅供参考:上面都谈及加大 numprocs 是一种方案,但也有个缺点:在没有任务的时候会有大量进程空跑,建议用 horizion 做队列消费进程的动态扩缩,文档见: Horizon 队列管理工具 。如果是单机直接部署,一样可以用 supervisor 启动 horizon 的一个进程,将队列消费进程的数量控制交给 horizion 自动扩缩。
任务ID取模搞成多线程推
问个题外话,阿里的delivered会很高吗?
使用 Horizon 工具应该是可以解决你的问题的
低效的地方是 网络通信,这种情况用协程可解决
一个一个的发送调用,2个小时我都能怼好几十万
我们也用阿里云邮件推送。你的瓶颈在 SMTP 吧,事务性邮件优先使用 HTTP API 发送,而不是传统的 SMTP 协议。
supervisor创建两个,一个处理默认 --queue=default队列,一个处理邮件队列