Contents
  1. 1. 项目中使用到的RabbitMQ的总结:
  2. 2. RabbitMQ结构图
  3. 3. 几个概念说明
  4. 4. RabbitMQ 简介
  5. 5. spring集成rabbitMQ
  6. 6. MQTT是什么?
  7. 7. MQTT的特点:
  8. 8. 心跳时间: keep alive timer
  9. 9. 如何将消息正确送达?
  10. 10. RabbitMQ如何作为MQTT服务器使用?
  11. 11. 消息队列MQ和RPC远程调用的区别:

项目中使用到的RabbitMQ的总结:

rabbitMQ 本身基于erlang语言开发,erlang语言具有高并发的特性,其管理界面用起来也十分方便。单机吞吐量为万级,一般多用于中小型企业的消息中间件。

RabbitMQ结构图

这里写图片描述

几个概念说明

Broker: 消息交换机 指定消息按什么规则,路由到哪个队列

Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列。

Queue: 消息队列载体,每个消息都会被投入到一个或多个队列

Binding:绑定,它的作用就是将exchange 和queue进行绑定起来

Routing Key: 路由关键字,exchange根据这个关键字进行消息传递

vhost:虚拟主机,一个broker里可以开设多个vhost,用作不同用户的权限分离

producer:消息的投递者

consumer:消息的接收者

channel:消息通道,在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务。

消息队列的使用过程大概如下:

1.客户端连接消息队列服务器,打开一个channel。

2.客户端声明一个exchange, 并设置相关属性。

3.客户端声明一个queue,并设置相关属性。

4.客户端设置好route key,在exchange和queue之间建立好绑定关系。

5.客户端投递消息到exchange.

RabbitMQ 简介

RabbitMQ是一个消息代理:接受并转发消息,可以看成是一个邮局;

生产者(Producer):用于发送消息的程序

消费者(Consumer):等待接受消息的程序

队列:队列只能存在内存或磁盘里,本质上是一个消息转化中心。

RabbitMQ起源于金融系统,用于在分布式系统中存储转发消息,在易用性,扩展性,高可用性等方面表现不俗。

需要安装erlang语言开发,erlang语言本身就具有高并发特性。

spring集成rabbitMQ

step1: 添加相应的jar包:spring-rabbit amqp-client

step2:使用外部参数文件 application.properties

mq.host=127.0.0.1

mq.username=queue

mq.password=1234

mq.port=8001

step3:连接rabbitMQ服务器

1
2
3
4
5
<!-- 连接配置 -->
<rabbit:connection-factory id="connectionFactory" host="${mq.host}" username="${mq.username}"
password="${mq.password}" port="${mq.port}" />

<rabbit:admin connection-factory="connectionFactory"/>

step4:声明一个rabbitMQ Template

1
<rabbit:template id="amqpTemplate" exchange="${mq.queue}_exchange" connection-factory="connectionFactory"  />

step5:在application.xml中声明一个交换机

rabbit:topic-exchange 标签的 name 属性就是在 RabbitMQ 服务器配置交换机的 name 值。

rabbit:binding 标签的 queue 属性是 6. 标签的 id 属性。

rabbit:binding 标签的 pattern 属性是在 RabbitMQ 服务器配置交换机与队列绑定时的 Routing key 值(路由)。

1
2
3
4
5
<rabbit:topic-exchange name="${mq.queue}_exchange" durable="true" auto-delete="false">
<rabbit:bindings>
<rabbit:binding queue="test_queue" pattern="${mq.queue}_patt"/>
</rabbit:bindings>
</rabbit:topic-exchange>
  • durable:是否持久化
  • exclusive:仅创建者可以使用的私有队列,断开后自动删除
  • auto-delete:当所有消费端连接断开后,是否自动删除队列
交换机的四种模式:

1.direct(直连交换机):根据routekey 将消息投递给对应队列的; 转发消息到route key 指定的队列上

2.topic(主题交换机):对key进行模式匹配,比如ab 可以传到所有的ab的queue

3.headers:(头交换机):转发到headers中的键值对完全匹配的队列。性能比较差不建议使用。

4.fanout:(扇形交换机):转发消息到所有绑定队列,忽略routingkey

交换价的属性:

1.持久性:durable,如果启用,交换器将会在server重启前都有效。

2.自动删除:如果启用,那么交换器将会在其绑定的队列都被删除掉之后自动删除掉自身。

3.惰性:如果没有声明交换器,那么在执行到使用的时候会导致异常,并不会主动声明。

一个交换机可以绑定多个队列,一个队列也可以绑定到多个交换机上。如果没有队列绑定到交换机上,则发送到该交换机上的消息会丢失。

MQTT是什么?

第一次接触到mqtt协议是在做海底捞物流配送系统,当时使用到了rabbitmq 消息队列,发现开发同事配置中用到了mqtt协议,本来以为是用到了别的什么中间件,后来在看rabbitmq时无意间发现和mqtt有关联,就自己学习了下,内容如下:

