消息中间件-RabbitMQ
今天就来讲一下 目前比较流行的消息中间件之一的 RabbitMQ(目前所在公司正在使用)
各大消息中间件的对比
RabbitMq构造
几个概念说明:
Broker:简单来说就是消息队列服务器实体。
Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列。
Queue:消息队列载体,每个消息都会被投入到一个或多个队列。
Binding:绑定,它的作用就是把exchange和queue按照路由规则绑定起来。
Routing Key:路由关键字,exchange根据这个关键字进行消息投递。
vhost:虚拟主机,一个broker里可以开设多个vhost,用作不同用户的权限分离。
producer:消息生产者,就是投递消息的程序。
consumer:消息消费者,就是接受消息的程序。
channel:消息通道,在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务。
交换机
交换机用来接收消息,转发消息到绑定的队列,是rabbitMq中的核心。
交换机共有4种类型:direct,topic,headers和fanout。
为什么不创建一种交换机来处理所有类型的路由规则?因为每种规则匹配时的CPU开销是不同的,所以根据不同需求选择合适交换机。
举例:一个"topic"类型的交换机会将消息的路由键与类似“gt02.*”的模式进行匹配。一个“direct”类型的交换机会将路由键与“gt02M”进行比较。匹配末端通配符比直接比较消耗更多的cpu,所以如果用不到“topic”类型交换机带来的灵活性,就通过“direct”类型交换机获得更高的处理效率。
1、Direct交换机:转发消息到routingKey指定队列(完全匹配,单播)。
routingKey与队列名完全匹配,如果一个队列绑定到交换机要求路由键为“gt02”,则只转发routingkey标记为dog的消息,不会转发gt02.puppy,也不会转发gt02.guard等。
2、fanout 交换器(按规则转发消息(最快,广播))
fanout交换机不处理路由键,简单的将队列绑定到交换机上,每个发送到交换机的消息都会被转发到与该交换机绑定的所有队列上。
3、direct 交换机 转发消息到routingKey指定队列(完全匹配,单播)。
消息中的路由键(routing key)如果和 Binding 中的 binding key 一致, 交换器就将消息发到对应的队列中。
公司所用的就是directtopic 交换器(最灵活,组播)
topic 交换器通过模式匹配分配消息的路由键属性,将路由键和某个模式进行匹配,此时队列需要绑定到一个模式上。它将路由键和绑定键的字符串切分成单词,这些单词之间用点隔开。它同样也会识别两个通配符:符号“#”和符号“”。#匹配0个或多个单词,匹配不多不少一个单词。