前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >RabbitMQ的三大消息模式

RabbitMQ的三大消息模式

作者头像
名字是乱打的
发布2022-05-13 10:35:10
6360
发布2022-05-13 10:35:10
举报
文章被收录于专栏:软件工程软件工程
先解释下交换机和交换机类型

交换机是用来发送消息的AMQP实体。交换机拿到一个消息之后将它路由给一个或零个队列。它使用哪种路由算法是由交换机类型和被称作绑定(bindings)的规则所决定的。AMQP 0-9-1的代理提供了四种交换机

Name(交换机类型)

Default pre-declared names(预声明的默认名称)

Direct exchange(直连交换机)

(Empty string) and amq.direct

Fanout exchange(扇型交换机)

amq.fanout

Topic exchange(主题交换机)

amq.topic

Headers exchange(头交换机)

amq.match (and amq.headers in RabbitMQ)

除交换机类型外,在声明交换机时还可以附带许多其他的属性,其中最重要的几个分别是:

  • Name
  • Durability (消息代理重启后,交换机是否还存在)
  • Auto-delete (当所有与之绑定的消息队列都完成了对此交换机的使用后,删掉它)
  • Arguments(依赖代理本身)

交换机可以有两个状态:持久(durable)、暂存(transient)。持久化的交换机会在消息代理(broker)重启后依旧存在,而暂存的交换机则不会(它们需要在代理再次上线后重新被声明)。然而并不是所有的应用场景都需要持久化的交换机。

这里的默认交换机

默认交换机(default exchange)实际上是一个由消息代理预先声明好的没有名字(名字为空字符串)的直连交换机(direct exchange)。它有一个特殊的属性使得它对于简单应用特别有用处:那就是每个新建队列(queue)都会自动绑定到默认交换机上,绑定的路由键(routing key)名称与队列名称相同。

举个栗子:当你声明了一个名为"search-indexing-online"的队列,AMQP代理会自动将其绑定到默认交换机上,绑定(binding)的路由键名称也是为"search-indexing-online"。因此,当携带着名为"search-indexing-online"的路由键的消息被发送到默认交换机的时候,此消息会被默认交换机路由至名为"search-indexing-online"的队列中。换句话说,默认交换机看起来貌似能够直接将消息投递给队列,尽管技术上并没有做相关的操作。

一 直接模式(Direct)

什么是Direct模式 --一对一模式

我们需要将消息发给唯一 一个节点时使用这种模式,这是最简单的一种形式。

代码语言:javascript
复制
任何发送到DirectExchange的消息都会被直接转发到RouteKey中指定的Queue。
1.一般情况可以使用rabbitMQ自带的Exchange:""(该Exchange的名字为空字符串,下文称其为defaultExchange)。
2.这种模式下不需要将Exchange进行任何绑定(binding)操作
3.消息传递时需要一个“RoutingKey”,可以简单的理解为要发送到的队列名字。
4.如果vhost中不存在RoutingKey中指定的队列名,则该消息会被抛弃。

二 分列模式(Fanout)--广播模式一对多

什么是分列(Fanout)模式

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

  • 1.可以理解为路由表的模式
  • 2.这种模式不需要RoutingKey
  • 3.这种模式需要提前将Exchange与Queue进行绑定,一个Exchange可以绑定多个Queue,一个Queue可以同多个Exchange进行绑定。
  • 4.如果接受到消息的Exchange没有与任何Queue绑定,则消息会被抛弃。
分别模式要让交换器绑定队列

(1)在queue中添加队列zyhglod和zyhsilver

(2)新建交换器makemoney

三 主题模式 --多对多模式

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

如上图所示

此类交换器使得来自不同的源头的消息可以到达一个对列,其实说的更明白一点就是模糊匹配的意思,例如:上图中红色对列的RoutingKey为usa.#,#代表匹配任意字符,但是要想消息能到达此对列,usa.必须匹配,后面的#可以随意。图中usa.news usa.weather,都能找到红色队列,符号#匹配一个或多个词符号*只匹配一个词。因此usa.#能够匹配到usa.news.XXX,但是usa.*只会匹配到usa.XXX。

注: 交换器 说到底 是一个名称与队列绑定的列表

当消息发布到交换器时,实际上是由你所连接的信道,将消息路由键同交换器上绑定的列表进行比较,最后路由消息。

任何发送到TopicExchange的消息都会被转发到所有关心RoutingKey中指定话题的

Queue上

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

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

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

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

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

三大模式demo

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-05-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 先解释下交换机和交换机类型
  • 一 直接模式(Direct)
    • 什么是Direct模式 --一对一模式
    • 二 分列模式(Fanout)--广播模式一对多
      • 什么是分列(Fanout)模式
        • 分别模式要让交换器绑定队列
        • 三 主题模式 --多对多模式
        • 三大模式demo
        相关产品与服务
        消息队列 CMQ
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档