队列和栈一样,都很适合处理临时数据。
对列结构
和栈一样,队列也是有3条限制(与栈的限制不同)的数组:
- 数据只能插入队列 末尾(与栈一样);
- 只能从队列 前端 删除数据(与栈相反);
- 只能读取队列 前端 的数据(与栈相反)。
队列中间件
队列常用来做消息中间件,消息中间件是指在分布式系统中完成消息的发送和接收的基础软件。消息中间件也可以称消息队列(Message Queue / MQ)。
队列数据结构的特点:
跟排队一样:先进先出。
队列的应用场景:
互联网场景中经常使用消息中间件进行 消息路由、订阅发布、异步处理等操作,来缓解系统的压力。
一般在业务中,常常把队列作为一种中间件服务,比如当要处理大量消息的时候,往往是把这些消息放入一个队列存储,这时并不需要立即对它进行处理得到结果。
最后是由订阅者(或消费者)去队列结构里取出,按顺序处理。
消息队列能解决什么
- 解耦
- 有序性
- 消息路由
- 异步处理
- 削峰
消息处理的触发机制
-
死循环方式读取
易实现,但有故障时无法及时处理和恢复。 -
定时任务
压力均分,有处理量上限,比如在上个定时任务没处理完的情况。 -
守护进程
类似PHP-FPM 和 PHP-CG机制。 -
回调
函数回调。
异步消息队列的概念
异步消息队列(Asynchronous Message Queue)是一种用于在分布式系统中实现异步通信的机制。它允许不同的应用程序或系统组件通过消息传递进行交互,而无需立即响应或等待对方的处理结果。这种机制有助于解耦系统组件,提高系统的扩展性和容错能力。
常见的异步消息队列框架
- RabbitMQ:
基于 AMQP 协议的消息队列,功能强大,支持复杂的路由和消息传递模式。 - Apache Kafka:
面向高吞吐量和实时数据流处理的分布式流平台,广泛用于日志收集和实时分析。 - Beanstalkd
Beanstalk 是一个简单、快速的工作队列。最初设计用于通过异步运行耗时任务来减少大容量 Web 应用程序中的页面浏览延迟。 - Redis:
是一个内存数据库,但也可以用作简单的消息队列,支持发布/订阅和列表操作。