一、概述:
消息队列(Message queue)是一种应用间通信的方式,消息发布后由消息系统来确保消息的可靠传递,消息发布者只需要关注消息是否已经发布,不用关心使用者是谁,消息使用者只需要从队列中获取消息,不用关心发布者是谁。
为什么使用mq:
消息队列是一种应用间异步协作机制,一般用于业务解耦的情况,场景包括最终一致性,广播,错峰流控等。
rabbitMQ的特点:
由erlang语言开发的基于AMQP协议的实现
AMQP:Advanced Message Queue,高级消息队列协议,是应用层协议的开放标准,面向消息的中间件设计,基于此协议的客户端与消息中间件可传递消息,不受产品和开发语言的限制
最初起源于金融系统,用于在分布式系统中存储和转发消息,在易用性,可扩展和高可用性等方面有较好的表现。
特点:
1、可靠性(Reliability):使用一些机制来保证可靠性,如持久化,传输确认,发布确认。
2、灵活路由(Flexible Routing):在进入消息队列之前,通过Exchange来路由消息,对于典型的路由消息,rabbitMQ提供一些内置的Excnange来实现,针对复杂的路由可以将多个Exchange绑定在一起,亦可以通过插件实现自己的Excnange
3、消息集群(Clustering):多个rabbitMQ服务器集群,形成一个逻辑broker。
4、高可用(Highly Available Queues):队列可在集群服务器上进行镜像,使得在部分节点出现问题的时候队列仍可用。
5、多协议(Multi-protocol):支持多种消息队列协议如STOMP,MQTT
6、多语言客户端(Many Clients):rabbitMQ支持很多开发语言的客户端如java,.net等。
7、管理界面(Management UI):rabbitMQ提供了一个简单易用的管理界面,可以实时的监控和管理mq消息broer的各方面数据。
8、跟踪机制(Tracing):如果消息出现异常,rabbitMQ提供了消息跟踪机制,以方便使用者找出问题。
9、插件机制(Plugin System):rabbitMQ提供许多外部插件,也可以自己编写插件。
二、概念模型
消息模型:所有的mq产品从模型抽象来说都是一个流程。
消费者(consumer)订阅某个队列,生产者(producer)产生消息,发布到消息队列(queue)
中去,最后发到监听的消费者
rabbitMQ基本概念:
内部结构图
1、Message:消息,消息不具名的,由消息头和消息体构成消息体不透明,消息头由部分属性构成,包括routing-key(路由键)、priority(优先级)、delivery-mode(消息的持久化属性)
2、Publisher
消息生产者,向消息交换机发布消息的客户端应用程序
3、Exchange
交换器,接收生产者发送的消息并路由给服务器的队列
4、Binding
消息路由和消息队列的绑定,基于路由键将交换器和队列关联起来的规则,可以理解成一张路由表
5、Queue
消息队列,是消息的容器,一个消息可以投入到一个或多个队列,等待消费者链接到队列将消息取走。
6、Connection
网络连接,比如TCP协议
7、Channel
信道,信道是建立在真实TCP链接内的虚拟链接,AMQP命令都是通过信道发送的,不管是消息发布还是订阅队列和消费消息都是通过信道完成的,因为操作系统创建销毁TCP链接的开销相对比较高,引入信道的概念,复用一个TCP链接。
8、Consumer
消费者,表示一个从消息队列中取出消息的一个客户端。
9、Virtual Host
虚拟主机,表示一批交换器、消息队列和相关对象。虚拟主机是共享相同的身份认证和加密的独立服务器域,每一个vhost的本质就是一个mini版的rabbit服务器,有自己的路由、队列、绑定和权限机制,vhost是AMQP概念的基础,必须在链接是指定,默认为/
10、Broker
消息服务器实体
三、消息路由
AMQP中增加了Exchange和Binding角色,消息发送到Exchange到达队列在到消费者,Exchange负责接收消息,Binding决定Exchange的消息发布到哪个队列中去。
AMQP消息路由过程
Exchange类型:
Exchange分发消息时根据类型不同分发的策略有区别,目前分为四个类型,direct、fanout、topic、headers。headers匹配AMQP的header值而不是键,headers交换器和direct交换器完全一致,但是性能差很多。
1、direct
消息中的路由键(routing key)和绑定中的bindkey一致,交换器就讲消息放到对应的队列中去,路由键必须完全匹配,单播的模式。
2、fanout
每个发到fanout交换器的消息都会分发到对应绑定的队列中去,不会处理路由的键,消息转发是最快的。
3、topic
topic交换器通过模式匹配分发消息,将路由键和某个模式匹配,此时队列需要绑定到一个模式上,他将路由键和绑定键的字符串切分成单词,单词间用点隔开,匹配用"#"和""两个字符匹配,#表示匹配0个或多个单词,仅匹配一个单词。
四、使用rabbitMQ在java中的使用
1、生产者创建数据
//创建连接工厂
ConnectionFactory factory = new ConnectionFactory();
//设置用户名密码
factory.setUsername("guest");
factory.setPassword("guest");
//设置rabbitMQ地址
factory.setHost("localhost");
//创建连接
Connection conn = factory.newConnection();
//获取信道
Channel channel = conn.createChannel();
//声明交换器
String exchangeName = "hello-exchange";
channel.exchangeDeclare(exchangeName, "direct", true);
//发布消息
byte[] messageBodyBytes = "quit".getBytes();
String routingKey = "hola";
channel.basicPublish(exchangeName, routingKey, null, messageBodyBytes);
//关闭信道
channel.close();
//关闭连接
conn.close();
2、消费者消费数据
//创建链接工厂
ConnectionFactory factory=new ConnectionFactory();
//设置rabbitMQ地址
factory.setHost("39.105.16.12");
factory.setPort(5672);
factory.setVirtualHost("/");
//设置用户名密码
factory.setUsername("guest");
factory.setPassword("guest");
1 条评论
《医师好辣》港台综艺高清在线免费观看:https://www.jgz518.com/xingkong/2101.html