需要做一个多用户群发模板消息的功能。多个用户同时给自己上千个会员发送模板消息。

花儿

问题描述

需要做一个多用户群发模板消息的功能。多个用户同时给自己上千个会员发送模板消息。
还有定时发送任务。但是这里有个问题。在发送任务稍微多点比如几百上千的时候。发送的数据会有延迟1-2个小时甚至更久才能发送出去。请教下是哪儿出了问题?

以下是代码。
// 开启的端口
$worker = new Worker();
// 启动多少服务进程
$worker->count = 100;
// worker名称,php start.php status 时展示使用
//$worker->name = 'redis';

$worker->onWorkerStart = function () {
$redis = new Rediss;
$redis->pconnect('127.0.0.1', 6379);
$Weixin = new Weixin();
$queue = array("sendmsg","tuikuanmsg","renewsendmsg");
//$queue = "sendmsg";

 while($redis){
     $time = time();
     $ret = $redis->blPop($queue, 60);
     if($ret && count($ret) == 2 && $ret[1]) {

         $info = json_decode($ret[1],true);
         $wxfdid=$info["wxfdid"];
         $appid=$info["appid"];
         $secret=$info["secret"];
         $token = checkAccessTokenFD($redis,$wxfdid,$appid,$secret);
         if(!$token) {
             echo "token miss";
             continue;
         }

         if($ret[0] == "sendmsg"){
             if($info["sendtype"] == 1 || $info["sendtype"] == 3 || ($info["sendtype"] == 2  && ($info["sendtime"]-$time) <= 3)){
                 $Weixin->sendMsg($info, $token);
                 if($info["sendtype"] == 3){
                     $info["sendtype"] = 2;
                     $info["materialstitle"] = "【再次通知】".$info["materialstitle"];
                     $info["title"] = "【再次通知】".$info["title"];
                     $info["mbtitle"] = "【再次通知】".$info["mbtitle"];
                     $redis->lPush("sendmsg", json_encode($info));
                 }
             }elseif($info["sendtype"] == 2  && ($info["sendtime"]-$time) > 3){
                 $redis->lPush("sendmsg", $ret[1]);
             }
         }elseif($ret[0] == "tuikuanmsg"){
            $Weixin->tuikuanMsg($info, $token);
         }elseif($ret[0] == "renewsendmsg"){
             $Weixin->renewSendMsg($info, $token);
         }
     }
 }

};

Worker::runAll();

这是代码

服务器的带宽 10M,内存 8G,CPU 8核
有谁能帮助解决下问题。有偿

753 2 0
2个回答

doit

可以针对每个进程的任务记录日志看下,这种耗时任务可以多开进程处理

  • 花儿 2022-12-28

    我上面写了100个进程呢,但是发送300-500个数据都要延迟1个小时左右。不知道什么情况

又有心跳

不太明白你的redis是什么意思,但感觉问题就出在 $ret = $redis->blPop($queue, 60);阻塞了

  • 花儿 2022-12-28

    REDIS里面记录了数据,这儿是把所有REDIS的数据取出来,然后发送模板消息。 $ret = $redis->blPop($queue, 60);这儿应该怎么处理呢?

  • Gin 2022-12-28

    异步队列后台去执行, blpop 阻塞肯定延迟

  • 花儿 2022-12-28

    我的写了WHILE循环呢。也阻塞?

年代过于久远,无法发表回答
🔝