本项目基于Spring boot的AMQP模块,整合流行的开源消息队列中间件rabbitMQ,实现一个向rabbitMQ

  • 在业务逻辑的异步处理,系统解耦,分布式通信以及控制高并发的场景下,消息队列有着广泛的应用。本项目基于Spring的AMQP模块,整合流行的开源消息队列中间件rabbitMQ,实现一个向rabbitMQ添加和读取消息的功能。并比较了两种模式:生产者-消费者模式和发布-订阅模式的区别。AMQP作为比JMS更加高级的消息协议,支持更多的消息路由和消息模式。

  • 包含的特性如下:

输入图片说明

  1. 如上图,生产者消费者模型:添加了一个队列,并创建了两个消费者用于监听队列消息,我们发现,当有消息到达时,两个消费者会交替收到消息。这一过程虽然不用创建交换机,但会使用默认的交换机,并用默认的直连(default-direct)策略连接队列;

下面来看具体真使用:

1.安装,关于安装之前已经介绍过了,有兴趣的话,可以参考之前的文章:

PHP安装rabbitmq扩展_php 按照rabbitmq 扩展-CSDN博客

不过使用的是php版本的,原理上是一样的。

安装好之后我们打开后台:

 1.yml文件配置rabbitmq:

server.port=8081
logging.path=D:/
logging.level.boot.spring=DEBUG
spring.application.name=spring-boot-rabbitmq
spring.rabbitmq.host=192.168.33.10
spring.rabbitmq.port=5672
spring.rabbitmq.username=test
spring.rabbitmq.password=test123

pom文件添加依赖:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId><version>1.5.10.RELEASE</version></dependency>

生产者:

@Transactional
@Service("producer")
public class ProducerImpl implements Producer{@AutowiredRabbitTemplate rabbitTemplate;public void sendMail(String queue,Mail mail) {rabbitTemplate.setQueue(queue);rabbitTemplate.convertAndSend(queue,mail);}}

 消费者:

@Configuration
public class ProducerConsumerConfig {@Beanpublic Queue myQueue() {Queue queue=new Queue("myqueue");return queue;}}

将队列绑定到交换机:

@Configuration
public class DirectExchangeConfig {@Beanpublic DirectExchange directExchange(){DirectExchange directExchange=new DirectExchange("direct");return directExchange;}@Beanpublic Queue directQueue1() {Queue queue=new Queue("directqueue1");return queue;}//将交换机和相应队列连起来@Beanpublic Binding bindingorange(){Binding binding=BindingBuilder.bind(directQueue1()).to(directExchange()).with("orange");return binding;}
}

写个控制器:

@Controller
public class RabbitMQController {@AutowiredProducerImpl producer;@AutowiredPublisherImpl publisher;@RequestMapping(value="/produce",produces = {"application/json;charset=UTF-8"})@ResponseBodypublic void produce(@ModelAttribute("mail")Mail mail) throws Exception{producer.sendMail("myqueue",mail);}}

 通过监听器来监听消费:

@Component
public class DirectListener1 {@RabbitListener(queues = "directqueue1")public void displayMail(Mail mail) throws Exception {System.out.println("directqueue1队列监听器1号收到消息"+mail.toString());}
}

启动项目:我们来调用一下:

 看到队列的消费情况:

上篇文章介绍 rocketmq,这2种消息队列在实际应用中都等起道会很好的作用,但在实际应中,rocketmq使用java语言开发的,跨平台比较好。rabbitmq 架构设计简单,在一般的轻量级的服务用用中,可能会比较好些。官方的对比也给了说明:

适用于易用性和灵活性要求较高的场景

1、应用场景

  • 异步任务处理:RabbitMQ提供可靠的消息传递机制,适用于处理异步任务,例如将耗时的任务放入消息队列中,然后由消费者异步处理,提高系统的响应速度和可伸缩性。
  • 解耦系统组件:通过使用RabbitMQ作为消息中间件,不同的系统组件可以通过消息进行解耦,实现松耦合的架构,提高系统的可维护性和灵活性。
  • 事件驱动架构:RabbitMQ的发布-订阅模式可以用于构建事件驱动架构,将系统中的事件作为消息发布到相应的主题,不同的消费者可以订阅感兴趣的主题进行相应的处理。

2.RocketMQ:

适用于大规模数据处理和高吞吐量的场景

  • 分布式事务:RocketMQ支持分布式事务消息,适用于涉及多个业务系统的分布式事务场景,确保消息的一致性和可靠性,同时提供高吞吐量的消息传递能力。
  • 实时日志处理:由于RocketMQ具备高吞吐量和低延迟的特点,可以用于实时日志处理,例如日志收集和分析、日志聚合等场景。

