1、简单模式
HelloWorld
注释:P:生产者(发送数据) 队列:存储数据(消息缓冲器) C:消费者(获取数据)
生产者消费者均为应用程序。
2、工作队列
Work Queues
注释:默认情况下,RabbitMQ将按顺序将每条消息发送给下一个消费者。平均而言,每个消费者将获得相同数量的消息。这种分发消息的方式称为循环法。与三个或更多工人一起尝试。
消息确认:分两种自动确认(易丢失数据)和手动确认(不易丢失数据)
手动确认:我们通过autoAck = true 标志明确地将它们关闭。一旦我们完成任务,就应该将此标志设置为false并从工作人员发送适当的确认。若忘记返回确认会造成消息无法释放,内存堆积。
消息持久性:分消息持久化与消息非持久化
消息持久化:数据写入磁盘,数据不易丢失(队列和消息都标记为持久)
消息非持久化:数据写入内存,数据存储速度快
公平派遣
能者多劳
使用basicQos方法和 prefetchCount = 1设置。在处理并确认前一个消息之前,不要向工作人员发送新消息。相反,它会将它发送给下一个仍然不忙的工人。
3、发布订阅
基本上,发布的消息将被广播给所有接收者。
Publish/Subscribe
注释:P:生产者(发送数据) X:交换机 队列:存储数据(消息缓冲器) C:消费者(获取数据)
RabbitMQ中消息传递模型的核心思想是生产者永远不会将任何消息直接发送到队列。实际上,生产者通常甚至不知道消息是否会被传递到任何队列。
流程:消息发送到Exchanges(交换机),Exchanges把消息发到绑定的队列,消费者获取队列消息。
四种Exchanges类型:direct, topic, headers and fanout
发布订阅用的交换机类型为fanout
4、路由
Routing
交换机类型:direct
直接交换背后的路由算法很简单 - 消息进入队列,其 绑定密钥与消息的路由密钥完全匹配。
5、主题
交换机类型:topic
发送到主题交换的消息不能具有任意 routing_key - 它必须是由点分隔的单词列表。单词可以是任何内容,但通常它们指定与消息相关的一些功能。一些有效的路由密钥示例:“ stock.usd.nyse ”,“ nyse.vmw ”,“ quick.orange.rabbit ”。路由密钥中可以包含任意数量的单词,最多可达255个字节。
绑定密钥也必须采用相同的形式。主题交换背后的逻辑 类似于直接交换- 使用特定路由密钥发送的消息将被传递到与匹配绑定密钥绑定的所有队列。但是,绑定键有两个重要的特殊情况:
- *(星号)可以替代一个单词。
- #(hash)可以替换零个或多个单词。
6、远程过程调用(RPC)
使用RabbitMQ构建RPC系统:客户端和可伸缩的RPC服务器。由于我们没有任何值得分发的耗时任务,我们将创建一个返回Fibonacci数字的虚拟RPC服务。
RPC将这样工作:
对于RPC请求,客户端发送带有两个属性的消息: replyTo,设置为仅为请求创建的匿名独占队列;以及correlationId,设置为每个请求的唯一值。
请求被发送到rpc_queue队列。
RPC worker(aka:server)正在等待该队列上的请求。当出现请求时,它会执行该作业,并使用来自replyTo字段的队列将带有结果的消息发送回客户端。
客户端等待回复队列上的数据。出现消息时,它会检查correlationId属性。如果它与请求中的值匹配,则返回对应用程序的响应。