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

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

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

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 46

大批量消息发送要慎重

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

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

1年前 评论

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

1年前 评论

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

1年前 评论

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

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

用 curl_multi 并发请求

1年前 评论

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

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

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

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

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

1年前 评论

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

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

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

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

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

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

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

1年前 评论

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

1年前 评论

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

1年前 评论

laravel horizon 多开几个进程足矣。

1年前 评论
raybon 1年前

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

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

1年前 评论
markyanggang 1年前
kureCC (作者) 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年前 评论

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

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

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

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年前

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

1年前 评论

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

1年前 评论

会被封

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

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

1年前 评论

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