博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
rabbitmq的整体架构一览
阅读量:6814 次
发布时间:2019-06-26

本文共 2699 字,大约阅读时间需要 8 分钟。

AMQ结构图,工作原理图

重要术语

Server(broker):接收客户端连接,实现AMQP消息队列的路由功能的进程.简单来说就是消息队列服务器实体。

Vhost虚拟主机,一个broker里可以开设多个vhost,用作不同用户的权限分离。权限控制组,用户只能关联到一个vhost上,一个vhost中可以有若干个Exchange和Queue,默认的vhost是"/"

Exchange:接收生产者发送的消息,并根据Binding规则将消息路由给服务器中的队列 Exchange Type决定了Exchange路由消息额行为,例如,在RabbitMQ中,ExchangeType有Direct、Fanout和Topic三种,不同类型的Exchange路由得到行为是不一样的

queue:用于存储还未消费的消息。消息队列载体,每个消息都会被投入到一个或多个队列。

Message:由Header和Body组成,Header是由生产者添加到各种属性的集合,包括Message是否被持久化,是由哪个Message Queue接收优先级是多少等,而Body是真正需要传输的APP数据

Binding: 绑定,它的作用就是把exchange和queue按照路由规则绑定起来。

BindingKey: 在mq中设置的绑定key

Routing Key:路由关键字,exchange根据这个关键字进行消息投递。
producer:消息生产者,就是投递消息的程序。

consumer:消息消费者,就是接受消息的程序。
channel:消息通道,在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务


消息队列的使用过程大概如下:

(1)客户端(生产者)连接到消息队列服务器,打开一个channel。

(2)客户端声明一个exchange,并设置相关属性。
(3)客户端声明一个queue,并设置相关属性。
(4)客户端使用routing key,在exchange和queue之间建立好绑定关系。
(5)客户端投递消息到exchange。

exchange接收到消息后,就根据消息的key和已经设置的binding,进行消息路由,将消息投递到一个或多个队列里。


exchange也有几个类型,完全根据key进行投递的叫做Direct交换机,例如,绑定时设置了routing key为”abc”,那么客户端提交的消息,只有设置了key为”abc”的才会投递到队列。对key进行模式匹配后进行投递的叫做Topic交换机,符号”#”匹配一个或多个词,符号”*”匹配正好一个词。例如”abc.#”匹配”abc.def.ghi”,”abc.*”只匹配”abc.def”。还有一种不需要key的,叫做Fanout交换机,它采取广播模式,一个消息进来时,投递到与该交换机绑定的所有队列。

Direct:

任何发送到Direct Exchange的消息都会被转发到routing_key中指定的Queue

1.一般情况可以使用rabbitMQ自带的Exchange:””(该Exchange的名字为空字符串);

2.这种模式下不需要将Exchange进行任何绑定(bind)操作;

3.消息传递时需要一个“routing_key”,可以简单的理解为要发送到的队列名字;

4.如果vhost中不存在routing_key中指定的队列名,则该消息会被抛弃。

如代码发送

1
2
3
4
5
6
7
8
9
10
import 
pika
connection = pika.BlockingConnection(pika.ConnectionParameters(
        
host=
'localhost'
))
channel = connection.channel()
channel.queue_declare(queue=
'hello'
)
channel.basic_publish(exchange=
''
,
                      
routing_key=
'hello'
,
                      
body=
'Hello World!'
)
print(
" [x] Sent 'Hello World!'"
)
connection.close()

Topic:

任何发送到Topic Exchange的消息都会被转发到所有关心routing_key中指定话题的Queue上

1.这种模式较为复杂,简单来说,就是每个队列都有其关心的主题,所有的消息都带有一个“标题”(routing_key),Exchange会将消息转发到所有关注主题能与routing_key模糊匹配的队列。

2.这种模式需要routing_key,也许要提前绑定Exchange与Queue。

3.在进行绑定时,要提供一个该队列关心的主题,如“#.log.#”表示该队列关心所有涉及log的消息(一个routing_key为”MQ.log.error”的消息会被转发到该队列)。

4.“#”表示0个或若干个关键字,“*”表示一个关键字。如“log.*”能与“log.warn”匹配,无法与“log.warn.timeout”匹配;但是“log.#”能与上述两者匹配。

5.同样,如果Exchange没有发现能够与routing_key匹配的Queue,则会抛弃此消息。


Fanout:

任何发送到Fanout Exchange的消息都会被转发到与该Exchange绑定(Binding)的所有Queue上

1.可以理解为路由表的模式

2.这种模式不需要routing_key

3.这种模式需要提前将Exchange与Queue进行绑定,一个Exchange可以绑定多个Queue,一个Queue可以同多个Exchange进行绑定。

4.如果接受到消息的Exchange没有与任何Queue绑定,则消息会被抛弃。

Demo中创建了一个将一个exchange和一个queue进行fanout类型的bind.但是发送信息时没有用到它,如果要用到它,只要在发送消息时指定该exchange的名称即可,该exchange就会将消息发送到所有和它bind的队列中。在fanout模式下,指定的routing_key是无效的 。


rabbitMQ的两个核心组件是exchange和queue

运行原理如下图:

本文转自残剑博客51CTO博客,原文链接http://blog.51cto.com/cuidehua/1769486如需转载请自行联系原作者

cuizhiliang

你可能感兴趣的文章
u-boot-1.3.4 移植到S3C2440
查看>>
域名劫持到底有多严重,该如何量化?
查看>>
IOS开发之支付功能概述
查看>>
【ASP.NET】Webform与MVC开发比较
查看>>
表格存储的Java SDK优化经验
查看>>
在Aliyun E-MapReduce集群上 使用sqoop高级特性
查看>>
用CIFilter生成QRCode二维码图片
查看>>
HotSpot运行时概览#2
查看>>
小菜一步一步学数据结构之(五)顺序栈
查看>>
GlusterFS on ZFS on CentOS 6.x x64
查看>>
poj 3414 (POTS) (BFS)
查看>>
【MyBatis框架】查询缓存-二级缓存原理
查看>>
Unity3D插件开发
查看>>
【SICP练习】2 练习1.6
查看>>
[LeetCode]90.Subsets II
查看>>
模拟Android软件试用到期提示注册
查看>>
换一种方式来解决问题
查看>>
Google Git-Repo 多仓库项目管理
查看>>
Android分享脚手架:Github/EasyShare说明文档
查看>>
应用设计模式和产品经理成为好朋友——策略模式实战
查看>>