微服务SpringCloud项目(十一):rabbitmq的六种队列模式和五个基础概念

1,238 阅读7分钟

小知识,大挑战!本文正在参与「程序员必备小知识」创作活动

本文已参与 「掘力星计划」 ,赢取创作大礼包,挑战创作激励金。

📖前言

心态好了,就没那么累了。心情好了,所见皆是明媚风景。

“一时解决不了的问题,那就利用这个契机,看清自己的局限性,对自己进行一场拨乱反正。”正如老话所说,一念放下,万般自在。如果你正被烦心事扰乱心神,不妨学会断舍离。断掉胡思乱想,社区垃圾情绪,离开负面能量。心态好了,就没那么累了。心情好了,所见皆是明媚风景。

RabbitMQ 简介

AMQP,即 Advanced Message Queuing Protocol高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。 AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。 RabbitMQ 是一个开源的 AMQP 实现,服务器端用 Erlang 语言编写,支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP 等,支持 AJAX 。用于在 分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗

要学习RabbitMQ最靠谱的地方当然是他的官网:www.rabbitmq.com/,其他地方难免有解读误…

首先队列有几个概念要清楚


  1. 生产者producer:生产者向队列发送消息
  2. 消费者consumer:消费者从队列获取消息
  3. 交换机exchange:图中的x,订阅模式,生产者将消息发给交换机,由交换机选择把消息给谁
  4. 通道channel:创建了通道,才能和mq链接操作
  5. 队列queue:存消息的地方

支持六种队列模式

一、简单模式("Hello World!"


1634605807.jpg

一个生产者一个消费者

生产则发送消息,消费者拿到消息,这个过程就结束了。

二、work模式(Work queues


1634605807(1).jpg

一个生产者多个消费者

生产则发送一条消息,只能被一个消费者拿到。

如果生产者发送多条消息,消费者拿到的消息是不会重复的。

PS:默认情况下,RabbitMQ 将按顺序将每条消息发送给下一个消费者。平均而言,每个消费者将获得相同数量的消息。这种分发消息的方式称为循环法。与三个或更多工人一起尝试。

消息确认:分两种自动确认(易丢失数据)和手动确认(不易丢失数据)

手动确认:我们通过autoAck = true 标志明确地将它们关闭。一旦我们完成任务,就应该将此标志设置为false并从工作人员发送适当的确认。若忘记返回确认会造成消息无法释放,内存堆积。

消息持久性:分消息持久化与消息非持久化

消息持久化:数据写入磁盘,数据不易丢失(队列和消息都标记为持久)

消息非持久化:数据写入内存,数据存储速度快

公平派遣

1634605807(2).jpg

能者多劳

使用 basicQos 方法和 prefetchCount = 1 设置。在处理并确认前一个消息之前,不要向工作人员发送新消息。相反,它会将它发送给下一个仍然不忙的工人。

三、订阅模式( Publish/Subscribe


1634605807(3).jpg

和work模式类似,一个生产者多个消费者,但是中间多了个交换机(exchange ),一条消息可以被多个消费者获取。

生产者将消息发给交换机,交换机把消息分配给“已绑定”的消费者,前提是消费者和交换机绑定。

PS:P:生产者(发送数据) X:交换机 队列:存储数据(消息缓冲器) C:消费者(获取数据)

** RabbitMQ 中消息传递模型的核心思想是生产者永远不会将任何消息直接发送到队列。实际上,生产者通常甚至不知道消息是否会被传递到任何队列。**

流程:消息发送到 Exchanges(交换机), Exchanges 把消息发到绑定的队列,消费者获取队列消息

四种 Exchanges 类型:direct, topic, headers and fanout

发布订阅用的交换机类型为 fanout

四、路由模式(Routing


1634605807(4).jpg

和订阅模式类似,同样是一个生产者多个消费者,中间多了个交换机(exchange),一条消息可以被多个消费者获取。但是他在传递消息的时候多设置了一个key,消费者拿消息的时候也设置一个或多个key,key匹配才能拿消息。

例如:一号消费者设置的是insert,二号消费者设置的key是insert和update。假如生产者发送了一个key为insert的时候,2个消费者都能拿到数据。如果生产者发送了一个key为update,那么这时候只有2号消费者能拿到数据。

五、通配符(话题)模式(Topics


1634605807(5).jpg

和路由模式类似,同样是一个生产者多个消费者,中间多了个交换机(exchange),一条消息可以被多个消费者获取。同样是传 key,但是他的 key 是可以模糊匹配的,*匹配 一个单词,#匹配0或者多个单词。

例如:一号消费者设置的是item.#,二号消费者设置的 keyitem.* 。一号消费者可以获取所有 item开头 的消息,二 号就只能匹配 item. 后面加一个词的消息。例如:消息是 item.insert 他可以获取,但是 item.insert.update 他就不能获取了。

发送到主题交换的消息不能具有任意 routing_key - 它必须是由点分隔的单词列表。单词可以是任何内容,但通常它们指定与消息相关的一些功能。一些有效的路由密钥示例:“ stock.usd.nyse ”,“ nyse.vmw ”,“ quick.orange.rabbit ”。路由密钥中可以包含任意数量的单词,最多可达255个字节。

绑定密钥也必须采用相同的形式。主题交换背后的逻辑 类似于直接交换- 使用特定路由密钥发送的消息将被传递到与匹配绑定密钥绑定的所有队列。但是,绑定键有两个重要的特殊情况:

  • *(星号)可以替代一个单词。
  • #(hash)可以替换零个或多个单词。

六、远程过程调用(RPC)


1634605807(6).jpg

使用 RabbitMQ 构建 RPC 系统:客户端和可伸缩的 RPC 服务器。由于我们没有任何值得分发的耗时任务,我们将创建一个返回 Fibonacci数字虚拟RPC服务

RPC 将这样工作:

对于 RPC 请求,客户端发送带有两个属性的消息:replyTo,设置为仅为请求创建的匿名独占队列;以及 correlationId,设置为每个请求的唯一值。

请求被发送到 rpc_queue 队列。

RPC worker(aka:server) 正在等待该队列上的请求。当出现请求时,它会执行该作业,并使用来自 replyTo字段 的队列将带有结果的消息发送回客户端。

客户端等待回复队列上的数据。出现消息时,它会检查 correlationId属性。如果它与请求中的值匹配,则返回对应用程序的响应。


PS:最后感谢大家耐心观看完毕,留个点赞收藏是您对我最大的鼓励!


🎉总结:

  • 更多参考精彩博文请看这里:《陈永佳的博客》

  • 喜欢博主的小伙伴可以加个关注、点个赞哦,持续更新嘿嘿!