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

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

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

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 44
保安

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

3周前 评论
bluememory 3周前
保安 (作者) 3周前
小月月是我我是小月月 (楼主) 3周前

用 curl_multi 并发请求

3周前 评论

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

3周前 评论

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

3周前 评论

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

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

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

3周前 评论

会被封

3周前 评论
小月月是我我是小月月 (楼主) 3周前
markyanggang 3周前
小月月是我我是小月月 (楼主) 3周前
Angle (作者) 2周前

如果是发送同一套模版的话,我记得是可以多人发送的

3周前 评论

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

3周前 评论

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

3周前 评论

不知道大家有用过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就满了。

3周前 评论
ysxpark 3周前
jiangjun 2周前

大批量消息发送要慎重

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

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

3周前 评论

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

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

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

  1. curl_multi
  2. swoole携程
3周前 评论

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

3周前 评论

用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();
2周前 评论

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

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

2周前 评论
markyanggang 2周前
kureCC (作者) 2周前

laravel horizon 多开几个进程足矣。

2周前 评论
raybon 1周前

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

2周前 评论

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

2周前 评论

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