高性能网站实用技巧之消息队列篇

什么是消息队列

消息队列Message Queue)是一种进程间通讯或同一进程的不一样线程间的通讯方式。进程或者线程之间经过 消息 进行通讯,消息发送后能够当即返回,由消息系统来确保信息的可靠传递,消息发布者(生产者)只管把消息发布到消息队里中而不用管谁来消费,消息使用者(消费者)只管从消息队列中获取消息以进一步处理而不用管理谁发布的消息,这样发布者和使用者都不用知道对方的存在。前端

消息Message)是指在应用之间传送的数据。消息能够很是简单,好比只包含文本字符串,也能够很复杂,如嵌入对象。性能优化

消息队列的特色

经过提供 消息传递消息排队 模型,它能够在 分布式环境 下提供 应用解耦弹性伸缩冗余存储流量削峰异步通讯数据同步 等等功能,其做为 分布式系统架构 中的一个重要组件,有着举足轻重的地位。消息队列主要特色有:服务器

  • 异步性:将耗时的同步操做,经过以发送消息的方式,进行了异步化处理。减小了同步等待的时间。
  • 松耦合:消息队列减小了服务之间的耦合性,不一样的服务能够经过消息队列进行通讯,而不用关心彼此的实现细节,只要定义好消息的格式就行
  • 分布式:经过对消费者的横向扩展,下降了消息队列阻塞的风险,以及单个消费者产生单点故障的可能性。
  • 可靠性:消息队列通常会把接收的消息存储到本地硬盘上(当消息被处理完以后,存储信息根据不一样的消息队列实现,有可能将其删除),这样即便应用挂掉或者消息队列自己挂掉,消息也可以从新加载。

消息队列应用场景

异步处理

同步处理 是指从请求的发起一直到最终的处理完成期间,请求的调用方一直在同步阻塞等待调用的处理完成。架构

异步处理 处理是指在请求发起的处理过程当中,客户端的代码已经返回了,它能够继续进行本身的后续操做,而不须要等待调用处理完成。异步

对一些比较耗时且不须要即时(同步)返回操做结果的操做,能够把处理过程经过消息队列进行异步处理。这样作能够推迟耗时操做的处理,使耗时操做异步化,而没必要阻塞客户端程序,客户端的程序在获得处理结果以前能够继续执行,从而提升客户端程序的处理性能。分布式

异步处理的主要目的是 减小请求响应时间,实现非核心流程异步化,提升系统响应性能。性能

应用解耦

使用消息队列,能够有多个生产者发布消息,多个消费者消费消息,共同完成整个的业务处理逻辑,生产者只关心是否正确将消息写入消息队列,消费者只关心从消息队列中获取消息,而后进行处理逻辑,生产者和消费者之间不须要直接的交互调用,没有代码的依赖耦合。优化

耦合度越低程序代码越容易维护,也容易进行扩展。线程

流量削峰

通常在秒杀活动中普遍使用。设计

在秒杀活动中,通常因为瞬时访问量过大,服务器瞬间接收了大量的请求,流量暴增,这种状况下颇有可能致使相关系统没法处理请求甚至崩溃。为了解决这个问题,通常会在应用的前端加入消息队列。

  • 请求先写入消息队列,而不是由业务系统直接处理,作了一次缓冲,极大的减小了业务处理系统的压力。
  • 队列的长度能够作限制,通常秒杀活动都是有数量限制的,后写入队列的用户没法秒杀到商品,这样的请求能够直接被抛弃,能够直接返回活动已结束或商品已售完。

使用消息队列,即使是访问流量持续的增加,系统依然能够持续的接收请求。虽然生产者生成的消息比消费者消费的速度快,可是经过消息队列进行了缓冲,在短期内,生产者和消费者之间处理能力不会互相影响,一样也能够保证系统的稳定性。

消息通信

消息队列通常都内置了高效的通讯机制,所以能够用于单纯的消息通信,好比实现点对点消息队列或者聊天室。

广播

若是没有消息队列,每当一个新的业务方介入,那都须要联调一次接口。有了消息队列,只须要关系消息是否送达了队列,至于谁但愿订阅,是下游的事情,无疑极大地减小了开发和联调的工做量。

日志处理

将消息队列用在日志处理中,解决了大量日志传输的问题(如Kafka)。

消息队列的传输模式

点对点模式(Point to Point)

点对点模式 用于 消息生产者消息消费者 之间 点到点 的通讯。消息生产者将消息发送到由某个名字标识的特定队列(Queue)。在消息传递给消费者以前它被 存储 在这个队列中。队列消息 能够放在 内存 中也能够 持久化,以保证在消息服务出现故障时仍然可以传递消息。

点对点模式特色:

  • 每一个消息只有一个消费者(Consumer),即一旦消息被消费,消息就再也不在消息队列中。
  • 生产者和消费者之间没有依赖性,生产者发送消息以后,无论有没有消费者在运行,都不会影响到生产者下次发送消息。
  • 消费者在成功接收消息以后需向队列应答成功,以便消息队列删除当前接收的消息。

发布/订阅模式(Publish/Subscribe)

发布者/订阅者 模型支持向一个特定的 消息主题 生产消息。 0 或多个 订阅者 可能对接收来自 特定消息主题 的消息感兴趣。

在这种模型下,发布者和订阅者彼此不知道对方。多个消费者能够得到消息,在 发布者订阅者 之间存在 时间依赖性。发布者须要创建一个 订阅subscription),以便可以消费者订阅。订阅者 必须保持 持续的活动状态接收消息

发布/点阅模式特色:

  • 每一个消息能够有多个订阅者。
  • 发布者和订阅者之间有时间上的依赖性,针对某个主题(Topic)的订阅者,它必须建立一个订阅以后,才能消费发布者的消息。
  • 为了消费消息,订阅者须要提早订阅该角色主题,并保持在线运行。

集中消息中间件对比

目前在生产环境,使用较多的消息队列有ActiveMQRabbitMQZeroMQKafkaMetaMQRocketMQ等。


好文推荐:

相关文章
相关标签/搜索