rabbitmq是用Erlang语言编写的,实现了AMQP协议。它是一个具有易用性、可扩展性和高可用性的分布式MQ。1.基本结构这张图揭示了rabbitmq的基本结构,解释了几个概念brokerrabbit服务实例vhost虚拟主机每个vhost本质上就是一个迷你的RabbitMQ服务器,有自己的队列、交换机、绑定和权限机制channelchannel之后是producer、consumer和broker建立连接(connection),在链路上建立另一层轻量级链路。如果把Connection比作一根光缆,那么Channel通道就比作光缆中的一根光纤。一个Connection上可以创建任意数量的Channelqueue队列。消息队列的内部维护。exchange开关决定了消息传递到队列的方式。exchange和queue之间的bind绑定关系决定了消息的传递。keymessagerouting-key:传递消息时的路由。某些交换类型被传递到特定队列。如果绑定密钥是公共汽车,它将在特定路线上行驶;那么routing-key就是ticketstub,这个ticket对应某辆公交车,把消息带到目的地header:消息的header决定headers的switchroutingmethod和exchangetype重点讲解这几种交换。直接绑定exchange和queue时,指定binding-key。消息投递时,通过消息体中的routing-key找到对应的binding-key,发送到特定队列。如果消息中的routing-key是hello,发送到directexchange时,会查找binding-key="hello"bindingkey。如果能找到binding-key,则将数据推送到对应的队列;如果找不到,请丢弃该消息。默认是一种特殊的直接交换。创建交换器时,如果你没有指定交换器名称(或传递一个空字符串作为名称),将创建一个默认交换器并创建一个新队列。如果不设置绑定关系,会自动绑定到defaultexchange,binding-key与新建队列的名字相同。比如新建的队列名为world,如果不设置绑定关系,就会绑定到默认的exchange。="世界";这时候发送一个routing-key="world"的消息自然会被路由到fanout广播方式的queue="world"的队列中,发送到fanoutexchange的消息会广播到其bound上的所有队列。fanout模式不关心binding-key和routing-key。topic主题模式有点类似于direct;区别在于direct模式是binding-key和routing-key的精确匹配,而topic模式是模糊匹配。topic模式匹配器有两种:#和*在图中有详细说明(topic-exchange),这里不多说墨头也是一种模糊匹配的方式。而headers模式不再依赖routing-key匹配,而是使用报文中的headers进行传输。2.集群高可用原来一个broker为你服务,现在有N个broker为你服务。普通集群在普通集群模式下,元数据会被复制,集群中的每个节点都有其他节点的元数据信息。元数据包括以下内容:队列元数据:队列名称、属性;交换机元数据:交换机名称、类型和属性;绑定元数据:交换机与队列的绑定关系,如binding_key;vhost元数据:虚拟主机内部配置和属性;元数据仅提供信息,可以告诉您某个队列在哪个代理节点上。图中consumer想在broker1上消费queue1的消息,但是consumer链接在broker3上。Broker3通过元数据信息知道queue1在broker1上,会转发这个请求。这样消费者就消费了broker1的queue1消息。普通集群的优点:只保存一份消息数据,节省磁盘空间普通集群的缺点:如果一个broker发生故障,这个broker上的队列将无法运行镜像集群。实现的话,可以使用镜像模式来实现RabbitMQ的高可用方案。在我的理解中,镜像模式是在队列层面进行同步,主队列负责写,从队列作为镜像,复制从队列的信息,提供读服务。消费者在消费消息时不需要转发消息;如果一个broker失败,master将被重新选举。附录P6-P7知识集锦
