设为首页 收藏本站
查看: 1184|回复: 0

[经验分享] RabbitMQ 实现原理

[复制链接]

尚未签到

发表于 2017-7-2 10:58:40 | 显示全部楼层 |阅读模式
  AMQP(高级消息队列协议 Advanced Message Queue Protocol)
  AMQP当中有四个概念非常重要: 虚拟主机(virtual host),交换机(exchange),队列(queue)和绑定(binding)。一个虚拟主机持有一组交换机、队列和绑定。为什么需要多个虚拟主机呢?很简单,RabbitMQ当中,用户只能在虚拟主机的粒度进行权限控制。因此,如果需要禁止A组访问B组的交换机/队列/绑定,必须为A和B分别创 建一个虚拟主机。每一个RabbitMQ服务器都有一个默认的虚拟主机“/”。
  Producer 要产生消息必须要创建一个 Exchange ,Exchange 用于转发消息,但是它不会做存储,如果没有 Queue bind 到 Exchange 的话,它会直接丢弃掉 Producer 发送过来的消息,当然如果消息总是发送过去就被直接丢弃那就没有什么意思了,一个 Consumer 想要接受消息的话,就要创建一个 Queue ,并把这个 Queue bind 到指定的 Exchange 上,然后 Exchange 会把消息转发到 Queue 那里,Queue 会负责存储消息,Consumer 可以通过主动 Pop 或者是 Subscribe 之后被动回调的方式来从 Queue 中取得消息。

  Exchange,Queue,RoutingKey
DSC0000.png

  蓝色-- Client(相对于Rabbitmq Server来说)
  绿色--Exchange
  红色—Queue
  - 交换器(Exchange),它是发送消息的实体。
  - 队列(Queue),这是接收消息的实体。
  - 绑定器(Bind),将交换器和队列连接起来,并且封装消息的路由信息。
  Exchange指向Queue的黑色线—RoutingKey,可以将它简单的理解为一条连接Exchange和Queue的路线
  Exchange和Queue都需要通过channel来进行定义,而RoutingKey则只需要在binding时取个名字就行了。
  这一块的理解是不正确的,
  Exchange Queue RoutingKey关系说明:
Exchange Name

Queue Name

Routing Key

  
  test.queue     
  test.queue
  
  test.queue2   
  test.queue2
  test.exchange  
  test.queue     
  test.routingkey
  test.exchange  
  test.queue2   
  test.routingkey
  test.exchange  
  test.queue     
  test.routingkey2
  test.exchange1
  test.queue     
  test.routingkey
  由结果可以看出,由Exchange,Queue,RoutingKey三个才能决定一个从Exchange到Queue的唯一的线路。
DSC0001.png

  左边的Client向右边的Client发送消息,流程:
  1,  获取Conection
  2,  获取Channel
  3,  定义Exchange,Queue
  4,  使用一个RoutingKey将Queue Binding到一个Exchange上
  5,  通过指定一个Exchange和一个RoutingKey来将消息发送到对应的Queue上,
  6,  接收方在接收时也是获取connection,接着获取channel,然后指定一个Queue直接到它关心的Queue上取消息,它对Exchange,RoutingKey及如何binding都不关心,到对应的Queue上去取消息就OK了
  一个Client发送消息,哪些Client可以收到消息,其核心就在于Exchange,RoutingKey,Queue的关系上。
  
  Exchange
  RoutingKey
  Queue
  1
  E1
  R1
  Q1
  2
  
  R2
  Q2
  3
  E2
  R3
  Q1
  4
  
  R4
  Q2
  5
  E1
  R5
  Q1
  6
  E2
  R6
  Q1
  我们可以这样理解,RoutingKey就像是个中间表,将两个表的数据进行多对多关联,只不过对于相同的Exchange和Queue,可以使用不同的RoutingKey重复关联多次。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-390271-1-1.html 上篇帖子: .NET 使用 RabbitMQ 图文简介 下篇帖子: RabbitMQ之发布订阅【译】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表