Rabbitmq Fanout如何保证不重复消费及应用场景
rabbitmq fanout业务场景,一个交换机对应多个队列,不会重复消费吗
在 RabbitMQ 中,使用 Fanout 类型的交换机时,确实可以将一个交换机绑定到多个队列。每当有消息发布到这个交换机时,交换机会把消息广播到所有绑定的队列。
不会重复消费的原因
-
队列与消费者关系:
- 每个队列都有一个或多个消费者来处理消息。RabbitMQ 确保每条消息只能被同一个队列的一个消费者消费。
- 消息消费是按队列级别的,即每个队列中的消费者在消费时只能消费该队列中的消息,不同队列之间是独立的。
-
广播到多个队列:
- 当一个 Fanout 类型的交换机收到一条消息时,交换机会将该消息广播到所有与之绑定的队列。每个队列都独立维护一份消息副本,消息会按队列分发,而 每个队列 内的消息 只会被一个消费者消费。
- 也就是说,如果有多个队列与该交换机绑定,并且这些队列各自有消费者,那么每个消费者只会从自己所在的队列中取消息进行消费,而不会重复消费其他队列中的消息。
-
不会重复消费的核心原理:
- 假设有一个 Fanout 交换机与多个队列绑定,且每个队列有一个或多个消费者。
- 当交换机广播消息时,每个队列都会得到该消息,但每个队列中的消费者只会从该队列中消费消息,不会跨队列消费。
- 例如,如果有两个队列
queue1
和queue2
,并且每个队列都有一个消费者,那么每个消费者只会消费自己队列的消息,而不会消费其他队列中的消息。
举个例子
假设我们有一个 fanout
类型的交换机,名为 logs
,并且我们绑定了两个队列 queue1
和 queue2
到这个交换机。
-
消息发送:
- 如果向
logs
交换机发送了一条消息,RabbitMQ 会把这条消息广播到queue1
和queue2
。
- 如果向
-
队列消费:
- 假设
queue1
上有一个消费者consumer1
,queue2
上有一个消费者consumer2
。 consumer1
会从queue1
中消费消息,而consumer2
会从queue2
中消费消息。- 每个消费者只会消费自己队列中的消息,因此不会重复消费。
- 假设
总结
- Fanout 交换机是广播消息到所有绑定的队列,每个队列都会接收到一份消息副本。
- 消息 不会在不同的队列间重复消费,而是由各自队列内的消费者独立消费。
- 如果同一个队列有多个消费者,它们会按照队列中的负载均衡机制分摊消费任务,但同一个队列中的消息 只能被一个消费者消费。
所以,Fanout 交换机下的多个队列不会导致消息的重复消费,每个队列独立处理自己的消息
实际业务场景
但是一个消息被同时发送到多个队列中,就算每个队列中只能被一个消费者消费,不还是消费多次吗,请从实际业务场景给出例子吧,比如订单库存
是的,你说得对,如果一个消息被同时发送到多个队列中,每个队列内的消息会被独立消费,确实会出现“同一个消息被多个消费者消费”的情况。这种情况需要根据实际业务场景来设计系统,以确保消息的消费不会造成问题。以下是一个 订单库存管理 的实际业务场景例子来帮助说明:
场景背景:订单库存管理
假设你有一个电商系统,当用户下单后,系统需要做两件事:
- 扣减库存:减少商品库存。
- 创建订单:保存订单信息并做相关处理。
为了实现高可用和高并发,系统将这些操作拆分成两个独立的服务,并且通过消息队列来进行异步处理。你选择使用 RabbitMQ 来传递消息。
业务流程
-
用户下单:
- 用户提交订单时,系统会生成一条订单消息,并将该消息发送到多个队列:
- 一个队列负责处理 扣减库存。
- 另一个队列负责 创建订单。
- 用户提交订单时,系统会生成一条订单消息,并将该消息发送到多个队列:
-
消息发送:
- 订单消息通过 Fanout 类型的交换机广播到两个队列:
order_queue
和stock_queue
。 - 这些队列都绑定到同一个交换机,因此每个队列都会接收到相同的订单消息。
- 订单消息通过 Fanout 类型的交换机广播到两个队列:
-
消息消费:
order_queue
会有一个消费者来处理订单创建的操作。stock_queue
会有另一个消费者来处理库存扣减的操作。
消费者行为
-
order_queue
的消费者:消费者会从order_queue
队列中取出消息并执行 订单创建 操作,保存订单记录到数据库中。 -
stock_queue
的消费者:消费者会从stock_queue
队列中取出消息并执行 库存扣减 操作,更新商品库存。
关键问题:消息重复消费
在这种场景下,同一条订单消息会同时被发送到多个队列,因此 每个队列内的消息都将被独立消费。
这确实会让你产生一个疑问:同一条消息被发送到多个队列后,会不会在消费者中被重复消费,从而导致业务错误(例如扣减库存两次或创建两次订单)?
答案:不会重复消费
虽然每个队列都会收到相同的消息,但 每个队列只会被单独的消费者消费,且每个消费者只会消费自己队列中的消息。例如:
order_queue
的消费者 只负责处理订单创建,而不会去处理库存扣减。stock_queue
的消费者 只负责处理库存扣减,而不会去处理订单创建。
因此,尽管消息在队列之间是广播的,但由于消费者是独立处理不同队列的消息,所以不会导致重复消费 同一条消息,从而避免了逻辑错误。
为什么这样设计?
这种设计的关键在于 解耦和职责分离,这样可以将不同的业务逻辑分开,使得系统具备更好的扩展性和容错性。每个消费者只负责一个独立的任务,避免了一个消费者过载或失败时影响到其他任务。
具体例子
假设有一个用户下单的请求,系统生成一条订单消息 order_msg
:
-
order_msg
被发送到Fanout
交换机,并广播到两个队列:order_queue
(负责创建订单)stock_queue
(负责扣减库存)
-
消息到达两个队列:
order_queue
中的消费者(假设消费者 A)消费该消息并创建订单。stock_queue
中的消费者(假设消费者 B)消费该消息并扣减库存。
-
结果:
- 订单创建操作和库存扣减操作是 独立的,并且各自只处理一个特定的任务。因此,每个队列中的消费者处理的都是各自队列的消息,而不会发生重复消费。
高并发情况下的注意事项
在高并发场景下,虽然一个消息会被发送到多个队列,但由于不同队列的消费者独立工作,每个消费者会处理自己队列中的消息,不会发生重复消费。为了避免在不同队列间出现竞争问题,可能需要在系统设计时考虑:
- 事务性操作:例如在创建订单和扣减库存的过程中,可以使用数据库的事务机制来保证两者的原子性,避免出现只扣减库存但没有创建订单的情况,或反之。
- 幂等性:为了确保即使消息被重复投递或重复处理,系统也能保证业务逻辑的正确性和一致性,通常需要在消费者端做幂等性设计。
总结
虽然在 Fanout 交换机的场景下,每个消息会被广播到多个队列,并且每个队列的消息会被独立消费,但 每个队列的消费者只会消费自己的队列中的消息。因此,消息不会在不同消费者之间重复消费,不会导致库存扣减和订单创建的重复操作。
订单与库存分别是不同的服务,如何做到事务性操作
当订单与库存是不同的服务时,保证两者的事务性操作变得复杂,因为它们通常运行在不同的进程、不同的数据库、甚至不同的物理主机上。在这种微服务架构下,传统的数据库事务(ACID)无法跨服务进行,因此需要采用分布式事务的方案来保证订单创建与库存扣减操作的一致性。
常见的分布式事务解决方案有 两阶段提交(2PC)、TCC(Try-Confirm-Cancel) 和 最终一致性(通过补偿机制)等。对于订单和库存这种场景,通常推荐的方案是通过 消息队列 + 补偿机制 或 Saga模式 来确保最终一致性。
以下是几种常见的实现方法:
1. 基于消息队列 + 补偿机制(最常见的解决方案)
在这个方案中,订单服务和库存服务通过消息队列进行解耦,消息队列提供了异步、可靠的消息传递机制。具体流程如下:
1.1 订单服务和库存服务的操作流程
-
用户下单:
- 订单服务收到用户下单请求后,首先创建订单并生成订单ID。
- 然后,订单服务会将一个“扣减库存”的消息发送到消息队列(例如,RabbitMQ、Kafka 等)。
-
库存服务处理消息:
- 库存服务从消息队列中消费“扣减库存”的消息,进行库存扣减操作。
- 如果库存扣减成功,库存服务将发送一个“扣减库存成功”的消息回给订单服务,表示库存操作成功。
-
订单服务确认库存扣减:
- 订单服务收到“扣减库存成功”的确认消息后,确认订单创建的事务完成,最终提交订单。
-
失败处理:
- 如果库存服务在处理扣减库存时失败(例如,库存不足,或者系统崩溃),可以通过回退机制来补偿之前的订单操作。
- 例如,订单服务可以设置一个 超时回调,如果在规定时间内没有收到库存服务的确认消息,则触发补偿操作(如取消订单或通知用户)。
1.2 补偿机制
补偿机制的核心思想是,当某个操作失败时,通过补偿操作来回滚之前成功的操作。例如,如果库存扣减失败,可以通过回滚库存并取消之前成功创建的订单。
在实际操作中,订单和库存的补偿可以通过以下方式实现:
- 订单补偿:如果库存扣减失败,订单服务可以通过 API 调用回滚订单(例如删除订单或标记为失败)。
- 库存补偿:如果订单未成功提交(例如用户取消订单),库存服务可以通过 API 调用恢复库存。
1.3 如何实现幂等性
为了避免消息重复消费导致的副作用(比如库存扣减两次、订单创建多次),通常需要在消息处理时实现 幂等性。
- 库存服务:可以根据订单ID来判定是否已经处理过该消息。如果已经扣减过库存,则不再重复操作。
- 订单服务:可以通过唯一的订单ID来判断订单是否已经提交,避免重复创建订单。
2. 基于Saga模式
Saga模式是一种分布式事务的模式,适用于微服务架构中的跨服务事务。在Saga模式中,长事务被分解为一系列的局部事务,每个局部事务在执行完后都会发布一个事件或发送消息给下游服务。Saga模式的关键在于 补偿事务,即每个局部事务都有一个相应的补偿操作。
2.1 Saga模式的流程
- Step 1:订单服务收到用户下单请求后,创建订单并保存到数据库,同时发送一条“扣减库存”的消息。
- Step 2:库存服务接收到扣减库存的消息,进行库存扣减。如果扣减成功,则返回确认消息;如果失败,则通过补偿机制发出库存不足的消息。
- Step 3:订单服务收到确认消息后提交订单。如果库存扣减失败,订单服务通过补偿操作回滚订单。
- Step 4:如果库存扣减失败,库存服务会进行补偿操作,比如恢复库存。
2.2 事务补偿
Saga模式的关键在于如何定义补偿操作(即回滚操作)。在我们的场景中,补偿操作可以是:
- 订单补偿:如果库存扣减失败,订单服务需要取消订单操作,可能是删除订单或标记为“失败”。
- 库存补偿:如果订单取消或失败,库存服务需要恢复库存。
3. TCC(Try-Confirm-Cancel)模式
TCC模式也是一种分布式事务的方案,它通过三个操作来保证分布式事务的一致性:
- Try:尝试执行操作,确保资源可用并且锁定资源。
- Confirm:在所有的Try操作成功后,执行确认操作。
- Cancel:如果Try操作失败或最终无法确认,则执行取消操作。
3.1 TCC模式流程
- 订单服务(Try):订单服务调用库存服务的
try
接口,检查库存是否足够并预扣库存。 - 库存服务(Try):库存服务尝试扣减库存并锁定资源,返回成功或失败。
- 订单服务(Confirm):如果库存服务成功,订单服务调用
confirm
接口确认订单创建并提交。 - 库存服务(Confirm):库存服务执行库存扣减操作,确保库存被扣除。
- 失败时的Cancel:
- 如果订单服务没有接到库存的确认消息,或者库存不足,订单服务会调用
cancel
接口回滚订单。 - 库存服务会在确认失败时调用
cancel
操作,恢复库存。
- 如果订单服务没有接到库存的确认消息,或者库存不足,订单服务会调用
4. 最终一致性 + 事件驱动
在实际的电商系统中,可能更多的是采用 最终一致性 的方式来保证跨服务的数据一致性。系统通过 事件驱动架构 来保证不同服务之间最终的一致性。
- 订单服务:创建订单后发布事件。
- 库存服务:接收到库存扣减的事件并进行库存扣减操作。
- 失败恢复:如果库存服务失败,则通过重试机制或者补偿机制恢复数据一致性。
总结
对于分布式系统中的订单与库存这类跨服务事务,无法依赖传统的数据库事务,需要通过一些分布式事务解决方案来保证数据一致性。常用的方式有:
- 消息队列 + 补偿机制:通过消息传递解耦订单与库存,使用补偿操作来保证一致性。
- Saga模式:将大事务拆分为多个局部事务,并通过补偿操作保证最终一致性。
- TCC模式:通过 Try-Confirm-Cancel 三步操作来保证事务一致性。
最常见的实践是 消息队列 + 补偿机制,通过保证消息的可靠性和幂等性,以及设置补偿机制来应对系统故障或异常情况,最终实现订单和库存之间的数据一致性。
相关文章:
Rabbitmq Fanout如何保证不重复消费及应用场景
rabbitmq fanout业务场景,一个交换机对应多个队列,不会重复消费吗 在 RabbitMQ 中,使用 Fanout 类型的交换机时,确实可以将一个交换机绑定到多个队列。每当有消息发布到这个交换机时,交换机会把消息广播到所有绑定的队…...
【Linux系列】使用 `nohup` 命令运行 Python 脚本并保存输出日志的详细解析
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
基于Python的考研学习系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…...
多模态大模型文生图和图生文的主要技术
1 图生文 CLIP 该模型架构由图像编码器和文本编码器组成。图像编码器将图像转换为嵌入(数字列表),文本编码器将文本转换为嵌入。 这两个编码器在成批的图像-文本对上进行训练,其中文本描述图像。编码器的训练方式如下࿱…...
云架构:考量与框架
云架构:考量与框架 引言 在当今的数字化环境中,云计算已成为现代商业运营的基石。一个设计良好的云架构框架为可扩展、安全和弹性的系统奠定了基础。本文将深入探讨云架构的核心要素,讨论重要的考量因素、设计指南,以及最佳实践…...
用uniapp写一个播放视频首页页面代码
效果如下图所示 首页有导航栏,搜索框,和视频列表, 导航栏如下图 搜索框如下图 视频列表如下图 文件目录 视频首页页面代码如下 <template> <view class"video-home"> <!-- 搜索栏 --> <view class…...
开发培训-慧集通(iPaaS)集成平台脚本开发Groovy基础培训视频
Groovy是一种基于Java虚拟机(JVM)的敏捷开发语言,结合了Python、Ruby和Smalltalk的许多强大特性。它旨在提高开发者的生产力,通过简洁、熟悉且易于学习的语法,Groovy能够与Java代码无缝集成,并提供强大…...
供需平台信息发布付费查看小程序系统开发方案
供需平台信息发布付费查看小程序系统主要是为了满足个人及企业用户的供需信息发布与匹配需求。 一、目标用户群体 个人用户:寻找兼职工作、二手物品交换、本地服务(如家政、维修)等。 小微企业:推广产品和服务,寻找合…...
【Qt】如何保证线程安全(以日志写入为例)
前言 在近日学习中发现,如果开发一个单例模式的日志系统,难免会出现多个线程记录日志的情况,这个时候线程可能导致竞争,或者始料未及的情况发生。 通过学习,如果要保证线程安全,要使用互斥锁QMutex…...
k8s基础(3)—Kubernetes-Deployment
一、 Deployment概述 Kubernetes Deployment是Kubernetes中的一个核心概念,它是一种高级别的控制器,用于管理Pod和ReplicaSet,确保应用程序的高可用性和稳定性。Deployment通过声明式配置来创建和更新Pod和ReplicaSet,从而…...
信息系统管理师试题-人力资源
下列( )不属于人力资源管理的主要工作内容。 A根据各工作岗位任务的特点和工作要求,预测组织的人力需求 B根据工作需要,选拔出符合组织需要的员工 C对新员工进行工作指导和培训 D为项目团队争取和募集更多资金 答案D 解析…...
【情感】程序人生之情感关系中的平等意识(如何经营一段长期稳定的关系 沸羊羊舔狗自查表)
【情感】程序人生之情感关系中的平等意识(如何经营一段长期稳定的关系 & 沸羊羊舔狗自查表) 文章目录 1、情感关系中的平等意识2、如何经营一段长期稳定的关系(避免左倾 | 敬畏与担当)3、沸羊羊/舔狗自查表(避免右…...
pyspark执行group by操作
前情提要 在处理亿级别数据时,常常输入是hive表,因此需要在pypark流程中引入一些场景sql操作,其中group by就是比较常见的操作。 基础步骤 创建SparkSession:通过enableHiveSupport()方法启用Hive支持,确保能够访问…...
小寒时处在二三九,天寒地冻北风吼
今(1月5日上午10时33分)天迎来了小寒节气,本“人民体验官”推广人民日报官方微博文化产品《小寒来了!最冷的时候如何养生防病》,同时科普小寒相关知识。 截图:来源本“人民体验官”推广平台 人民微博告诉我…...
微信小程序校园自助点餐系统实战:从设计到实现
随着移动互联网的发展,越来越多的校园场景开始智能化、自助化。微信小程序凭借其轻量化、便捷性和强大的生态支持,成为了各类校园应用的首选工具之一。今天,我们将通过实际开发一个微信小程序“校园自助点餐系统”来展示如何设计和实现这样一…...
java基础之代理
代理模式(Proxy Pattern) 简介 是一种结构型设计模式,主要用于为某对象提供一个代理对象,以控制对该对象的访问。通过引入一个代理对象来控制对原对象的访问。代理对象在客户端和目标对象之间充当中介,负责将客户端的…...
uniapp - 基于uniapp+vue3实现自定义增强版table表格组件体验「兼容H5+小程序+App端」
本文提供增强版table表格组件体验,打造跨端表格的新标杆. uv3-table:一款基于uniappvue3跨端自定义手机端增强版表格组件。支持固定表头/列、边框、斑马纹、单选/多选,自定义表头/表体插槽、左右固定列阴影高亮显示。支持编译兼容H5小程序端App端。 提供…...
【Obsidian插件开发】新建窗口时出现多余的空白窗口
问题描述 在打开Edit Task的Modal的时候,有一个多余的空白modal同时也被打开了,并且点右上角的叉号可以把Edit Task窗口也关上。最开始没有这个问题,我给edit task窗口加了css,移动位置之后问题就出现了。 解决方法 我最开始看到…...
springmvc--请求参数的绑定
目录 一、创建项目,pom文件 二、web.xml 三、spring-mvc.xml 四、index.jsp 五、实体类 Address类 User类 六、UserController类 七、请求参数解决中文乱码 八、配置tomcat,然后启动tomcat 1. 2. 3. 4. 九、接收Map类型 1.直接接收Map类型 &#x…...
前缀和与差分专题
领地选择 (二维前缀和) 作为在虚拟世界里统帅千军万马的领袖,小 Z 认为天时、地利、人和三者是缺一不可的,所以,谨慎地选择首都的位置对于小 Z 来说是非常重要的。 首都被认为是一个占地 CC 的正方形。小 Z 希望你寻…...
Go Ebiten小球弹性碰撞代码示例
Go Ebiten小球弹性碰撞代码示例 我们来编写一个简单的示例程序,在其中实现一个小球在窗口中弹性碰撞的效果。具体来说,当小球碰到窗口的边缘时,它会反弹回来,改变运动方向。我们将使用Ebiten的图形和物理模拟功能来实现这个效果。…...
C++中map和set的封装
一、关于封装过程中传入的模板参数的问题 通过源码中的封装方式进行理解: 1.1map和set中成员变量 set中: template <class Key, class Compare less<Key>, class Alloc alloc> class set { public:typedef Key key_type;typedef Key v…...
dsa introduction 3
空间复杂度一般不会超过时间复杂度。空间复杂度就是申请的空间的数量级别。 减治和分治都是算法策略。都可以用递归和迭代的手段去实现。递归就是函数自己调用自己。一直到递归基之后再返回。递归算法的空间复杂度是递归深度。分治是分别求解子问题,然后由子问题的…...
C++ 日志库 spdlog 使用教程
Spdlog是一个快速、异步、线程安全的C日志库,他可以方便地记录应用程序的运行状态,并提供多种输出格式。官网:https://github.com/gabime/spdlog 安装教程可以参考:https://blog.csdn.net/Harrytsz/article/details/144887297 S…...
Pytorch机器学习——1 深度学习介绍
outline 人工智能、机器学习与深度学习深度学习工具介绍 1. 人工智能、机器学习与深度学习 AI:研究如何能让计算机模拟人类的智能,来实现特定的依赖人类智能才能实现的任务(例如学习、语言、识别) AI历史: 1818&#x…...
软件工程期末大复习(六)面向对象分析
6.1 软件分析概述 软件分析是软件开发生命周期中的一个关键阶段,它紧随需求收集之后。在这个阶段,分析者的目标是理解用户的需求,并确定系统应该做什么。 需求分析:分析用户的需求,确定系统必须实现的功能。概念性设计…...
科研绘图系列:R语言科研绘图之标记热图(heatmap)
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍加载R包数据下载导入数据数据预处理画图系统信息参考介绍 科研绘图系列:R语言科研绘图之标记热图(heatmap) 加载R包 library(tidyverse) library(ggplot2) library(reshape)…...
数据挖掘——朴素贝叶斯分类
数据挖掘——朴素贝叶斯分类 朴素贝叶斯分类极大后验假设独立性假设贝叶斯分类器总结 朴素贝叶斯分类 什么是分类? 找出描述和区分数据类或概念的模型,以便能够使用模型预测未知的对象的类标号 概念区分 分类与回归 分类是预测分类(离散、…...
Redis数据库笔记—— Hash(哈希)的扩容机制(rehash)
大家好,这里是Good Note,关注 公主号:Goodnote,专栏文章私信限时Free。详细介绍Hash(哈希)的扩容机制(rehash)、源码、以及扩容和缩容过程。 文章目录 Redis 字典(dict)结构源码哈希…...
【Web】软件系统安全赛CachedVisitor——记一次二开工具的经历
明天开始考试周,百无聊赖开了一把CTF,还顺带体验了下二开工具,让无聊的Z3很开心🙂 CachedVisitor这题 大概描述一下:从main.lua加载一段visit.script中被##LUA_START##(.-)##LUA_END##包裹的lua代码 main.lua loca…...
面向对象分析与设计Python版 建模工具UML
文章目录 一、建模与模型二、统一建模语言 一、建模与模型 建模与模型 建模 modeling: 把不太理解的东西和一些已经较为理解、且十分类似的东西做比较,可以对这些不太理解的东西产生更深刻的理解,叫做建模重要的研发成果常常产自类比 模型 …...
Flink系列知识讲解之:深入了解 Flink 的网络协议栈
Flink系列知识之:深入了解 Flink 的网络协议栈 Flink 的网络协议栈是组成 flink-runtime 模块的核心组件之一,也是每个 Flink 任务的核心。它连接着来自所有任务管理器的各个工作单元(子任务)。这是流数据流过的地方,…...
动态库dll与静态库lib编程4:MFC规则DLL讲解
文章目录 前言一、说明二、具体实现2.1新建项目2.2 模块切换的演示 总结 前言 动态库dll与静态库lib编程4:MFC规则DLL讲解。 一、说明 1.前面介绍的均为Win32DLL,即不使用MFC的DLL。 2.MFC规则DLL的特点:DLL内部可以使用MFC类库、可以被其他…...
TypeScript 后端开发中的热重载编译处理
在一些除了nest框架外的一些其他nodejs框架中没有提供对ts编译和热重载,如果使用typescript我们需要自己进行配置。 方法一(推荐) 使用bun运行环境(快)。注:一些不是使用js,ts代码编写的第三方…...
ORB-SLAM3源码学习:LoopClosing.cc:LoopClosing::NewDetectCommonRegions检测共同区域
前言 在ORB-SLAM2中校验闭环候选关键帧时,需要满足时序上连续3次成功校验才能通过。这就需要检测至少3个新进来的关键帧,这种方法牺牲了召回率来提升精度。由于必须严格的满足至少连续的三个条件这使得闭环的条件更加严格,即使存在真实的闭环…...
前端React Router从入门到进阶实战
React Router 是 React 应用中的一个重要库,它用于实现客户端的路由管理,能够将 URL 路径与 React 组件关联起来,从而实现页面之间的导航。React Router 不会像传统的多页面应用那样重新加载页面,而是通过组件切换来呈现不同的视图…...
关于华硕Armoury Crate(奥创中心)安装程序失败、卡进度条问题解决方案
关于华硕Armoury Crate(奥创中心)安装失败解决方案 清理旧版本文件 如果之前安装过Armoury Crate,可能有残留文件导致冲突: 利用官方的卸载工具,卸载旧版本: https://www.asus.com.cn/supportonly/armoury%20crate/…...
【WPF】 数据绑定机制之INotifyPropertyChanged
INotifyPropertyChanged 是 WPF 中的一个接口,用于实现 数据绑定 中的 属性更改通知。它的主要作用是,当对象的某个属性值发生更改时,通知绑定到该属性的 UI 控件更新其显示内容。 以下是有关 INotifyPropertyChanged 的详细信息和实现方法&…...
QPushButton的基础用法
概述 本文将详细介绍 QPushButton 的概念、常规用法、样式表以及一些特殊用法,帮助您深入理解和高效应用 QPushButton。当前Qt版本为6.8。 1. QPushButton 的基本概念 1.1 概述 QPushButton 是 Qt 中最常用的按钮控件之一,它表示一个可以被点击的按钮…...
股指期货有哪些优势?
股指期货,作为一种重要的金融衍生品,以其独特的交易方式和多样的优势,吸引了众多投资者的关注。本文将详细解析股指期货的定义、优势以及特点,帮助投资者更好地理解和把握这一市场。 一、股指期货的定义 股指期货,顾…...
STM32完全学习——FATFS0.15移植SD卡
一、下载FATFS源码 大家都知道使用CubMAX可以很快的将,FATFS文件管理系统移植到单片机上,但是别的芯片没有这么好用的工具,就需要自己从官网下载源码进行移植。我们首先解决SD卡的驱动问题,然后再移植FATFS文件管理系统。 二、SD…...
使用 Spring 状态机构建灵活的状态管理系统
引言 在软件开发中,状态机是一种非常重要的工具,尤其适用于需要处理复杂状态转换的场景。无论是订单管理系统中的订单状态、工作流引擎中的任务流转,还是审批流程的管理,状态机都能有效地帮助我们组织和管理不同的状态及其之间的…...
[SMARTFORMS] 添加设置图标
本地图片存放位置 使用事务码SE78进入表格图形管理页面,将导入图标到SAP系统 选择需要上传的图片地址,输入名称,描述和图片类型,点击导入按钮 完成上述操作以后,图标已导入到SAP系统中 提示Tips:如何将图标…...
网络世界的“交通规则”——TCP/IP(一)
一、非可靠传输的协议——UDP 1.1 UDP的报文格式 (1)UDP长度:表示整个UDP数据包的长度(报头载荷); (2)校验和:用于验证UDP数据包在传输过程中有没发生比特翻转ÿ…...
Excel中公式和函数的区别
Excel中公式和函数的区别 概念讲解例子公式函数 详细介绍函数面板最后再次进行演示操作文档 概念讲解 公式是用户自己编写的表达式,而函数是由Excel预定义的操作。公式可以包含各种数学运算符和逻辑表达式,函数则是执行特定任务的工具。公式可以引用其他…...
Node.js应用程序遇到了内存溢出的问题
vue 项目 跑起来,一直报错,内存溢出 在 文件node_modules 里 .bin > vue-cli-service.cmd 在依赖包这个文件第一行加上这个 node --max-old-space-size102400 "%~dp0\..\vue\cli-service\bin\vue-cli-service.js" %* node --max-old-s…...
MySQL关联关系理论与实践
MySQL 是一种关系型数据库管理系统,以其高性能、灵活性和易用性在开发者中广受欢迎。在 MySQL 中,数据存储以表格形式存在,表与表之间的关联关系构成了关系型数据库的核心。本篇文章将介绍 MySQL 关联关系的理论基础和常见实践,包…...
w138基于Spring Boot的宠物领养系统的设计与实现
🙊作者简介:多年一线开发工作经验,原创团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹赠送计算机毕业设计600个选题excel文…...
AMBA-CHI协议详解(十三)
AMBA-CHI协议详解(一)- Introduction AMBA-CHI协议详解(二)- Channel fields / Read transactions AMBA-CHI协议详解(三)- Write transactions AMBA-CHI协议详解(四)- Other transac…...
组合的能力
在《德鲁克最后的忠告》一书中,有这样一段话: 企业将由各种积木组建而成:人员、产品、理念和建筑。积木的设计组合至少和其供给一样重要。……对于一切程序、应用软件以及附件来说,重要的是掌握将已有的软件模块组合的能力&…...