2、服务架构

  • RabbitMQ

  1. Channel(通道):Channel是RabbitMQ与应用程序之间的虚拟连接。通过在物理连接(connection)上创建多个通道,应用程序可以并发地进行消息传递操作。通道负责发送和接收消息,并执行一些与消息相关的操作,如声明队列、定义交换机和绑定等。通道可以看作是轻量级的会话,通过一个物理连接与RabbitMQ进行交互。
  2. Exchange(交换机):交换机是消息的接收和转发中心。当消息发送到RabbitMQ时,会通过交换机进行路由。交换机根据其类型和绑定规则,将消息路由到一个或多个队列中。常见的交换机类型包括直连交换机(direct)、主题交换机(topic)、扇形交换机(fanout)和头部交换机(headers)。
  3. Queue(队列):队列是RabbitMQ用于存储消息的缓冲区。当消息无法立即路由到消费者时,会被存储在队列中,等待消费者来获取和处理。每个队列都有一个唯一的名称,并且按照FIFO(先进先出)的顺序进行消息的投递和消费。
  4. Virtual Host(虚拟主机):虚拟主机是逻辑上的隔离环境,用于将RabbitMQ服务器划分为多个独立的部分。每个虚拟主机都有自己的交换机、队列、绑定和权限设置。虚拟主机可以帮助不同应用程序或服务之间进行隔离,并提供安全性和资源管理的控制。
  5. Broker(代理):Broker是RabbitMQ消息队列服务器的实例,负责接收、存储和路由消息。它充当中间人的角色,将生产者发送的消息传递给消费者。一个RabbitMQ实例可以包含多个Broker,每个Broker可以承载多个虚拟主机和队列。

  • RocketMQ

  1. NameServer(命名服务器):NameServer是RocketMQ的命名服务组件,用于管理和提供Broker的路由信息。它充当元数据的中心,负责维护Broker的注册信息、Topic的路由信息等。Producer和Consumer在发送和接收消息之前,需要与NameServer进行交互以获取正确的Broker信息。
  2. Controller(控制器):Controller是RocketMQ的控制器组件,负责协调和管理整个RocketMQ集群的工作。它监控Broker的状态变化,处理集群的扩容和缩容,进行负载均衡等操作。Controller是RocketMQ集群的核心组件之一,确保集群的可靠运行和自动化管理。
  3. Broker(代理):Broker是RocketMQ的消息存储和处理节点。它负责接收来自Producer的消息,并将其存储在磁盘上。Broker还负责处理Consumer的消息拉取请求,并将消息推送给Consumer进行消费。一个RocketMQ集群可以包含多个Broker,每个Broker负责存储一部分Topic的消息数据。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

osg LOD节点动态调度

1、LOD节点 LOD&#xff08;level of detail&#xff09;&#xff1a;是指根据物体模型的结点在显示环境中所处的位置和重要度&#xff0c;决定物体渲染的资源分配&#xff0c;降低非重要物体的面数和细节度&#xff0c;从而获得高效率的渲染运算。在OSG的场景结点组织结构中&…

mongoose学习记录

