您的位置:首页 > 编程语言 > PHP开发

PHP消息队列实现及应用:消息队列概念介绍

2017-10-10 16:39 696 查看
在互联网项目开发者经常会遇到『给用户群发短信』、『订单系统有大量的日志需要记录』或者在秒杀业务的时候服务器无法承受瞬间并发的压力。

这种情况下,我们怎么保证系统正常有效的运行呢?

这个时候,我们可以引入一个叫『消息队列』的概念来解决上面的需求。

消息队列的概念、原理和场景

在高并发的时候,程序往往无法做到及时的处理。我们引入一个中间的系统,来进行分流和减压。

所以从本质上讲:消息队列就是一个队列结构的中间件。也就是说,你把消息和内容放入这个容器之后就可以直接返回,不用等它后期处理的结果。另外会有一个程序,读取这些数据并按照顺序处理。

1、队列结构的中间件
2、消息放入后,不必立即处理
3、由订阅者/消费者按顺序处理


也就是说:当遇到一个比较大或者耗时比较长的环节的时候,而同时你的业务又不需要立即知道这个环节的结果,使用消息队列是好的选择。

核心结构如下面:



消息队列 适用场景

一、数据需要冗余的时候

比如订单系统中,后续需要进行数据的转换和记录。消息队列可以把这些数据持久化的存储在队列中,然后由订单后期处理程序进行处理,处理完成之后再把这条记录从队列中删除。

二、系统的解耦

消息队列解决了2套系统之间深度耦合的问题。

使用消息队列后,入队的系统和出队的系统没有直接的关系。

入队系统和出队系统,其中一个崩溃之后不会影响另外一个的正常运行。

三、流量削峰

就是秒杀和抢购的时候,会出现明显的流量剧增,对服务器的压力非常大。

实际项目开发中,配合缓存来使用消息队列,一种很好的方案。

四、异步通信

消息队列本身就实现了程序的异步操作,因此只要适合于异步的场景都可以使用消息队列

五、扩展性

比如订单系统,订单入队之后,后期或许还有财务系统处理,但是如果还要加一个配货系统。

只需要让这个配货系统 订阅这个 消息队列 即可。

六、排序保证

在有些场景下,数据的处理顺序是非常重要的,队列本身就可以做成单线程的单进单出的系统。

从而有效的保证数据按照顺序进行处理。

常见 队列实现 的优缺点

队列介质:

Mysql:可靠性高、易实现、速度慢
Redis:速度快,单条大消息包时效率低
消息系统:专业性强、可靠,学习成本高(比如:RabbtiMQ)


消息处理的触发机制:

死循环方式读取:易实现,故障时无法及时恢复;
定时任务:压力均分,有处理量上限。(最大的缺陷:定位任务时间的间隔和处理的数据需要精准把握,不能上一个任务还没有处理完成,下一个认为就已经启动了)

守护进程:类似于PHP-FPM和PHP-CGI,需要shell知识
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: