如何提升网站收录/百度一下百度
目录
1.MQ选型
2.RocketMQ基本架构
3.Springboot集成RocketMQ
4.顺序消息
5.延时消息
6.事务消息
1.MQ选型
目前市面上的MQ选型:主要分为3个类型
- Kafka:吞吐量大,且性能好,集群高可用;会丢失数据,功能较为单一(即场景单一,适合于数据量大且频繁,如日志分析等)
- RabbitMQ:消息可靠性高,功能全面;吞吐量较低,并发性能不高,消息积累会严重影响性能(即消息消费需较快)
- RocketMQ:高吞吐、高性能、高可用;官方文档及周边生态不成熟,客户端只支持java。
简而言之,Apache RocketMQ 自诞生以来,因其架构简单、业务功能丰富、具备极强可扩展性等特点被众多企业开发者以及云厂商广泛采用。
2.RocketMQ基本架构
RocketMQ的基本架构如下图所示:
Producer,生产者:消息的生产者,一般为上游系统。
Topic,主题:消息传输和存储的顶层容器,用于标识同一类业务逻辑的消息。 主题的作用主要如下:(1)定义数据的分类隔离:将不同业务类型的数据拆分到不同的主题中管理,通过主题实现存储的隔离性和订阅隔离性。(2)定义数据的身份和权限:由于消息本身是匿名无身份的,同一分类的消息使用相同的主题来做身份识别和权限管理。
Queue,队列:队列是 RocketMQ 中消息存储和传输的实际容器,也是 RocketMQ 消息的最小存储单元。 RocketMQ 的所有主题都是由多个队列组成,以此实现队列数量的水平拆分和队列内部的流式存储。
Subscription,订阅关系:订阅关系是 RocketMQ 系统中消费者获取消息、处理消息的规则和状态配置。订阅关系由消费者分组动态注册到服务端系统,并在后续的消息传输中按照订阅关系定义的过滤规则进行消息匹配和消费进度维护。通过配置订阅关系,可控制如下传输行为:(1)消息过滤规则:用于控制消费者在消费消息时,选择主题内的哪些消息进行消费。(2)消费状态:RocketMQ 服务端默认提供订阅关系持久化的能力,即消费者分组在服务端注册订阅关系后,当消费者离线并再次上线后,可以获取离线前的消费进度并继续消费。
ConsumerGroup,消费者分组:消费者分组是 RocketMQ 系统中承载多个消费行为一致的消费者的负载均衡分组。同一分组下的多个消费者将按照分组内统一的消费行为和负载均衡策略消费消息。
Comsumer,消费者:消息的消费者,即对消息进行接收和处理的相关下游系统。
一般来说,在RocketMQ中,生产者生产出消息后,指定对应的Topic、订阅关系(Tags参数)、队列(hashkey参数)后,将消息发送至RocketMQ客户端;消费者对RocketMQ客户端进行监听,当监听到有自己订阅的Topic下的消息时,进行接收并进行消费。
3.Springboot集成RocketMQ
首先,引入相关依赖:
<dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-spring-boot-starter</artifactId><version>2.1.0</version></dependency>
其次,对RocketMQ进行配置:
server:port: 8080spring:application:name: cloud-rocket-mqrocketmq:name-server: 127.0.0.1:9876producer:group: test-group #生产者组名,规定在一个应用里面必须唯一send-message-timeout: 5000 #消息发送的超时时间,单位msretry-times-when-send-async-failed: 5 #异步消息发送失败重试的次数
RocketMQ支持我们异步发送普通消息。
普通消息是指:上游系统(生产者)将用户下单支付这一业务事件封装成独立的普通消息并发送至Apache RocketMQ服务端,下游按需从服务端订阅消息并按照本地消费逻辑处理下游任务。每个消息之间都是相互独立的,且不需要产生关联。
(1)生产者代码编写:
@Slf4j
@RestController
public class SendMessageController {@Resourceprivate RocketMQTemplate rocketMQTemplate;@PostMapping("/send")public void send(@RequestParam("message") String message) throws InterruptedException {//发送异步消息,参数:topic、消息rocketMQTemplate.convertAndSend("topic_test:tagA",message+"tagA");rocketMQTemplate.convertAndSend("topic_test:tagB",message+"tagB");log.info("已发送异步消息");}
}
(2)消费者代码编写:
@Service
@Slf4j
@RocketMQMessageListener(topic = "topic_test", consumerGroup = "consumer_topic_test",selectorExpression = "tagA || tagC")
public class MessageConsumer implements RocketMQListener<String> {@Overridepublic void onMessage(String s) {log.info("收到消息:"+s);}
}
(3)代码逻辑:
在生产者端,我们发送了一个消息到 topic_test 这一Topic下,并指定tagA订阅规则下的消费者组可以进行消费。
在消费者端,我们定义其消费者组名称,订阅关系为:订阅 topic_test 下的 tagA 或者 tagB消息,并进行消费。
可以看到,消费者成功监听到 topic_test:tagA 下的消息。
4.顺序消息
RocketMQ中可以发送顺序消息,即支持消费者按照发送消息的先后顺序获取消息,从而实现业务场景中的顺序处理。 相比其他类型消息,顺序消息在发送、存储和投递的处理过程中,更多强调多条消息间的先后顺序关系。
如上图所示,在分布式系统中,我们有多个生产者,执行同一套代码,顺序消息可以保证系统按照多个生产者发出消息的前后顺序,进行顺序消费,如:以证券、股票交易撮合场景为例,对于出价相同的交易单,坚持按照先出价先交易的原则,下游处理订单的系统需要严格按照出价顺序来处理订单。
代码:
//发送顺序消息,参数:topic,消息,hashkey,相同hashkey发送至同一个队列
rocketMQTemplate.syncSendOrderly("topic_test:tagA", MessageBuilder.withPayload("消息编号" + 1).build(),"queue");
rocketMQTemplate.syncSendOrderly("topic_test:tagA", MessageBuilder.withPayload("消息编号" + 2).build(),"queue");
5.延时消息
即消息被发送至服务端后,在指定时间后才能被消费者消费。通过设置一定的定时时间可以实现分布式场景的延时调度触发效果。以电商交易场景为例,订单下单后暂未支付,此时不可以直接关闭订单,而是需要等待一段时间后才能关闭订单。使用 RocketMQ 定时消息可以实现超时任务的检查触发。
代码:
//发送延时消息
rocketMQTemplate.syncSend("topic_test:tagA", MessageBuilder.withPayload(message).build(), 3000, 2);
其中,第四个参数为延时级别,分为1-18:1、5、10、30、1m、2m、3m、...10m、20m、30m、1h、2h
6.事务消息
分布式系统调用的特点为一个核心业务逻辑的执行,同时需要调用多个下游业务进行处理。因此,如何保证核心业务和多个下游业务的执行结果完全一致,是分布式事务需要解决的主要问题。
事务消息就是在普通消息基础上,支持二阶段的提交能力。将二阶段提交和本地事务绑定,实现全局提交结果的一致性。
简单来说就是,保证本地事务执行成功,消费者才会接受消息进行消费。
执行过程:
代码:
(1)生产者:
@RequestMapping("/send/transaction")public void sendTransactionMessage(@RequestParam("msg") String msg){//发送事务消息:采用的是sendMessageInTransaction方法,返回结果为TransactionSendResult对象,该对象中包含了事务发送的状态、本地事务执行的状态等//参数一:topic;参数二:消息TransactionSendResult result = rocketMQTemplate.sendMessageInTransaction("topic_test:tagA", MessageBuilder.withPayload(msg).build(),null);//发送状态String sendStatus = result.getSendStatus().name();//本地事务执行状态String localState = result.getLocalTransactionState().name();log.info("发送状态:"+sendStatus+";本地事务执行状态"+localState);}
(2)消费者端代码和上文相同,保持不变。
(3)本地事务:
/*** 生产者消息监听器:* 用于监听本地事务执行的状态和检查本地事务状态。* @author qzz*/
@RocketMQTransactionListener
@Slf4j
public class TransactionMsgConfig implements RocketMQLocalTransactionListener {/*** 执行本地事务(在发送消息成功时执行)* @param message* @param o* @return commit or rollback or unknown*/@Overridepublic RocketMQLocalTransactionState executeLocalTransaction(Message message, Object o) {try {//处理业务String jsonStr = new String((byte[]) message.getPayload(), StandardCharsets.UTF_8);log.info("执行本地业务,消息为:"+jsonStr);//模拟网络波动//Thread.sleep(35000);//被除数为0,模拟业务出错//int a = 10/0;}catch (Exception e){log.error("事务执行出错:"+e.getMessage());//返回ROLLBACK状态,进行回滚return RocketMQLocalTransactionState.ROLLBACK;}log.info("事务提交,消息正常处理");//返回COMMIT状态的消息会立即被消费者消费到return RocketMQLocalTransactionState.COMMIT;}/*** 检查本地事务的状态* @param message* @return*/@Override//超时、事务状态unknown等会调用该方法public RocketMQLocalTransactionState checkLocalTransaction(Message message) {log.info("消息回查");return RocketMQLocalTransactionState.ROLLBACK;}
}
我们需要编写一个本地事务执行类继承 RocketMQLocalTransactionListener 类。
在该类中我们对本地事务的异常进行捕捉,如果出现异常,则返回 ROLLBACK执行状态,顺利执行,则最终返回 COMMIT状态。
如果出现超时等网络波动或是UNKNOWN状态等情况,该类则会调用 checkLocalTransaction方法,返回方法中定义的事务状态。
(4)执行:
1.顺利执行,消费者成功消费:
可以看到,消息成功发送,消费者成功消费。
2.本地事务出现异常:
可以看到,本地事务抛出了异常,事务进行了回滚,消费者没有进行消费。
3.模拟超时
可以看到,当事务在一段时间内未返回对应事务状态 ,则会调用对应回查方法,直至事务成功返回事务执行状态。
相关文章:

Springboot集成RocketMQ——简单使用
目录 1.MQ选型 2.RocketMQ基本架构 3.Springboot集成RocketMQ 4.顺序消息 5.延时消息 6.事务消息 1.MQ选型 目前市面上的MQ选型:主要分为3个类型 Kafka:吞吐量大,且性能好,集群高可用;会丢失数据,功…...

第一百二十四回 Flexible组件
文章目录 概念介绍使用方法示例代码 我们在上一章回中介绍了扩展内容相关的知识,本章回中将介绍 Flexible组件.闲话休提,让我们一起Talk Flutter吧。 概念介绍 我们在前面章回中介绍了扩展列表相关的内容,当页面中其它组件和扩展列表一起使…...

关于stm32推挽带有上下拉电阻的思考、IO口驱动能力是什么
1、发现推挽带有上下拉电阻 1.1、stm32手册 记忆中推挽是不需要上下拉的,没关注过,但是我真的理解上下拉吗,下图来自stm32f4的中文版和英文版的数据手册,没有翻译错,就是“推挽带有上下拉的能力”。 1.2、查找相关信…...

考研408 | 【操作系统】 内存管理
内存的基础 内存和内存的作用: 几个常用的数量单位: 指令的工作原理: 问题:如何将指令中的逻辑地址转换为物理地址? 解决办法:装入的三种方式 1.绝对装入 2.可重定位装入 3.动态重定位 从写程序到程…...

C# 工厂模式
一、概述 工厂模式(Factory Pattern)是一种创建型设计模式,它提供了一种创建对象的最佳方式。在C#中,工厂模式通过定义一个公共接口或抽象类来创建对象,而具体的对象创建则由工厂类来实现。 工厂模式主要包含三个角色…...

在云服务器上安装Jenkins
说明:Jenkins是一个部署项目的平台,通过Jenkins可以省去从项目开发–>部署项目之间的所有流程,做到代码提交即上线。本文介绍在云服务CentOS上安装Jenkins。 前提 安装Jenkins之前,先要在云服务上安装JDK、Maven、Git&#x…...

一文了解SpringBoot中的IOC
目录 1.什么是IOC 2.IOC容器 3.创建IOC容器 4.装配Bean到IOC容器 5.依赖注入 1.什么是IOC IOC:Inversion of Control 控制反转 Sping中我们把一个个对象称为Bean,以前我们实例一个对象的时候,都会直接New一个 而在Spring中࿰…...

docker-compose管理创建LNMP服务并运行Wordpress网站平台
文章目录 一.项目环境1. 环境描述2.项目需求 二.部署过程1.安装Docker2.安装Docker加速器3.Docker-Compose安装部署4.准备依赖文件、配置nginx5.配置mysql6.配置php7.编写docker-compose.yml8.验证 三.容器快照,然后将Docker镜像打包成tar包备…...

【宝藏系列】一文带你梳理 Linux 的五种 IO 模型
【宝藏系列】一文带你梳理 Linux 的五种 IO 模型 文章目录 【宝藏系列】一文带你梳理 Linux 的五种 IO 模型👨🏫前言1️⃣用户态和核心态1️⃣1️⃣用户态和核心态的切换 2️⃣进程切换3️⃣进程阻塞4️⃣文件描述符(fd, File Descriptor)5️⃣缓存I/O…...

【Python】模块、包
模块 Python模块(Module),是一个Python文件,以.py结尾。模块能定义函数,类和变量,模块里也能保护可执行的代码。 不同模块,同名的功能,如果都被导入,那么后者会覆盖前者…...

CMAKE_CUDA_ARCHITECTURES针对Jetson Xavier或者Orin的设置
不同jetson设备对应不同的CMAKE_CUDA_ARCHITECTURES的设置,如下: # TX1, Nano ------ 53 # TX2 ------ 62 # AGX Xavier, NX Xavier ------ 72 # AGX Orin, NX Orin ----…...

sqlite3.OperationalError: unable to open database file解决方法
执行superset时,提示该错误:sqlite3.OperationalError: unable to open database file 由于superset里使用django设置sqlite3数据库。 应该属于django设置sqlite3数据库的问题: OperationalError: unable to open database file 原因 1&a…...
SSL核心概念 SSL类型级别
SSL:SSL(Secure Sockets Layer)即安全套接层,及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS与SSL在传输层对网络连接进行加密。 H…...

器件介绍TMP1826NGRR、TMP1826DGKR、TMP1827NGRR、TMP1075NDRLR数字温度传感器
一、TMP1826 具有 2Kb EEPROM 的 1-Wire、0.2C 精度温度传感器 器件介绍 TMP1826 是一款高精度、1-Wire 兼容的数字输出温度传感器,具有集成的 2Kb EEPROM 和 –55C 至150C 的宽工作温度范围。TMP1826 在 10C 至45C 的温度范围内提供 0.1C(典型值&#…...

抖店必须绑定抖音账号吗?聊6个抖店不为人知的小细节,别外传
我是王路飞。 现在做抖店,比如绑定一个抖音账号吗? 了解过抖店的朋友都知道,之前开通抖音小店,是需要绑定一个抖音号作为店铺的官方账号的。 而且属于硬性规定,必须要绑定,否则店铺无法正常运营。 但是…...

如何搭建智能家居系统并通过内网穿透实现远程控制家中设备
文章目录 前言1. 安装Home Assistant2. 配置Home Assistant3. 安装cpolar内网穿透3.1 windows系统3.2 Linux系统3.3 macOS系统 4. 映射Home Assistant端口5. 公网访问Home Assistant6. 固定公网地址6.1 保留一个固定二级子域名6.2 配置固定二级子域名 前言 Home Assistant&…...

【趣味随笔】手机参数你真的看懂了吗?
📢:如果你也对机器人、人工智能感兴趣,看来我们志同道合✨ 📢:不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 📢:文章若有幸对你有帮助,可点赞 👍…...

微信小程序开发教学系列(4)- 数据绑定与事件处理
4. 数据绑定与事件处理 在微信小程序中,数据绑定和事件处理是非常重要的部分。数据绑定可以将数据和页面元素进行关联,实现数据的动态渲染;事件处理则是响应用户的操作,实现交互功能。本章节将详细介绍数据绑定和事件处理的基本原…...

C++避坑——most vexing parse问题
1."坑"的问题是什么? 先看一段代码: class Functor { public:void operator()(){std::cout << "我是线程的初始函数" << std::endl;} };int main() {std::thread t(Functor());// 强制高速编译器这是一个构造函数!t.j…...

利用lammps模拟蓝宝石在水润滑环境下的抛光
一 问题描述 蓝宝石(Al2O3)由于其独特的晶体结构,优异的物理化学特性,被广泛应用于航空航天等领域。高精尖的应用领域要求蓝宝石具有纳米级的表面粗糙度以及严格可控的亚表面缺陷。影响超精密加工最终性能的因素主要集中在工件表…...

3.BGP状态机和路由注入方式
BGP状态机 BGP路由的生成 不同于IGP路由协议,BGP自身并不会发现并计算产生路由,BGP将GP路由表中的路由注入到BGP路由表中,并通过Update报文传递给BGP对等体。 BGP注入路由的方式有两种: Networkimport-route与IGP协议相同,BGP支持根据已有的路由条目进行聚合,生成聚合路由…...

微信开发之一键创建微信群聊的技术实现
创建微信群 本接口为敏感接口,请查阅调用规范手册创建后,手机上不会显示该群,往该群主动发条消息手机即可显示。 请求URL: http://域名地址/createChatroom 请求方式: POST 请求头Headers: Content-T…...

设计模式二十:观察者模式(Observer Pattern)
定义了一种一对多的依赖关系,允许多个观察者(也称为订阅者)对象同时监听一个主题对象,当主题对象发生变化时,所有依赖于它的观察者都会收到通知并自动更新。 观察者模式的使用场景 观察者模式在许多场景中都可以发挥…...

Linux操作系统--CentOS使用初体验
我们安装好Linux的操作系统之后,下面就可以使用Linux操作系统了。我们一起来看看如何使用。 (1).桌面 我们在进入CentOS操作系统后可以发现一些和Windows操作系统相类似的情况。如:网络、时间显示、以及基本的软件等内容。 --创建文件、文件夹。 (2).操作终端 Linux中的终…...

搭建HAProxy + Keepalived高可用
安装 在四台虚拟机上,我们以如下方式搭建集群: 192.168.115.3 haproxykeepalived 192.168.115.4haproxykeepalived 192.168.115.5 nginx 192.168.115.6 nginx 在192.168.115.3 和192.168.115.4 上安装haproxy和keepalived(haproxy编译安装…...

使用Python爬虫定制化开发自己需要的数据集
在数据驱动的时代,获取准确、丰富的数据对于许多项目和业务至关重要。本文将介绍如何使用Python爬虫进行定制化开发,以满足个性化的数据需求,帮助你构建自己需要的数据集,为数据分析和应用提供有力支持。 1.确定数据需求和采集目…...

java八股文面试[java基础]——接口和抽象类的区别
知识来源: 【基础】接口和抽象类_哔哩哔哩_bilibili 【2023年面试】Java中抽象类和接口有什么区别_哔哩哔哩_bilibili 【23版面试突击】抽象类和接口的区别,类可以继承多个类么,接口可以继承多个接口么,类可以实现多个接口么?_…...

head 请求了解过吗?如何用 get 模拟 head 请求?不需要服务器返回数据,怎么实现?
HEAD请求是HTTP/1.1协议中定义的一个请求方法,与GET请求相似,但只请求目标URL的头部,不请求实际的数据或者说正文内容。其主要用途是: 检查资源是否存在。获取资源的元数据(如响应头中的Content-Length或Last-Modifie…...

Redis笔记——(狂神说)待续
Nosql概述 为什么要用NoSql? 1、单机mysql的年代:90年代,网站访问量小,很多使用静态网页html写的,服务器没压力。 当时瓶颈是:1)数据量太大一个机器放不下。2)数据的索引(BTree),一个机器内存也…...

基于开源IM即时通讯框架MobileIMSDK:RainbowChat-iOS端v7.0版已发布
关于MobileIMSDK MobileIMSDK 是一套专门为移动端开发的开源IM即时通讯框架,超轻量级、高度提炼,一套API优雅支持 UDP 、TCP 、WebSocket 三种协议,支持 iOS、Android、H5、标准Java、小程序、Uniapp,服务端基于Netty编写。 工程…...