什么是mqtt:message queuing telemetry transport portocol 的全称是消息队列遥感传输协议的缩写,是一种基于轻量级代理的发布/订阅模式的消息传输协议,运行在TCP协议栈上,为其提供有序,可靠,双向连接的网络连接保证。IBM开发的即时通讯协议,成为物联网的重要组成成分。该协议支持所有的平台,几乎可以把所有物联网物品和外部连接起来,被用来当作传感器和制动器的通信协议。

MQTT的特点:

mqtt协议是为大量计算能力有限,且工作在低带宽,不可靠的网络的远程传感器和控制设备通讯而设计的协议,它具有以下主要的几项特性:

1.使用发布/订阅模式,提供一对多的消息发布,解除应用程序耦合。

2.对负载内容屏蔽的消息传输。

3.使用TCP/IP提供网络连接。

4.有三种消息发布服务质量:

至多一次

至少一次

只有一次

5.小型传输,开销很小 协议交换最小化,以降低网络流量。

心跳时间: keep alive timer

以秒为单位,定义服务器端从客户端接受消息的最大时间间隔。一般应用服务会在业务层次检测客户端网络是否连接,不是TCP/IP协议层面的心跳机制。

如何将消息正确送达?

MQTT通过“主题”实现将消息从发布者客户端送达至接收者客户端。“主题”是附加在应用消息上的一个标签,发布者客户端将”主题“和消息发送至代理服务器,代理服务器将消息转发每一个订阅了该主题的订阅客户端。

RabbitMQ如何作为MQTT服务器使用?

rabbitmq中有实现mqtt插件,具体参考地址:

http://www.rabbitmq.com/mqtt.html

安装插件,只要启用rabbitmq的MQTT插件即可:rabbitmq-plugins enable rabbitmq-mqtt 启用后重启一下rabbitmq-server

消息队列MQ和RPC远程调用的区别:

什么是RPC?

RPC(Remote Procedure Call)远程过程调用,主要解决远程通信间的问题,不需要了解底层网络的通信机制。如:dubbo

RPC的一般需要经历4个步骤:

1、建立通信

首先要解决通讯的问题:即A机器想要调用B机器,首先得建立起通信连接,主要是通过在客户端和服务器之间建立TCP连接。

2、服务寻址

要解决寻址的问题,A服务器上如何连接到B服务器(如主机或IP地址)以及特定的端口,方法的名称是什么。

3、网络传输

1)序列化

当A服务器上的应用发起一个RPC调用时,调用方法和参数数据都需要先进行序列化。

2)反序列化

当B服务器接收到A服务器的请求之后,又需要对接收到的参数等信息进行反序列化操作。

4、服务调用

B服务器进行本地调用(通过代理Proxy)之后得到了返回值,此时还需要再把返回值发送回A服务器,同样也需要经过序列化操作,然后再经过网络传输将二进制数据发送回A服务器。

通常,一次完整的PRC调用需要经历如上4个步骤。

MQ(消息队列)

消息队列(MQ)是一种能实现生产者到消费者单向通信的通信模型,一般来说是指实现这个模型的中间件。

典型的MQ中间件:

RabbitMQ、ActiveMQ、Kafka等

典型的特点:

1、解耦

2、可靠投递

3、广播

4、最终一致性

5、流量削峰

6、消息投递保证

7、异步通信(支持同步)

8、提高系统吞吐、健壮性

典型的使用场景:秒杀业务中利用MQ来实现流量削峰,以及应用解耦使用。

RPC和MQ的区别和关联

1.在架构上,RPC和MQ的差异点是,Message有一个中间结点Message Queue,可以把消息存储。

img

2.同步调用:对于要立即等待返回处理结果的场景,RPC是首选。

3.MQ 的使用,一方面是基于性能的考虑,比如服务端不能快速的响应客户端(或客户端也不要求实时响应),需要在队列里缓存。

另外一方面,它更侧重数据的传输,因此方式更加多样化,除了点对点外,还有订阅发布等功能。

4.而且随着业务增长,有的处理端处理量会成为瓶颈,会进行同步调用改造为异步调用,这个时候可以考虑使用MQ。

RPC关注业务逻辑处理结果

Contents
  1. 1. 项目中使用到的RabbitMQ的总结:
  2. 2. RabbitMQ结构图
  3. 3. 几个概念说明
  4. 4. RabbitMQ 简介
  5. 5. spring集成rabbitMQ
  6. 6. MQTT是什么?
  7. 7. MQTT的特点:
  8. 8. 心跳时间: keep alive timer
  9. 9. 如何将消息正确送达?
  10. 10. RabbitMQ如何作为MQTT服务器使用?
  11. 11. 消息队列MQ和RPC远程调用的区别: