跪求,邮件群发如何提高效率?

lxping

由于邮件发送比较耗时,所以我用AsyncTcpConnection异步任务,但由于workerman是多进程单线程,那么在如下场景中,该如何提高并发效率呢?

场景:
有2个耗时任务需要在同一时间执行,其中一个是邮件群发,假设要发送1000个邮件,任务进程100个。

方案疑问:
1、1000个邮件分别通过AsyncTcpConnection发送给100个进程。这种方案会因为100个进程被占满,而导致另一个任务必须等待1000个邮件全部发送完毕后才能执行。

2、1000个邮件只发送给1个进程,这样虽然2个任务都能同时执行,但其余的98个进程处于闲置状态,而1000个邮件只能在单线程中耗时很久。

3、根据任务中的子任务数量均分进程,比如让1000个邮件占用80个进程,另一个任务占用20个进程。但是任务有很多种类,都是后台人工添加的,所以php无法知道某个任务是不是非常耗时,而无法正确分配进程。

4、采用php多线程,但workerman手册说pthreads扩展还不够稳定,所以不知道php多线程是否靠谱。

所以上述我能想到的4种方案,都存在问题,那么,还有什么方案能保证我这个需求呢?跪求!!

1948 2 0
2个回答

blogdaren

1、首先按照手册的异步方案来实施:
http://doc.workerman.net/faq/async-task.html
假定两个耗时任务分别为A和B、那么对于单台任务服务器可以开启两组不同的端口,即分别对应AB开启两种不同的业务进程组分别处理;另外任务服务器的强处理能力需要保证:比如多核保证充分发挥多进程优势、另外就是足够大的内存、这个需要自己根据业务评估;再有就是集群了,把不同的任务交给不同的机器来处理。
2、1000个邮件只发送给1个进程,这样虽然2个任务都能同时执行,这个说法不对,单进程内是不可能并行执行的,是串行运作的;
3、比如:写入任务的时候给任务打个tag或优先级啥的,这样根据不同的tag交给不同的进程组或机器来处理;
4、PHP的多线程扩展不稳定,所以不推荐使用;

  • lxping 2020-02-19

    谢谢,我也想过使用不同端口运行不同任务,但是由于任务的数量是不确定的,就需要动态开启新端口。但workerman启动多少个进程,只能在linux里部署时或者平滑重启才能生效,无法通过php端的代码动态新增端口。

  • blogdaren 2020-02-20

    我认为技术架构的变迁是一定是跟随着业务联动变迁的;任务数在特定的一段周期内肯定是能有个预估值的;长远的看即便任务数量不确定,也没什么关系呢,还是那句话,有量就同步的横向扩展多进程模型甚至集群部署;另外新增动态端口可以通过新增独立的启动脚本实现,不一定非得是在原启动脚本下派生子进程;
    关于如何平滑新增服务,看这里: https://github.com/walkor/Workerman/pull/503

小阳光

我只看了你说的用线程,没看业务,你可以用swoole的协程

  • 暂无评论
年代过于久远,无法发表回答
🔝