交换机日志删除_RabbitMQ交换机Exchange的企业级实战

Exchange:接收消息,并根据路由键转发消息所绑定的队列。注意交换机并非一个单独运行的进程,而是一个有着“地址”的列表而已。

26394252163c27d51dea330336b1b465.png

蓝区 - Send Message:把消息投递到交换机,由 RoutingKey 路由到指定队列。

1 交换机属性

声明交换机时可以附带许多属性:

  • Name 交换机名称
  • Type 交换机类型,direct、topic、 fanout、 headers
  • Durability,是否需要持久化。 如果持久化,则RabbitMQ重启后,交换机还存在
  • Auto-delete 当最后一个绑定到Exchange 上的队列删除后,自动删除该Exchange
  • Internal 当前Exchange是否于RabbitMQ内部使用,默认为False

2 交换机类型

交换机主要包括如下4种类型:

  1. Direct exchange(直连交换机)
  2. Fanout exchange(扇型交换机)
  3. Topic exchange(主题交换机)
  4. Headers exchange(头交换机)

另外RabbitMQ默认定义一些交换机:

  • 默认交换机 amq.* exchanges

还有一类特殊的交换机:

  • Dead Letter Exchange(死信交换机)

2.1 Direct Exchange

所有发送到DE的消息被转发到RouteKey中指定的Queue

Direct模式可使用RabbitMQ自带的Exchange: default Exchange,所以不需要将Exchange进行任何绑定(binding),消息传递时,RouteKey必须完全匹配才会被队列接收,否则该消息会被抛弃。

2.2 Direct Exchange原理示意图

ed21e1699ebc611bd87d2c37e5f4f487.png

d9724c75bb620335ca33720fd83c6b47.png

2.3 Direct Exchange实操演示

  • Pro

f78ceb6fd7aa2d025d46560bdee08a58.png
  • Con

9bfb0eebd7cf9ea49aa31271eb602f9d.png

注意路由key保持一致!分别启动

df306404726eef2df7a1a98147bfb1fd.png

911f955bbffb65077c01ec3ed88ce0f9.png

a5b7a5647a9a43fb5ce7a332f06fcccd.png

489f9e4a41fc65988eca52d42acbb7e5.png

2.2 Topic exchange

尽管使用直接交换改进了我们的系统,它仍然有局限性 - 不能做基于多个标准的路由。

比如在日志系统,可能不仅要根据严重性订阅日志,还要根据日志源订阅日志。

你可能从syslog unix工具中了解这个概念,它根据严重性(info / warn / crit ...)和facility(auth / cron / kern ...)来路由日志。

这更具灵活性 - 我们可能想要监听来自 cron 的关键错误以及来自 kern 的所有日志。

为了在日志记录系统中实现这一点,还需要了解更复杂的主题交换机。

  • *可匹配一个单词
  • #可匹配零或多个单词
  • 所有发送到Topic Exchange的消息会被转发到所有关心RouteKey中指 定Topic的Queue上
  • Exchange将RouteKey和某Topic进行模糊匹配,此时队列需要绑定一个Topic

2.2.1 实例1

89fa5d08ee41169c5f3b6f036e3bdaf9.png

在这个例子中,我们将发送所有描述动物的消息。消息将与包含三个单词(两个点)的routing key一起发送. routing key中的第一个单词描述速度,第二颜色,第三是物种:“。。”。

我们创建了三个绑定:Q1绑定了绑定键“* .orange.”,Q2绑定了“.*.rabbit”和“lazy.#”

这些绑定可总结为:

  • Q1对所有橙色动物感兴趣
  • Q2希望听到关于兔子的一切,以及关于懒惰动物的一切

routing key设置为“quick.orange.rabbit”的消息将传递到两个队列。消息“lazy.orange.elephant”也将同时发送给他们. 另一方面

  • “quick.orange.fox”只会转到第一个队列
  • 而“lazy.brown.fox”只会转到第二个队列
  • “lazy.pink.rabbit”将仅传递到第二个队列一次,即使它匹配两个绑定
  • “quick.brown.fox”与任何绑定都不匹配,因此它将被丢弃。

如果我们违背我们的约定并发送带有一个或四个单词的消息,例如“orange” or “quick.orange.male.rabbit”,会发生什么?好吧,这些消息将不会匹配任何绑定,因此将丢失.

另一方面,“lazy.orange.male.rabbit”,虽然它有四个单词,也会匹配最后一个绑定,并将被传递到第二个队列。

实例图

ecc49243c997fdc413a401b456a7941b.png

da0608e6288710a6df94397d2a254e47.png

实操演示

  • Pro

a5b51eaf00621c06fae805cfa8f5fe31.png
  • Con

511161acf69e2ace765813e0c326541c.png
  • 启动消费者:

734d56a16e047334b595d42da58ac4a5.png

4aa3fb656e060e0583b65b5f6910fe21.png
  • 启动生产者:

09e9a825d98c2f0b2a2c6bd27cc7078e.png

消费端收到了消息

  • 修改匹配格式,理论上只能接受前两个消息

5bf8d4fa55b5ccb1f52b0080ef69b771.png
  • 注意在管控台,先将之前的匹配绑定取消!

1eae37b2bdcc1d88694ee53fb41d66c0.png

b228a513c3f76c1c1b2d27fdf32d3777.png
  • 显然仅能接受前两个消息

eb44d4067f1c8a385a0fe9e31138358f.png

小结

主题交换机功能强大,可以像其他交换机一样运行。 当队列绑定“#”(哈希)绑定key时 - 它将接收所有消息,而不管routing key - 就像在fanout交换机一样。 当特殊字符“*”(星号)和“#”(哈希)未在绑定中使用时,主题交换机的行为就像直接交换机一样。

13.2.3 Fanout Exchange

  • 不处理路由键,只需要简单的将队列绑定到交换机上
  • 发送到交换机的消息都会被转发到与该交换机绑定的所有队列上
  • Fanout交换机转发消息是最快的

799f586652cb11c29113d8ede945533f.png

321a0eb2852beb39d78232841e19a993.png

实操演示

  • Con

d39e6aea752a698cbb262414fd8b20cd.png
  • Pro

4b9efc580cd1581b6c72defcaa9e71da.png
  • 启动消费端

25fe8e523e805c003304034684edfc30.png
  • 不需要routing key

174a8028acbf1b544bb2d251642523be.png
  • 启动生产者后接收到的消息

11ddee72db5c24165a67db595036e024.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值