消息队列在分布式系统中的应用

Posted 云物互联

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了消息队列在分布式系统中的应用相关的知识,希望对你有一定的参考价值。

消息队列


消息队列(Message Queue,MQ)是大型分布式系统中不可或缺的重要组成部分,能够有效解决 应用解耦,异步处理,流量削峰,消息通讯 等问题,同时作为实现分布式系统高并发,高性能,高可用,可伸缩和最终一致性的支撑。目前在生产环境中使用较多的消息队列有 ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ 等。



消息队列一般会以中间件的形式存在于分布式系统中,常被称为消息队列中间件。分布式系统中消息传递的对象可以被抽象为生产者和消费者两种类型,发送消息的即为生产者,接收消息的即为消费者。消息队列就是两者间通讯的媒介,具有 FIFO(First In First Out) 的特征。消息队列有效的将生产者和消费者分离,达到解耦不同功能模块的效果。需要注意的是,“解耦”只是在应用程序引入了消息队列之后所表现出来的直观效果,但这并非消息队列存在的核心意义,这一点常为人所误解。消息队列设计的初衷还是为了解决应用程序间通讯问题


我们知道不同应用程序之间的通讯,通常会选择 HTTP 或者 TCP 协议。但不尽人意的是,从通讯的角度来看,两种协议都过于底层,无法为上层应用程序提供更具体、更贴近通讯需求的支持。比如说,HTTP 想要实现两端双工通讯,就要求两端都提供 WebServer;再比如,应用 TCP 通讯一般会要求自己开发 Socket 连接,连带的还需要完成粘包、心跳机制、定义私有协议等附加工作。可见,在使用 HTTP 或 TCP 作为通讯支撑时,难免需要开发者重复大量的工作来保证通讯的稳定。


秉承 DRY(Don't repeat yourself) 原则,消息队列希望通过屏蔽底层通讯协议来回避上述问题,在 HTTP、TCP 之上定义出一套基于应用层的统一通讯模型——「生产者/消费者通讯模型」。值得注意的是,这里提到的 生产者/消费者通讯模型 是有别于 生产者/消费者设计模式 的,前者是解决方案的抽象描述,后者是解决方案具体的实现方式。之所以这么说,是为了强调消息队列所定义的仅是一个通讯模型,也可以简单的理解为一套标准。至于如何定义和实现生产者/消费者的功能逻辑依旧是开发者的工作。


消息队列除了能够有效解决分布式系统中不同组件之间的通讯问题,同时也带来了诸如异步架构,可伸缩架构,高并发性能等好处。可以说这一切好处都基于消息队列所提供的解耦能力我们知道高质量的代码逻辑需要遵守高内聚、松耦合原则,这样能够有效保证程序代码具有良好的可读、可维护和可扩展性。分布式系统将这一理念从代码级别拔高到了系统级别,系统中的组件都是松耦合的。每个组件既是生产者又是消费者,彼此间并不会直接通信,而是通过消息队列作为通信的中转站。这样的架构就有了非常高的灵活性,打破了生产者和消费者的强关联性,让多对多的对应关系成为了可能。同时 MQ 也相当于缓冲区,平衡了生产者和消费者的处理能力,整体提高了系统处理数据的速度。当然了,MQ 只是解耦的方案之一,解耦也只是 MQ 的应用场景之一。


消息队列的种类


MQ 一般被分为两大类,通过是否具有 Broker 来区分。

1. 有 Broker:此类型的消息队列具有专门的 Broker 中间件,所有消息都经由 Broker 代理中转,具有非常强的灵活性,典型代表有 RabbitMQ。



2. 无 Broker:这一类 MQ 不需要专门的 Broker,通讯节点既是生产者,又是消费者,典型代表为 ZeroMQ。ZeroMQ 被设计成了一个通讯库而非中间件,它封装了 Socket API 用于完成数据的发送和读取,所以 ZeroMQ 看起来就像是一种高级的 Socket。相比于有 Broker 类型,该类型更专注于解决应用间的通讯问题,所以也更加的轻量级。



以上是关于消息队列在分布式系统中的应用的主要内容,如果未能解决你的问题,请参考以下文章

分布式系统架构设计系列文章

分布式系统架构设计系列文章

kafka 入门

系统架构分布式消息队列

.NET分布式系统:RabbitMQ消息队列应用

大型网站架构之分布式消息队列