mongoose安装和连接数据库 npm i mongoose导入mongoose const mongoose require(mongoose) mongoose.set("strictQuery",true)连接数据库 mongoose.connect(mongodb:127.0.0.1:27017/test)设置回调 mongoose.connection.on(open,()>{console.log("连接成…

规则引擎专题---3、Drools组成和入门

Drools概述 drools是一款由JBoss组织提供的基于Java语言开发的开源规则引擎&#xff0c;可以将复杂且多变的业务规则从硬编码中解放出来&#xff0c;以规则脚本的形式存放在文件或特定的存储介质中(例如存放在数据库中)&#xff0c;使得业务规则的变更不需要修改项目代码、重启…

numpy实现神经网络

numpy实现神经网络 首先讲述的是神经网络的参数初始化与训练步骤 随机初始化 任何优化算法都需要一些初始的参数。到目前为止我们都是初始所有参数为0&#xff0c;这样的初始方法对于逻辑回归来说是可行的&#xff0c;但是对于神经网络来说是不可行的。如果我们令所有的初始…

手写VUE后台管理系统7 - 整合Less样式

整合LESS 安装使用 Less&#xff08;Leaner Style Sheets&#xff09;&#xff0c;是一门向后兼容的 CSS 扩展语言。 Less 官网&#xff1a;https://less.bootcss.com/ 安装 yarn add less安装完成就可以直接使用了 使用 以文件形式定义全局样式 在 assets 目录下创建 less …

基于卷积神经网络的肺炎影像分类分割智能诊断系统

1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 研究背景与意义&#xff1a; 肺炎是一种常见的呼吸系统感染疾病&#xff0c;其主要病因包括细菌、病毒和真菌等。肺炎的早期诊断对于患者的治疗和预后至关重要。传统的肺炎诊断方…

打造个性化github主页 一

文章目录 概述创建仓库静态美化GitHub 统计信息卡仓库 GitHub 额外图钉仓库 热门语言卡仓库 GitHub 资料奖杯仓库 GitHub 活动统计图仓库 打字特效添加中文网站统计仓库 总结 概述 github作为全球最大的代码托管平台&#xff0c;作为程序员都多多少少&#xff0c;都使用过他。…

【排序】直接插入排序和希尔排序

目录 一、排序思想 1、直接插入排序 2、希尔排序 二、代码实现 三、性能比较 四、排序总结 1、直接插入排序 2、希尔排序 一、排序思想 1、直接插入排序 基本思想&#xff1a;把待排序的序列选取一个整数逐个插入到已经排好的有序序列中&#xff0c;直到所有整数都插入…

智加科技获全国首张重卡无人驾驶开放道路测试牌照

2023年12月1日&#xff0c;智加科技获得苏州市智能网联汽车无人化测试牌照。该牌照也是江苏省及国内首张无人重卡开放高速公路全路段全场景全息路网&#xff08;S17苏台高速&#xff09;道路测试牌照。 该重卡无人驾驶开放道路测试牌照&#xff0c;经由苏州市智能网联汽车联席小…

图书整理II(两个栈实现队列)

目录 贼相似题目&#xff1a; 本题题目&#xff1a; 我们直接看题解吧&#xff1a; 审题目事例提示&#xff1a; 解题分析&#xff1a; 解题思路&#xff1a; 代码实现&#xff1a; 代码补充说明&#xff1a; 力扣题目地址&#xff1a; LCR 125. 图书整理 II - 力扣&#xff0…

基于深度学习面向中医诊断的舌象图像分割系统

1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 研究背景与意义 中医舌诊是通过观察舌的各种特征来了解人体的健康状况&#xff0c;从而对各种疾病做出诊断及病情评估&#xff0c;是传统中国医学应用最广、最有价值的诊法之一。…

如何在没有备份的情况下从 Android 手机恢复已删除的数据

电话数据对我们至关重要。我们可以更换我们使用的设备&#xff0c;但不能更换我们的数据。我们以前一直使用CD、USB 和硬盘来保存数据。随着技术的出现&#xff0c;我们遇到了云存储。我们可以随时随地、任意次数地访问存储。所有操作系统都有数据云&#xff0c;可以用来保存图…

docker容器内部文件挂载主机

docker images执行该命令可以发现一个centos镜像 docker run --namemycentos -itd --privilegedtrue --restartalways -p 88:80 -v C:\Users\Administrator\Desktop\dockerTest:/bin/gh:ro centosdocker run 命令用于在 Docker 上创建和运行容器。 --namemycentos 指定容器…

【面试HOT200】回溯篇

系列综述&#xff1a; &#x1f49e;目的&#xff1a;本系列是个人整理为了秋招面试的&#xff0c;整理期间苛求每个知识点&#xff0c;平衡理解简易度与深入程度。 &#x1f970;来源&#xff1a;材料主要源于【CodeTopHot300】进行的&#xff0c;每个知识点的修正和深入主要参…

PAD平板签约投屏软件要如何选

又是一年年底了&#xff0c;年会开始多起来了&#xff0c;许多会务公司或活动公司会接到很多平板签约投屏业务&#xff0c;如年会中的签军令状、业绩保证书等。这时就面临选购一套签约投屏软件了。 目前的签约投屏软件&#xff0c;大多以H5做的网页版的多&#xff0c;但我建议…

Web安全漏洞分析-XSS(中)

随着互联网的迅猛发展&#xff0c;Web应用的普及程度也愈发广泛。然而&#xff0c;随之而来的是各种安全威胁的不断涌现&#xff0c;其中最为常见而危险的之一就是跨站脚本攻击&#xff08;Cross-Site Scripting&#xff0c;简称XSS&#xff09;。XSS攻击一直以来都是Web安全领…

实战系统玩转OpenGL和AI,助力实现各种高级酷炫视频特效几个技巧

随着计算机图形学和人工智能的发展&#xff0c;通过将OpenGL和AI相结合&#xff0c;我们可以实现各种令人印象深刻的高级酷炫视频特效。本文将介绍几个技巧&#xff0c;帮助您在实践中更好地应用这些技术&#xff0c;并附上相应的源码。 火焰效果: 利用OpenGL的纹理映射和着色器…

LLM:《第 3 部分》从数学角度评估封闭式LLM的泛化能力

一、说明 在 OpenAI 或 Anthropic 等封闭式大型语言模型 (LLM) 领域&#xff0c;对智能和多功能性的真正考验在于它们处理高特异性查询并在响应中表现出独特性的能力。在这篇博客中&#xff0c;我的目标是提供测试这些模型泛化能力的机制。 封闭式LLM意味着您不知道训练语料库的…

【java智慧工地源码】智慧工地物联网云平台,实现现场各类工况数据采集、存储、分析与应用

“智慧工地整体方案”以智慧工地物联网云平台为核心&#xff0c;基于智慧工地物联网云平台与现场多个子系统的互联&#xff0c;实现现场各类工况数据采集、存储、分析与应用。通过接入智慧工地物联网云平台的多个子系统板块&#xff0c;根据现场管理实际需求灵活组合&#xff0…

SSM SpringBoot vue社团事务管理系统

SSM SpringBoot vue社团事务管理系统 系统功能 登录 个人中心 人员信息管理 考勤信息管理 空闲时间管理 现金日记账管理 经费预算管理 物品租借管理 会议信息管理 活动信息管理 项目任务管理 公告通知管理 物资信息管理 开发环境和技术 开发语言&#xff1a;Java 使用框架:…