SpringAMQP - 发布订阅模式

news/2023/6/9 20:08:11

目录

发布订阅介绍

FanoutExchange简介

FanoutExchange案例

常见小问题

DirectExchange简介

DirectExchange案例

常见小问题

TopicExchange简介

TopicExchange案例


  • 发布订阅介绍

  • 发布(Publish)、订阅(Subscribe)
  • 发布订阅模式与之前案例的区别就是允许将同一消息发送给多个消费者
  • 实现方式是加入了exchange(交换机)
  • Exchange:交换机
  • 一方面,接收生产者发送的消息
  • 另一方面,知道如何处理消息
  • 例如递交给某个特别队列、递交给所有队列、或是将消息丢弃
  • 到底如何操作,取决于Exchange的类型
  • 常见exchange类型包括:
    • Fanout:广播,将消息交给所有绑定到交换机的队列
    • Direct:路由,把消息交给符合指定routing key 的队列
    • Topic:话题,把消息交给符合routing pattern的队列
  • 注意:exchange负责消息路由,而不是存储,路由失败则消息丢失
  • FanoutExchange简介

  • 在广播模式下,消息发送流程是这样的:
    • 可以有多个队列
    • 每个队列都要绑定到 Exchange(交换机)
    • 生产者发送的消息,只能发送到交换机,交换机来决定要发给哪个队列,生产者无法决定
    • 交换机把消息发送给绑定过的所有队列
    • 订阅队列的消费者都能拿到消息
  • FanoutExchange案例

  • 利用SpringAMQP演示FanoutExchange的使用
  • 实现思路如下:
  • 1.在consumer服务中,利用代码声明队列、交换机,并将两者绑定
  • 2.在consumer服务中,编写两个消费者方法,分别监听fanout.queue1和fanout.queue2
  • 3.在publisher中编写测试方法,向icpc.fanout发送消息
  • 步骤1:在consumer服务声明Exchange、Queue、Binding
  • 步骤2:在consumer服务声明两个消费者
  • 在consumer服务的SpringRabbitListener类中添加两个方法
  • 分别监听fanout.queue1和fanout.queue2

  • 步骤3:在publisher服务发送消息到FanoutExchange
  • 在publisher服务的SpringAmqpTest类中添加测试方法

  • 测试成功

  • 常见小问题

  • 交换机的作用是什么?
    • 接收publisher发送的消息
    • 将消息按照规则路由到与之绑定的队列
    • 不能缓存消息,路由失败,消息丢失
    • FanoutExchange的会将消息路由到每个绑定的队列
  • 声明队列、交换机、绑定关系的Bean是什么?
    • Queue
    • FanoutExchange
    • Binding
  • DirectExchange简介

  • 在Fanout模式中,一条消息,会被所有订阅的队列都消费
  • 但是,在某些场景下,我们希望不同的消息被不同的队列消费
  • 这时就要用到Direct类型的Exchange
  • Direct Exchange 会将接收到的消息根据规则路由到指定的Queue,因此称为路由模式(routes)
  • 在Direct模型下:
    • 队列与交换机的绑定,不能是任意绑定了,而是要指定一个RoutingKey(路由key)
    • 消息的发送方在向 Exchange 发送消息时,也必须指定消息的 RoutingKey
    • Exchange不再把消息交给每一个绑定的队列,而是根据消息的Routing Key进行判断,只有队列的Routingkey与消息的 Routing key 完全一致,才会接收到消息
  • DirectExchange案例

  • 利用SpringAMQP演示DirectExchange的使用
  • 实现思路如下:
  • 1.利用@RabbitListener声明Exchange、Queue、RoutingKey
  • 2.在consumer服务中,编写两个消费者方法,分别监听direct.queue1和direct.queue2
  • 3.在publisher中编写测试方法,向icpc.direct发送消息
  • 步骤1:在consumer服务声明Exchange、Queue
  • 1.在consumer服务中,编写两个消费者方法,分别监听direct.queue1和direct.queue2
  • 2.并利用@RabbitListener声明Exchange、Queue、RoutingKey
  • 步骤2:在publisher服务发送消息到DirectExchange
  • 在publisher服务的SpringAmqpTest类中添加测试方法:

  • 测试成功

  • 常见小问题

  • 描述下Direct交换机与Fanout交换机的差异?
    • Fanout交换机将消息路由给每一个与之绑定的队列
    • Direct交换机根据RoutingKey判断路由给哪个队列
    • 如果多个队列具有相同的RoutingKey,则与Fanout功能类似
  • 基于@RabbitListener注解声明队列和交换机有哪些常见注解?
    • @Queue
    • @Exchange
  • TopicExchange简介

  • Topic类型的Exchange与Direct相比
  • 都是可以根据RoutingKey把消息路由到不同的队列
  • 只不过Topic类型Exchange可以让队列在绑定Routing key 的时候使用通配符
  • #:匹配一个或多个词
  • *:匹配1个词
  • 举例:
  • icpc.#:能够匹配icpc.spu.insert 或者 icpc.spu
  • icpc.*:只能匹配icpc.spu
  • TopicExchange案例

  • 利用SpringAMQP演示TopicExchange的使用
  • 实现思路如下:
  • 1.并利用@RabbitListener声明Exchange、Queue、RoutingKey
  • 2.在consumer服务中,编写两个消费者方法,分别监听topic.queue1和topic.queue2
  • 3.在publisher中编写测试方法,向icpc.topic发送消息
  • 步骤1:在consumer服务声明Exchange、Queue
  • 1.在consumer服务中,编写两个消费者方法,分别监听topic.queue1和topic.queue2
  • 2.并利用@RabbitListener声明Exchange、Queue、RoutingKey
  • 步骤2:在publisher服务发送消息到TopicExchange
  • 在publisher服务的SpringAmqpTest类中添加测试方法:

  • 测试成功

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.exyb.cn/news/show-4566082.html

