MQ系列------RabbitMQ入门(一)

一.什么是MQ

MQ(message queue 消息队列)是一种应用程序对应用程序的通信方法。应用程序通过写和检索出入列队的针对应用程序的数据(消息)来通信,而无需专用连接来链接它们。消息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术。排队指的是应用程序通过队列来通信。队列的使用除去了接收和发送应用程序同时执行的要求。--百度百科

在百度的介绍里面需要了解到MQ是作为一种通信方法存在,且消息中的通信的是由程序之间的消息的发送来进行通信的,而通信不是依赖直接调用接口来通信。

二.为什么引入MQ

根据MQ的特性,这里其实主要有三个原因:

  • 解耦
  • 异步
  • 削峰

1.解耦:

如上图原本服务A只调用服务B,现在因为业务关系,服务A也需要调用服务C的接口,但如果像以前那样使用RPC调用的话,则服务A的代码则,需要修改。若改为MQ,则服务B,服务C皆为消息生产者,则服务A作为消息接收者,只管接收即可,不需要修改服务A的代码。

2.异步

继续如上图,若服务A调用服务B的接口,但是此接口比较耗时,通常RPC的默认等待时间为15s,如果你修改了RPC的默认等待时间,为60s,若后面因业务的进一步扩展,服务B的接口超过了60s,难道要修改前端的等待时间,但这个时候,如果使用MQ,则服务A调用B接口后,接口异步执行,等接口执行完之后,通过MQ写入消息队列,而服务A则只需要检验MQ发来的信息即可,不需要等待接口B接口的完成。

3.削峰

在高并发的时候,许多请求一起发送过来,很多时候直接到操作数据库阶段,因为连接数过多,容易报错。

这个时间,对MQ来说,可以控制上行发送来的请求,MQ逐步向队列拿取数据,实现削峰。而在现实中, 暂时请求的积压是允许的。

三.RabbitMQ的结构

RabbitMQ是一个基于AMQP(Advanced Message Queuing Protocol,高级消息队列协议)来开发的产品。

经过上面的介绍,我们知道了MQ的三大组成,分别是生产者,消费者和队列。然而,实际上,除了这个三大显著的特征,MQ还有其他组成。

  1. broker
  2. virtual host
  3. connection
  4. channel
  5. exchange
  6. Queue
  7. Binding

在这里我先引入一张别人的图片帮助理解

1.Broker:broker就是MQ的服务端(rabbitmq server),是一个用来接收和转发信息的应用。

2.virtual host:基于多租户和安全设计的考虑,不同的用户在使用同一个rabbitmq server的时候,在服务端通过分别创建不同的虚拟空间,并分别在空间创建AMQP基本组件,分隔不同用户之间的操作。

3.connection:publisher/consumer与broker的连接是TCP连接,除了网络出现问题,一般情况是客户端断开连接。

4.channel: 如果每一次访问RabbitMQ都建立一个Connection,在消息量大的时候建立TCP Connection的开销将是巨大的,效率也较低。Channel是在connection内部建立的逻辑连接,如果应用程序支持多线程,通常每个thread创建单独的channel进行通讯,AMQP method包含了channel id帮助客户端和message broker识别channel,所以channel之间是完全隔离的。Channel作为轻量级的Connection极大减少了操作系统建立TCP connection的开销。

5.exchange:exchange其实就是一个路由,他主要的作用就是用来分来生产者产生的消息,producer在传递消息的时候,会传递一个ROUTING_KEY,Exchange会根据这个ROUTING_KEY按照特定的路由算法,将消息路由给指定的queue。Exchange与Queue之间是一个多对多的关系。

Exchange有4种类型:direct(默认),fanout, topic, 和headers

6.Queue:消息队列,生产者产生的消息通过exchange分发后,到达queue,等待消费者消费消息。

7.Binding:binding是exchange和queue之间的虚拟连接,exchange与queue的多对多关系,就是通过binding进行,而binding的信息存储在exchange上。

 

推荐一个网站用于学习rabbitmq,http://tryrabbitmq.com/

//四.架构演进

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章