消息队列入门理解
消息队列(Message Queue)允许应用程序通过相互之间发送消息来通信。消息队列在目标队列繁忙的时候,提供一个临时的消息存储。
下面我将从以下几个方面来介绍消息队列。
1、什么是消息队列?
2、使用消息队列可以带来什么好处?
3、消息队列的基本分类
一、什么是消息队列?
队列是一个线性的先进先出的等待处理的事物的集合。消息队列是在两个应用之间发送的消息的队列。它包含一系列等待被处理的工作对象。
消息是指在发送者和接受者之间传递的数,它本质上是有着特定格式的字节数组。消息可能是告诉一个系统开始处理或者完成处理某个任务的信息,或者一个平常的信息。
最基本的消息队列的架构是非常简单的:有一个生产者客户端,它负责创建消息并且把消息传递给队列;还有一个被称为消费者的应用程序,它连接到队列并且获取消息进行处理。队列中的消息在消费者获取之前会一直在队列中存储的。
二、使用消息队列的好处
1、异步处理
消息队列提供了一个异步的通信协议,生产者需要处理程序马上返回处理结果。电子邮件或许是最好异步消息最好的例子:当一封电子邮件被发送出去以后,发送者可以继续做其他的事情,而不需要立即等到接收者的响应。因此,这种方式解耦了生产者和消费者之间的关联,生产者和消费者不是必须要同时和消息队列进行交互。
2、解耦合(DECOUPLING)
解耦用于描述一个系统对另一个系统的的依赖性,并且解耦是把两个系统独立开来,从而使他们的功能更加高内聚。
一个解耦的系统可以做到两个或者更多的系统之间无需要建立连接就可以通信,因此系统之间可以保持完全自主和对其他系统的透明性。解耦合通常也是一个计算机系统的良好架构的标识,这样的系统更加容易维护、扩展和调试。
当消费程序出现问题的时候,生产者依然可以把消息放入队列中,因此生产者并不受影响,待消费者恢复正常以后继续处理就可以。
3、架构清晰简单
使用了消息队列的架构设计,使生产者和消费者之间的职责和关系更加清晰,减少了逻辑处理的复杂性;另外对于提高并发性和线程安全的架构设计要简单了很多,不需要更多的锁机制。
4、可扩展(SCALABILITY)
可扩展性是对于上游和下游更加简单了,随着业务的发展,消息的量级肯定也在逐渐的增加。若不适用消息队列,当数据量少的时候是很容易处理的,但是当达到一定的数量级,大数据量对架构的要求会很高的。可以通过消息队列的形式解决一部分问题,这种生产者消费者模式如果想要做扩展,核心的模块则是在消息队列上,生产者和消费者端的架构扩展是很容易的。因此,各大互联网公司都再自己的消息队列上下了很大精力。
三、消息队列的基本分类
消息队列无论是简单的还是复杂的,是单机的还是分布式的,从生产者和消费者之间的关系来说,我把其分为两种:
1、点对点消息队列
生产者和消费者之间是一对一的关系,这些消息的生产是专门为了一个消费者服务的。
比如我现在的系统有从Gateway系统接收实时的用户在京东浏览商详页的信息,因此我们通过Redis Queue实现了消息队列。当gateway写入数据以后,我这边消费完成,数据就会被从队列中移除不会再继续保存。
其模型如下:
2、发布/订阅模式(Pub/Sub)
这种模式的使用场景一般为生产者提供的是基础业务的数据,对于上层业务会有不止一个消费者。因此,发布/订阅 模式保证了各个consumer对于消息的使用是相互独立,互不影响的。比如Kafka就是一个典型的Pub/Sub模式的消息队列。
其模型为:
参考文档:What is message queueing?