队列系统 含义:
队列系统 是一个概念,虽然现在市面上又不少队列系统,但是这些队列系统都是基于这个概念设计出来的软件, 使用 文件 ,使用 mysql, redis 都能够实现一套队列系统。
那么在这里 文件 mysql redis 在这里系统里面充当的角色是什么?是不是存储介质啊?
队列系统最主要的目的不是为了存储数据,而是为了异步来处理一些数据。
那么也就是说我们存到队列系统的数据是个半成品 ,那么按道理来说就需要有另外一个东西来处理存放在队列的数据。
那么对于我们开发者而言 有哪些方式来处理我存放在队列的数据呢?
1、死循环方式读取
2、定时任务
3、守护进程
php 的运行模式 :
1、通过 web 请求到 apache/nginx然后到 php 这种单进程的运行模式
2、命令行窗口 使用 php xxx.php的方式来运行 php
显然处理存放在队列的数据肯定是用第二种模式 这种模式一般称之为 cli 模式
例如->发送短信验证码:
用户点击按钮 ,php将发短信的任务以数据的形式存到队列系统里 返回给用户短信发生成功 ,与此同时另外通过 cli 模式启动的死循环的php 脚本运行在服务器,不停的去队列系统里看有没有任务有没有任务,如果这个进程发现队列系统里投递任务了 ,就从队列系统里把任务拿出来,根据数据的参数不同去执行不同的任务。
目的:
使用队列系统的目的就在于快速的去处理一个复杂的任务,而且这个任务的处理过程用户不参与。
这样就说明,我们的队列系统需要一个很显著的特质就是快!
虽然 mysql 和文件也是可以实现,但是使用 mysql 的情况下是不是反而增加的 mysql 的负担?所以大家很容易就想到 redis,那么用 redis 实现一个队列系统 确实是我们在开发过程中常用的一个方式redis有个数据存储的方式叫做 list 这种数据结构天生的就是实现了。
市面上主流的队列系统:
1.RabbitMQ
这个是现在市面非常主流的消息队列系统 跨平台 最大的优点就是健壮,稳定,可靠性高
一般用于比较大型的项目 不过这个消息队列中间件 有几个问题:
a、运行速度较慢
b、学习成本比较高
c、对于部署是一个很大的考验如果各位在开发过程中对数据的可靠性要求比较高,而且业务量很大,可以考虑用RabbitMQ,而且是支持集群的 就是可以分布式部署的
2.ActiveMQ
也是比较流行的队列系统 这个最大的好处就是支持事务
其它的我觉得都比不上RabbitMQ 不推荐各位使用,而且他的速度比RabbitMQ更慢 不过多介绍了
3.RocketMQ
RocketMQ是阿里开源的队列系统 有 RabbitMQ 和ActiveMQ所有优点
速度也是超级快的 而且可靠稳定支持事务支持负载均衡
但是他有个致命的缺点 目前没有开发出可靠的 php的sdk
也有一个国内开源项目的巨大的缺点 就是拉完不管
国内的开源项目很多都是 KPI 项目 所以即使他又这么多有点 我还是墙裂不推荐
4.Kafka
Kafka实力非常强 阿里的RocketMQ 就是参考了 Kafka
同样拥有我刚刚说的这些队列系统的所有优点
不过有两点可惜
一个就是稳定性不如RabbitMQ 还有就是对 php 的支持不是特别友好 当然只是不是特别友好而已 还是可以用的
重量级的mq:
刚刚我说的就是重量级的消息队列中间件 一般用于比较重型的分布式项目中 大概的可以总结为金融等对事务性要求很高的,可以考虑RabbitMQ和RocketMQ,对性能要求高的可考虑Kafka,以上为
轻量级的 MQ:
redis 就是一个 Laravel4框架里也集成了,比较有名的还有AlphaQ httpsqs zeromq 和 beanstalkdAlphaQ httpsqs zeromq Laravel4框架集成的我都没有用过。
提一下里面的zeromq 这个号称是史上最快的消息队列,这个确实速度很快上手也非常简单,不过他有一个致命的缺点,就是存在里面的数据不能持久化 ,也就是一旦机器宕机 ,里面的数据就没有了,不建议小白用, 但是你想体验极致的快, 可以试试用他。
在轻量级的消息队列里 redis 和 beanstalkd是我墙裂推荐的,特别是beanstalkd、redis 的消息队适合比较简单的场景,因为他没有 优先级 延迟 和 任务超时重发的处理办法,所以大家在做非常简单的秒杀场景的时候 可以用 redis。
beanstalkd:
beanstalkd是一个高性能、轻量级的分布式内存队列系统
速度快而且是支持持久化存储的, 也就是说 ,一旦机器宕机 里面的数据是还有保留的。
beanstalkd的速度是要高于 redis 的而且数据的可靠性也是要高于 redis 的beanstalkd的队列是有优先级的 ,也就是是说, 存放到队列里的数据, 不仅是有序的 ,而且是可以插队的目前 facebook 和淘宝团队都在使用。
Beanstalkd对 php 的支持也是非常友好的。
案例:
1.可以用来处理延时任务 举个例子 大家在应用场景中会出现,xxx 时间不操作就需要把订单关闭的场景,比如为了不打扰用户,晚上11点以后的消息系统延迟到第二天10点以后发送
在这些场景中都是可以使用队列系统来完成的 而Beanstalk是支持延时任务的 不需要额外的开发
2.就是循环任务 比如每天需要给达到某个要求的用户增加积分
类似这样的循环任务也是可以由队列系统来完成
3.就是兜底任务 这个场景就更多了
比如我请求短信发生失败以后继续尝试,我刚刚说了Beanstalk是支持超时控制的 那么他支持超时控制就支持异常控制,一个请求有失败的概率,可以用Beanstalk不断重试
再比如各位在开发过程中 特别是支付场景中 都是有回调的 如果说各位的系统出现网络问题或者是其它异常情况 回调收不到咋办?也可以用队列系统来进行兜底
4.定时任务 这个不多说和延时任务一样 既然可以延时 那么就可以定时
5.就是一般的异步任务举例子
比如需要和第三方进行通讯的 短信发送 等等
比如内部系统的调用啊
比如你是一个接口服务需要给其他人发回调
比如秒杀活动,一般会因为流量过大,导致流量暴增,应用挂掉,可以先将任务放到队列一个个来处理
比如日志的收集等等等 很多场景都可以用到