如何实现30分钟之内,推送微信模板消息 50万次?

问题:2核8G 的阿里云服务器,想给50万用户及时推送微信模板消息通知。需要在30分钟之内推送完毕,当然速度越快越好。目前客户不想升级云服务器的配置。

有做过类似场景的吗。请问大家有什么解决方案呢??

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 46

30分钟50万 1秒300条 我觉得有点悬啊

1年前 评论
bluememory 1年前
保安 (作者) 1年前
止语 (楼主) 1年前

用 curl_multi 并发请求

1年前 评论

在我记忆中好像消息模板不能批量发送好像只能单条处理 方案1 队列就是开多个消费进行处理 (fpm) 方案2 swoole 开多个进程 已协程方式跑 父协程下在开多个子协程一起跑

1年前 评论

把需要的放入队列,然后开多个脚本一起消费,如果是php的话,这样最容易实现

1年前 评论

差不多278条/秒,如果微信不限制的话,这个服务器配置我感觉可以做到的,一个是你可以用多线程发送,二十微信也支持同时发多个用户,类似于"touser" : "UserID1|UserID2|UserID3",这样下来效率就提高很多了

1年前 评论
保安 1年前
忆往昔弹指间 (作者) 1年前
保安 1年前
忆往昔弹指间 (作者) 1年前
保安 1年前
markyanggang 1年前
保安 1年前
保安 1年前
WindyLater 1年前

用swoole或者go的多协程,任务分组,同时进行

1年前 评论

会被封

1年前 评论
止语 (楼主) 1年前
markyanggang 1年前
止语 (楼主) 1年前
Angle (作者) 1年前

我觉得一个进程也能完成,参考一下guzzlehttp的异步请求,内部用的io多路复用,无阻塞,失败的时候给个重试机制,平均一秒277个,只要微信不限制,应该可以推送完成

1年前 评论

队列临时多启动一些消费者

1年前 评论

不知道大家有用过swoole 的异步任务吗,https://wiki.swoole.com/#/start/start_task?id=%e6%89%a7%e8%a1%8c%e5%bc%82%e6%ad%a5%e4%bb%bb%e5%8a%a1task 我现在就是用的这个,task_worker_num 开了 50个,现在一发服务器cpu就满了。

1年前 评论
ysxpark 1年前
jiangjun 1年前

大批量消息发送要慎重

二、目前不允许发的模板消息
3、发送频率过高,有骚扰用户倾向类消息模板

developers.weixin.qq.com/doc/offia...

1年前 评论

push 一次算100毫秒 串行推送是需要一些时间 0.1*500000=50000秒

1年前 评论
  1. 扔到队列
  2. 开启多个消费者进程,比如50个
1年前 评论

php这块的话可以用下面的玩意实现

  1. curl_multi
  2. swoole携程
1年前 评论

异步任务开50个就没啦 开协程调度会不会快一点(task_enable_coroutine) 用异步任务task_worker_num 应该是fork子线程

1年前 评论

用Guzzle开50个线程先看下效果。估计也干不完,你这个配置可能真的做不到,至少得搞个8核或者16核,这样nginx还能优化优化。

可以参考一下官方文档 guzzle-cn.readthedocs.io/zh_CN/lat...

use GuzzleHttp\Pool;
use GuzzleHttp\Client;
use GuzzleHttp\Psr7\Request;

$client = new Client();

$requests = function ($total) {
    $uri = 'http://127.0.0.1:8126/guzzle-server/perf';
    for ($i = 0; $i < $total; $i++) {
        yield new Request('GET', $uri);
    }
};

$pool = new Pool($client, $requests(100), [
    'concurrency' => 5,
    'fulfilled' => function ($response, $index) {
        // this is delivered each successful response
    },
    'rejected' => function ($reason, $index) {
        // this is delivered each failed request
    },
]);

// Initiate the transfers and create a promise
$promise = $pool->promise();

// Force the pool of requests to complete.
$promise->wait();
1年前 评论

我使用了go+rabbitmq,完成了推送,主要踩了坑:
1.发送时的协程数要控制
2.你发送1条,微信会回调你一条,所以你1秒发1k条,你的nginx+php-fpm能不能支持1k的并发
3.还有你的带宽流量,发送的http包大小

如果用php的话,可以用swoole,不过思想是一样的,不如直接用go

1年前 评论
markyanggang 1年前
kureCC (作者) 1年前

laravel horizon 多开几个进程足矣。

1年前 评论
raybon 1年前

我这里写了一个专门发微信消息模板的服务,可以试下,目前我们已经投入生产使用了
分享创造:一个解耦微信模板消息,并发发送的golang服务

1年前 评论

微信模板消息发送次数是有上限的。没这么多

1年前 评论

首先,需要先确定服务器是否有足够的 CPU 和内存来处理 50 万条消息。如果服务器性能不足,可能需要更换更强的服务器来满足需求

其次,可以考虑优化推送程序的性能。有几种常见的优化方法:

  • 批量处理消息,即一次处理多条消息。这可以减少消息处理所需的 I/O 操作和网络请求,提高性能。

  • 使用多线程或多进程,即同时处理多个消息。这可以利用多核 CPU 的优势,提高性能。

  • 使用缓存,即将消息先缓存到内存或磁盘中,然后再进行推送。这可以减少消息处理所需的网络请求和 I/O 操作,提高性能。

  • 使用队列,即将消息放到一个队列中,然后再由后台线程或进程进行推送。这可以将推送过程异步化,提高性能。

    总之,如果希望在 30 分钟之内给 50 万用户及时推送微信模板消息通知,可以考虑以上优化方法来提高性能。但是,还要确保服务器性能足够。如果服务器性能不足,需要更换更强的服务器来满足需求。

1年前 评论

我觉得瓶颈不是你这里,而是微信接口吧,能承受多少并发量。

1年前 评论

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