用于最高层级的逻辑隔离,不同的用户权限能操作的虚拟主机也不同,这就实现了根据一定规则(人群,地域,科目,部门)的权限划分。例如下面两个用户虽然都是Administrator管理员,但是它们的访问权限不同,能管理的虚拟主机也不同。
根据我们自己配置的规则,将消息路由到一个或者多个消息队列中。
消息队列就是用来存放消息的地方,它跟交换机是相对独立创建的,同一个虚拟主机下就属于兄弟关系,两者功能不同,但是它们两兄弟会通过绑定来合作,queue是保存消息和提供给消费者,exchange交换机是根据规则来读取消费绑定的消息队列中的消息。 queue就是一个杯子的作用!往里面装水也用它,喝水也用它,它传递奔波服务于生产者与消费端之间,而exchange就像一个服务员,准确地将这杯水送到需要的客人手中。
基于第2,3步我们创建好了队列以及交换机,下一步就是绑定。 由此可以看出,交换机绑定了队列,不管是发送还是接受,都要经过交换机。所以我们发送消息时,只需要简单的指定交换机和路由key,就可以发送成功,无需队列名(多余)。
路由key就是路由规则,也可以看作是一种匹配规则,routing精准匹配模式下一般使用XX.XX这种命名规则。topic主题匹配模式下,可以采用XX.星星**或者✨.XX这种。都可以。
由于RabbitMQ是ErLang写的。我也懒得去看源码,其实也非常简单,就大概了解下它的工作流程。
有的人觉得MQ为了实现一点数据传输,搞得这么麻烦简直脱裤子放屁,通过接口回调接口请求的方式不一样可以搞定吗? 如果是业务数据交互非常频繁的时候,不停地互相调用接口,等待返回接口,以及报错时候做服务降级处理,这是非常麻烦而且对于服务器来说是徒增了请求压力。
信道与队列基本上属于一一对应关系,队列必须依靠虚拟链接信道才能实现消息传输。这些由不得我们创建,是基于Connection自动创建的。
答案是通过channel id 和 queue name 和 consumer tag,随便点击一个channel进去看:
AMQP其实是一种协议,一种数据传输模型,一种消息队列规范。不论是什么MQ,十有八九离不开这个规范。就跟JDBC一样,你可以有Mysql驱动,Oracle驱动,SQLServer驱动,但是都必须根据JDBC规范来玩。 而以上我们创建的全部概念,集合起来就是AMQP给我们的约定和规范(不管是生产者还是消费者): 首先基于TCP长链接创建 然后通过信道来进行消息的发送和接收 进行虚拟主机分区管理 根据交换机匹配不同路由规则,分发消息 消息队列用来装消息,并与交换机绑定合作关系
优点: 解耦,更加灵活 基于单TCP长链接,减轻请求压力 信道概念的引入,更加适用于多线程场景 …剩下的靠自己吹,其实都是老一套了,顺便把MQ的优点说出来也行,什么侵入小,异步请求,削峰填谷,进程间和不同服务间调用减少了交互接口的编码量等等…