您的位置 首页 php

如何通过redis队列实现短信的发送

redis实现短信发送

消息队列是我们搭建系统常用的组件,常用来实现解耦、削峰、异步。常见的场景如秒杀、抢购,由于数据生产和写入速度的不对等,常常会引发性能问题,导致响应延迟,系统负载过高,这是我们就可以引入消息中间件来解决问题。

与传统的不同

消息队列常用的组件有redis rabbitmq kafka rocketmq,消息队列众多,每个mq都增加扩展了自己的功能,同时也增加了复杂度。

队列示意图

本人水平有限,不来评论各家好坏,直接拿redis来用。

为什么用redis做队列,有几个优点

a. 我比较熟悉,使用的比较多。

b. 操作简单,直接用list的几个命令就搞定。

c. 一般系统都有redis做cache了,不需要再增加服务。多一个服务就多一分不稳定,系统架构是越简单越好。

当然缺点也不少,凡事都有两面性,就看个人选择了。

1.环境要求

php

redis扩展

2. 基本流程

首先我们看一下需求:公司做活动,要给10w的用户发送推广短信,假如已经把用户的手机号放入队列。如果1s发送一条,那么总共需要10w秒,大概需要27个小时。

发送流程:每次从队列取出一个手机号,发送短信,如果发送成功,进入下一条继续发送,如果发送失败,则重试,重试3次不能成功则放弃。

流程图

下面是我写的伪代码,加工一下可以使用,一般我们都在框架里开发,每个框架都有自己的组件封装。

 //模拟发送
function sms($phone){
sleep(1);
return true;
}
$queue_name = 'phone_list';
//连接服务器
$client = new Redis();
$client->connect('127.0.0.1', 6379);

//$name = $client->lrange($queue_name, 0 , -1);
//print_r($name);
while(true){
$phone = $client->rpop($queue_name);
if(empty($phone)){
echo 'finish';
break;
}
echo $phone . "\n";
$result = sms($phone);

if($result){
echo "send success";
continue;
}
//记录重试次数
$client->incr("try_time_".$phone);

$times = $client->get("try_time_" . $phone);
if($times > 3){
echo "超出最大重试次数";
continue;
}
//失败重新放入队列
$client->rpush($queue_name, $phone);
}  

扩展,因为数据量比较大,我们可以通过启用多个进程来加快发送速度,如果使用10个进程,时间就可以大大减少了,因为redis是一个单线程、单进程的数据库,所以即使有多个消费进程,消费的时候也是排队的,不会出现读到重复数据的问题。

好了,最后欢迎各位同行留言交流!

文章来源:智云一二三科技

文章标题:如何通过redis队列实现短信的发送

文章地址:https://www.zhihuclub.com/151042.shtml

关于作者: 智云科技

热门文章

网站地图