十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
接着 上篇随笔 增加几个概念:
成都创新互联公司专注于丰满网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供丰满营销型网站建设,丰满网站制作、丰满网页设计、丰满网站官网定制、小程序制作服务,打造丰满网络公司原创品牌,更为您提供丰满网站排名全网营销落地服务。RabbitMQ是一个在AMQP(高级消息队列协议)标准基础上完整的,可服用的企业消息系统。
AMQP模型的功能组件图(上图摘自 Sophia_tj 的 第2章 AMQP模型)
AMQP的四个总要概念:1、虚拟主机(virtual host)或(vhost)
2、交换机(exchange)
3、队列(queue)
4、绑定器(bind)
什么是虚拟主机?一组交换机、队列和绑定器 被称为 虚拟主机(vhost)。
为什么要用虚拟主机?RabbitMQ server 可以说就是一个消息队列服务器实体(Broker),Broker当中可以有多个用户(增加用户的命令),而用户只能在虚拟主机的粒度进行权限控制,所以RabbitMQ中需要多个虚拟主机。每一个RabbitMQ服务器都有一个默认的虚拟主机“/”。
队列(queue)是消息载体,每个消息都会被投入到一个或多个队列。试图创建一个已经存在的队列,RabbitMQ会直接忽略这个请求。(接收消息的实体)
把消息放进队列前,我们还需要使用另一个东西:交换机。
交换机(exchange),它指定消息按什么规则,路由到哪个队列。它可以被理解成具有路由表的路由程序。(发送消息的实体)
交换机可以存在多个,每个交换机在自己独立的进程当中执行,因此增加多个交换机就是增加多个进程,可以充分利用服务器上的CPU核以便达到更高的效率。
交换机如何判断要把消息送到哪个队列?这是我们需要路由规则,也就需要绑定器了。
绑定器(bind)它的作用就是把exchange和queue按照路由规则绑定起来。(将交换器和队列连接起来,并且封装消息的路由信息)
每个消息都有一个称为路由关键字(routingKey)的属性,exchange根据这个关键字进行消息投递,其实就是一个简单的字符串。(绑定操作就可以理解成:将exchange将具有路由关键字 “X” 的消息投递到到名为“business”的队列当中去。)
从而一个绑定就可以概括为:一个基于路由键将交换机和队列连接起来的路由规则。
需要注意:由Exchange,Queue,RoutingKey三个,才能决定一个从Exchange到Queue的唯一的线路。
程序中连接与消息使用的两个关键概念连接(Connection):与RabbitMQ Server建立的一个连接,由ConnectionFactory创建,每个connection只与一个物理的Server进行连接,此连接是基于Socket进行连接的。AMQP一般使用TCP。
通道 (Channel):消息通道(主要进行相关定义,发送消息,获取消息,事务处理等),在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务。
Channel在.net的客户端程序里应该是叫“Model”,采用IModel CreateModel()创建的,但是其他语言的客户端都叫Channel。
需要注意:一个Connection可以有多个Channel。
为什么设计中引入Channel概念?一个比较普遍的需求:客户端程序有时候会是一个多线程程序,每一个线程都想要和RabbitMQ进行连接,但是又不想共享一个连接。
因为一个Connection就是一个TCP链接,RabbitMQ在设计的时候不希望与每一个客户端保持多个TCP连接,但这确实是有些客户端的需求,每一个Channel之间没有任何联系,是完全分离的。
建立在Connection基础上的一个Channel,相对于Connection来说,它是轻量级的。Channel可以在多线程中使用,但是在必须保证任何时候只有一个线程执行命令。
不得不重点介绍的交换机交换机定义参数type: 直接式交换机direct,topic 和 fanout。
auto_delete: 当所有绑定队列都不再使用时,是否自动删除该交换机。
Fanout: 不处理路由键,将消息广播给绑定到该交换机的所有队列。 不论消息的路由关键字是什么,这条消息都会被路由到所有与该交换器绑定的队列中。
广播式交换器类型的工作方式如下:
不使用任何参数将消息队列与交换器绑定在一起。
发布者(直接式交换器类型描述中的producer变成了publisher,已经隐含了二种交换器类型的区别)向交换器发送一条消息。 消息被无条件的传递到所有和这个交换器绑定的消息队列中。
Direct: 处理路由键,对消息路径进行全文匹配。消息路由键 "sunshine" 只能匹配 "sunshine" 绑定,不匹配 "sunshine.warm" 这类绑定。
通过精确匹配消息的路由关键字,将消息路由到零个或者多个队列中,绑定关键字用来将队列和交换器绑定到一起。这让我们可以构建经典的点对点队列消息传输模型,不过和任何已定义的交换器类型一样,当消息的路由关键字与多个绑定关键字匹配时,消息可能会被发送到多个队列中。
在direct模式下还可以实现多路绑定,即一个exchange和多个queue绑定时,具有同样的bindkey,如下图:
Topic: 处理路由键,按模式匹配路由键。模式符号 "#" 表示一个或多个单词,"*" 仅匹配一个单词。如 "wood.#" 可匹配 "wood.palm.redwood",但 "wood.*" 只匹配 "wood.deadwood"。
主题式交换器类型提供了这样的路由机制:通过消息的路由关键字和绑定关键字的模式匹配,将消息路由到被绑定的队列中。这种路由器类型可以被用来支持经典的发布/订阅消息传输模型——使用主题名字空间作为消息寻址模式,将消息传递给那些部分或者全部匹配主题模式的多个消费者。
主题交换器类型的工作方式如下:
绑定关键字用零个或多个标记构成,每一个标记之间用“.”字符分隔。绑定关键字必须用这种形式明确说明,并支持通配符:“*”匹配一个词组,“#”零个或多个词组。
因此绑定关键字“*.dask.#”匹配路由关键字“class.dask”和“eur.dask.tab”,但是不匹配“dask.rho”。
这种交换器类型是可选的。
主题式的原理图解:
t