大批量推送邮件,请教如何提升推送速率

线上环境 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 协议》,转载必须注明作者和本文链接
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 28

使用多进程解决吧。可以使用 swoole, workman 等,你在 laravel 处理好数据,另起一个框架用来跑多任务。

1个月前 评论
CTdream (楼主) 1个月前
sanders 1个月前
aliongkk 3周前

这种业务用 serverless 也不错呀,部署在杭州地域,然后走内网去调用邮箱接口。数据通过MQ来推送。

怎么说呢,提升性能,还是要多检查自己的资源/链路情况,在大量信息不清楚的情况下也没办法推荐的。

1个月前 评论

用上 curl 多线程

1个月前 评论

业务上:如果内容都是一样的,且可以接受抄送,可以在一封邮件抄送给几十乃至上百个人……这样可以降低请求数量,这个速度的提示效果是非常可观的!

代码上:在进入队列之前,建议将邮件通知用到的数据都查出来预处理好,队列中就不要再做其他业务数据的查询了!
将 Web 服务与 Queue 分开部署(为了不影响其他业务),Queue 单独一台机器,调大 numprocs 设置,看是否能一定程度的提高发送效率!

1个月前 评论
CTdream (楼主) 1个月前

大批量的邮件推送,一般都是运营业务需要,你的卡点是supervisor设置8个进程消费邮件推送,每分钟也才推送158个,要么增加进程消费(实现简单,但是需要吃服务器资源),要么在进程中使用异步并发处理(增加了业务复杂度)。

个人推荐异步并发处理,php有异步并发处理的包,例如amphp,以下chatgpt简单示例,仅供参考:

file

amphp/parallel官方文档

1个月前 评论
sanders

上面都谈及加大 numprocs 是一种方案,但也有个缺点:在没有任务的时候会有大量进程空跑,建议用 horizion 做队列消费进程的动态扩缩,文档见: Horizon 队列管理工具 。如果是单机直接部署,一样可以用 supervisor 启动 horizon 的一个进程,将队列消费进程的数量控制交给 horizion 自动扩缩。

1个月前 评论
CTdream (楼主) 1个月前

任务ID取模搞成多线程推

1个月前 评论
laravelphp_game 4周前
xiusin (作者) 4周前

问个题外话,阿里的delivered会很高吗?

1个月前 评论
CTdream (楼主) 1个月前

使用 Horizon 工具应该是可以解决你的问题的

1个月前 评论

低效的地方是 网络通信,这种情况用协程可解决

4周前 评论

一个一个的发送调用,2个小时我都能怼好几十万

4周前 评论
lovewei 4周前
CTdream (楼主) 4周前
lovewei 4周前
CTdream (楼主) 4周前
CTdream (楼主) 4周前

我们也用阿里云邮件推送。你的瓶颈在 SMTP 吧,事务性邮件优先使用 HTTP API 发送,而不是传统的 SMTP 协议。

4周前 评论
CTdream (楼主) 3周前

supervisor创建两个,一个处理默认 --queue=default队列,一个处理邮件队列

4周前 评论
CTdream (楼主) 3周前

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