如若内容造成侵权/违法违规/事实不符,请联系郑州代理记账网进行投诉反馈,一经查实,立即删除!

相关文章

vscode:snippet基本使用方法

ctrlshiftp然后输入snippet, 选择configure user snippets.然后会让你选择语言,我这里选择govscode会建立一个go.json编辑方式就看我下面的示例吧.//输入pln拿到fmt.Println(), "pln":{ //snippet的名称,用来唯一标识snippet"prefix":"pln", //要…

删除VSCode 中自定义的snippets

snippets 在vscode中的自定义一个snippets是一个非常睿智的选择,可以帮我们节省大量的时间。具体操作非常简单,随意百度即可。这边记录一下如何删除的问题。 删除自定义的snippets 当我们新建一个snippets后,它就会一直保存在你的电脑里&a…

Vim 自定义补全利器 Snippet

Vim Snippet 设置 本人是 vim 用户,可以说能不用 IDE 就不用 IDE。 Snippet 是一种支持用户自定义补全的需求,在 vim 中,可以使用 UltiSnips 和 Vim-Snippets 两个插件进行补全。UltiSnips 类似于一个替换引擎,本身是没有任何补全…

vsCode配置用户代码片段

前言:小伙伴们是不是经常看到别人写代码的时候特别迅速,输入几个字母按下enter键就会出现一堆已经写好的代码,那你知道这是怎么实现的吗?接下来可以尝试按照下面的步骤进行配置,会让你写代码事半功倍哟!先演…

OPENCV例子\samples\cpp\tutorial_code\ImgProc\changing_contrast_brigh的代码分析

该changing_contrast_brigh示例的主要内容为改变图片的对比度和亮度,主要过程: 通用图像处理运算符是获取一个或多个输入图像并生成输出图像的函数 图像变换可以看作是: 点运算符(像素变换) 邻域(基于区域的&#…

Objective C 常用代码片段制作(code snippet library)

最近发现了一个比较好的东西,就是XCode提供的一个片段制作工具(code snippet library),主要作用就是可以省去我写一些经常使用的代码的麻烦 比如我经常使用的注释,实例化对象等的一些代码 下面我就介绍一下这个怎么使…

Xcode自定义代码块

代码块在iOS开发过程中&#xff0c;使用频率相当高&#xff0c;每个人都是用过&#xff0c;比如UIView的初始化方法之一&#xff1a;- (instancetype)init {self [super init];if (self) {<#statements#>}return self; } 代码块是能够被重复使用代码&#xff0c;制作成…

8 个有用的JavaScript中的数组函数(附代码片段)

英文 | https://javascript.plainenglish.io/8-useful-array-functions-in-javascript-with-code-snippets-b8d5222bcab翻译 | 杨小二JavaScript 从一开始就有数组。这是一个非常有用的对象类型&#xff0c;它允许我们创建一个我们想要的任何类型的元素列表。子数组、购物清单或…