rabbitMQ知识概括
MQ简介
基于多线程队列简单实现mq:
public class MayiktThreadMQ {
/**
* Broker
*/
private static LinkedBlockingDeque<JSONObject> broker = new
LinkedBlockingDeque<JSONObject>();
public static void main(String[] args) {
// 创建生产者线程
Thread producer = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
Thread.sleep(1000);
JSONObject data = new JSONObject();
data.put("phone", "18611111111");
broker.offer(data);
} catch (Exception e) {
}
}
}
}, "生产者");
producer.start();
Thread consumer = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
JSONObject data = broker.poll();
if (data != null) {
System.out.println(Thread.currentThread().getName()
+ ",获取到数据:" + data.toJSONString());
}
} catch (Exception e) {
}
}
}
}, "消费者");
consumer.start();
}
}
基于netty实现mq:
- 消费者netty客户端与nettyServer端MQ服务器端保持长连接,MQ服务器端保存消费者连接。
- 生产者netty客户端发送请求给nettyServer端MQ服务器端,MQ服务器端在将该 消息内容发送给消费者。
- 生产者投递消息给MQ服务器端,MQ服务器端需要缓存该消息。
- 消息格式:
body:{"msg":{"userId":"123456","age":"23"},"type":"producer",”topic”:””}
- 如果mq服务器端宕机之后,消息如何保证不丢失?
①持久化机制。
- 如果mq接收到生产者投递消息,如果消费者不在的情况下,该消息是否会丢失?
①不会丢失,消息确认机制 必须要消费者消费该消息成功之后,在通知给mq服务器端 删除该消息。
- Mq服务器端将该消息推送消费者:
①消费者已经和mq服务器保持长连接,服务器自动推送
。
②消费者第一次刚启动的时候,消费者主动拉取消息
。 - Mq如何实现抗高并发思想?
①Mq消费者根据自身能力情况 ,拉取mq服务器端消息消费。
②默认的情况下是取出一条消息。
③缺点:存在延迟的问题
- 如何消费者提高速率:
①消费者实现集群。
②消费者批量获取消息即可。
- 总结:
①rabbitMQ的总体架构思想就是使用Netty的NIO模型通信。
②生产者和消费者操作时首先要向消息中间件进行连接操作。
③也就是说生产者和消费者相对于消息中间件都是Client,而消息中间件是Server。
RabbitMQ简介
RabbitMQ介绍:
- RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件),
- RabbitMQ服务器是用Erlang语言编写的。
- 链接:
①RabitMQ官方网站
②RabbitMQ概念详解
RabbitMQ基础概念:
- 通常我们谈到消息队列服务, 会有三个概念: 发消息者、消息队列、收消息者。RabbitMQ 在这个基本概念之上, 多做了一层抽象,在发消息者和队列之间, 加入了交换器(Exchange)。这样发消息者和消息队列就没有直接联系,转而变成发消息者把消息发给交换器,交换器根据调度策略再把消息转发给消息队列。
- 消息生产者并没有直接将消息发送给消息队列,而是通过建立与Exchange的Channel,将消息发送给Exchange。Exchange根据路由规则,将消息转发给指定的消息队列。消息队列储存消息,等待消费者取出消息。消费者通过建立与消息队列相连的Channel,从消息队列中获取消息。
- 概念名词:
①Channel(信道):
多路复用连接中的一条独立的双向数据流通道。信道是建立在真实的TCP连接内的虚拟连接,复用TCP连接的通道。每个channel表示一个会话任务。
②Producer(消息的生产者):
向消息队列发布消息的客户端应用程序。
③Consumer(消息的消费者):
从消息队列取得消息的客户端应用程序。
④Message(消息):
消息由消息头和消息体组成。消息体是不透明的,而消息头则由一系列的可选属性组成,这些属性包括routing-key(路由键)、priority(消息优先权)、delivery-mode(是否持久性存储)等。
⑤Routing Key(路由键):
消息头的一个属性,用于标记消息的路由规则,决定了交换机的转发路径。最大长度255 字节。
⑥Queue(消息队列):
存储消息的一种数据结构,用来保存消息,直到消息发送给消费者。它是消息的容器,也是消息的终点。一个消息可投入一个或多个队列。消息一直在队列里面,等待消费者连接到这个队列将消息取走。需要注意,当多个消费者订阅同一个Queue,这时Queue中的消息会被平均分摊给多个消费者进行处理,而不是每个消费者都收到所有的消息并处理,每一条消息只能被一个订阅者接收。
⑦Exchange(交换器|路由器):
提供Producer到Queue之间的匹配,接收生产者发送的消息并将这些消息按照路由规则转发到消息队列。交换器用于转发消息,它不会存储消息 ,如果没有 Queue绑定到 Exchange 的话,它会直接丢弃掉 Producer 发送过来的消息。交换器有四种消息调度策略(下面会介绍),分别是fanout, direct, topic, headers。
⑧Binding(绑定):
用于建立Exchange和Queue之间的关联。一个绑定就是基于Binding Key将Exchange和Queue连接起来的路由规则,所以可以将交换器理解成一个由Binding构成的路由表。
Binding Key(绑定键):Exchange与Queue的绑定关系,用于匹配Routing Key。最大长度255 字节。
⑨Broker:
RabbitMQ Server,服务器实体。
- 关系:
①Producer与Exchange之间为一对多关系
②Exchange与Queue之间为多对多关系
③Queue与Consumer之间为多对多关系
RabbitMQ环境的基本安装:
- 下载并安装erlang:
①链接:erlang下载地址
②配置erlang环境变量信息:
<1>新增环境变量ERLANG_HOME=erlang的安装地址。
<2>将%ERLANG_HOME%\bin加入到path中。
③cmd下用erl -version检测是否配置成功。 - 下载并安装RabbitMQ
①链接:RabbitMQ下载地址
②配置环境变量:
<1>新增环境变量RABBIT_HOME=rabbitmq的安装地址。
<2>将%RABBIT_HOME%\sbin加入到path中。
③cmd下进入RabbitMQ Server目录下的sbin目录,用rabbitmqctl status检测RabbitMQ是否配置成功
④打开sbin目录,双击rabbitmq-server.bat即可启动rabbitmq。
⑤如果rabbitmq启动成功无法访问管理平台页面:
<1>进入到F:\path\rabbitmq\rabbitmq\rabbitmq_server-3.6.9\sbin>
<2>执行rabbitmq-plugins enable rabbitmq_management - Rabbitmq管理平台中心:
①地址 :http://127.0.0.1:15672
②默认账号:guest/guest ,用户可以自己创建新的账号。 - 注意:
RabbitMQ 它依赖于Erlang,需要先安装Erlang。不同JDK版本对应的Erlang和RabbitMQ Server的版本也会有所不同。
RabbitMQ常见名词:
Virtual Hosts:
像mysql有数据库的概念并且可以指定用户对库和表等操作的权限。RabbitMQ也有类似的权限管理。在RabbitMQ中可以虚拟消息服务器VirtualHost,每个VirtualHost相当于一个相对独立的RabbitMQ服务器,每个VirtualHost之间是相互隔离的,exchange、queue、message不能互通。
- 默认的端口15672:rabbitmq管理平台端口号
- 默认的端口5672: rabbitmq消息中间内部通讯的端口
- 默认的端口号25672: rabbitmq集群的端口号
RabbitMQ信道channel概念:
- 信道解释:
①信道是生产消费者与rabbit通信的渠道,生产者publish或者消费者消费一个队列