java热血征途触屏版,源码+原理+手写框架
基础知识
是一个开源的消息代理和队列服务器,用来通过普通协议在完全不同的应用之间共享数据,它是使用语言来编写的,并且是基于AMQP协议的;
高性能的原因
AMQP协议
什么是AMQP高级消息队列协议
AMQP( )定义:具有现代特征的二进制协议。是一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计
AMQP协议模型:
推送消息前先与建立连接,找到 host,然后将消息推送至交换机。而交换机与 Queue有绑定关系(一个交换机相当于一个独立的虚拟机,而这个虚拟机内的各种独立的应用就相当于一个Queue,这个Queue与交换机绑定),通过绑定的对队列,而交换机也绑定了队列。发送者将消息发送给交换机,这样就能完成消息的推送了
整体架构图
基本概念
消息队列服务进程,接收客户端的连接,实现AMQP实体服务。
连接,应用程序与的网络连接。
消息生产者,即生产方客户端,生产方客户端将消息发送到MQ。
消息消费者,即消费方客户端,接收MQ转发的消息。
网络信道,几乎所有的操作都在中进行,是进行消息读写的通道。客户端可建立多个,每个代表一个会话任务
消息,服务器和应用程序之间传送的数据,由和Body组成。可以对消息进行修饰,比如消息的优先级、延迟等高级特性;Body则就是消息体内容。
Host
虚拟地址,用于进行逻辑隔离,最上层的消息路由。一个 Host里面可以有若干个和Queue,同一个 Host里面不能有相同名称的或Queue
交换机,接收消息,根据路由键转发消息到绑定的队列。
常见的有4种不同的交换机类型:
扇形交换机
扇形交换机是最基本的交换机类型,扇形交换机会把能接收到的消息全部发送给绑定在自己身上的队列。因为广播不需要思考,所以扇形交换机处理消息的速度也是所有的交换机类型里面最快的
直连交换机
直连交换机是一种带路由功能的交换机,一个队列会和一个交换机绑定,除此之外再绑定一个,当消息被发送的时候,需要指定一个,这个消息被送达交换机的时候,就会被这个交换机送到指定的队列里面去。同样的一个也是支持应用到多个队列中的
这样当一个交换机绑定多个队列,就会被送到对应的队列去处理
适用场景:有优先级的任务,根据任务的优先级把消息发送到对应的队列,这样可以指派更多的资源去处理高优先级的队列
主题交换机
直连交换机的方案非常简单,如果我们希望一条消息发送给多个队列,那么这个交换机需要绑定上非常多的,假设每个交换机上都绑定一堆的连接到各个队列上。那么消息的管理就会异常地困难。
所以提供了一种主题交换机,发送到主题交换机上的消息需要携带指定规则的,主题交换机会根据这个规则将数据发送到对应的(多个)队列上。
主题交换机的需要有一定的规则,交换机和队列的需要采用*.#.*.....的格式,每个部分用.分开,其中:
当一个队列的绑定键为#的时候,这个队列将会无视消息的路由键,接收所有的消息
首部交换机
首部交换机是忽略的一种路由方式。路由器和交换机路由的规则是通过信息来交换的,这个有点像HTTP的。
将一个交换机声明成首部交换机,绑定一个队列的时候,定义一个Hash的数据结构,消息发送的时候,会携带一组hash数据结构的信息,当Hash的内容匹配上的时候,消息就会被写入队列。
绑定交换机和队列的时候,Hash结构中要求携带一个键x-match,这个键的Value可以是any或者all,这代表消息携带的Hash是需要全部匹配(all),还是仅匹配一个键(any)就可以了
相比直连交换机,首部交换机的优势是匹配的规则不被限定为字符串
和Queue之间的虚拟连接,在与多个 Queue发生后会生成一张路由表,路由表中存储着 Queue所需消息的限制条件即 Key。当收到时会解析其得到 Key,根据 Key与 Type将路由到 Queue。 Key由在 与 Queue时指定,而 Key由发送时指定,两者的匹配方式由 Type决定
Key
一个路由规则,虚拟机可用它来确定如何路由一个特定消息。
Queue
也称为 Queue,消息队列,保存消息并将它们转发给消费者。
消息发布流程:
生产者和建立TCP连接。生产者和建立通道。生产者通过通道消息发送给,由将消息进行转发。将消息转发到指定的Queue(队列)
消息接收流程:
消费者和建立TCP连接 。消费者和建立通道。消费者监听指定的Queue(队列)当有消息到达Queue时默认将消息推送给消费者。消费者接收到消息。
消息流转过程
生产者生产出并投递到上
一个可以绑定多个 Queue,它根据路由策略( key)路由到指定的队列,最后由消费端去监听队列
工作模式
队列模式:
对于任务过重或任务较多情况使用工作队列可以提高任务处理的速度。
1、一条消息只会被一个消费者接收;
2、采用轮询的方式将消息是平均发送给消费者的;
3、消费者在处理完某条消息后,才会收到下一条消息。