当前位置: 首页 > news >正文

【软件系统架构】事件驱动架构

一、引言

        在当今的软件开发和系统架构领域,事件驱动架构(Event - Driven Architecture,EDA)正逐渐成为构建复杂、分布式和可扩展系统的热门选择。随着信息技术的不断发展,传统的架构模式在应对高并发、实时性要求高、数据交互复杂的场景时面临诸多挑战,而事件驱动架构以其独特的设计理念和处理机制为这些问题提供了有效的解决方案。

二、事件驱动架构定义

        事件驱动架构是一种软件架构模式,它基于事件的产生、传递和处理来构建系统。在这种架构中,事件被定义为系统内发生的有意义的状态变化或者动作。组件之间通过异步地发送和接收事件进行通信,而不是通过传统的直接调用方法。事件生产者(Event Producers)产生事件并将其发布到事件总线(Event Bus)或者事件通道(Event Channel),事件消费者(Event Consumers)订阅这些事件并对其进行相应的处理。

三、事件驱动架构发展历史

早期起源

        事件驱动架构的概念可以追溯到早期的计算机系统设计。在操作系统层面,中断处理机制就是一种事件驱动的思想体现。当硬件设备(如键盘输入、磁盘读写完成等)发生特定事件时,会触发中断信号,操作系统会暂停当前正在执行的任务,转而去处理相应的中断事件。

企业应用集成(EAI)阶段

        在企业应用集成领域,随着企业内部不同系统(如ERP、CRM等)之间需要进行数据共享和交互,事件驱动架构开始得到更多的应用。企业开始使用消息队列等技术来实现事件的传递,以解决系统之间的耦合问题。

互联网和云计算时代

        随着互联网应用的大规模发展以及云计算的兴起,事件驱动架构迎来了更广阔的发展空间。例如,在大规模的电商平台中,订单状态的变更、商品库存的变化等都可以作为事件进行处理。云服务提供商也开始利用事件驱动架构来构建其内部的服务,如AWS的Lambda函数与事件源(如S3存储桶事件、DynamoDB流事件等)的集成。

四、事件驱动架构特点

(一)松耦合

        事件生产者和消费者之间没有直接的依赖关系。生产者不需要知道哪些组件会消费它产生的事件,消费者也不需要了解事件是如何产生的。这种松耦合使得系统更易于维护和扩展,因为可以独立地添加、修改或删除事件生产者和消费者,而不会对其他组件造成太大的影响。

        例如,在一个电商系统中,商品库存管理模块(生产者)在库存发生变化时发布事件,而订单处理模块(消费者)只需要订阅库存变化事件并进行相应处理,它们可以独立开发和部署。

 

(二)异步通信

        事件的传递和处理是异步进行的。这意味着事件生产者在发布事件后不需要等待事件被处理就可以继续执行其他任务。这种异步特性提高了系统的并发处理能力,能够更好地应对高流量和高并发的场景。

        比如,在一个社交媒体平台中,用户发布一条新的动态(事件),系统可以立即将事件发布到事件总线,然后用户可以继续进行其他操作,而系统中的通知模块、数据分析模块等可以在后台异步地处理该事件。

(三)可扩展性

        由于其松耦合和异步通信的特性,事件驱动架构很容易实现水平扩展。可以通过增加事件生产者和消费者的实例数量来处理更多的事件流量。

        以一个大型的物联网(IoT)系统为例,随着连接的设备数量不断增加(产生更多的事件),可以轻松地添加更多的事件处理组件来处理设备上报的各种事件,如设备状态变化、传感器数据采集等。

(四)实时性和响应性

        事件驱动架构能够快速响应事件的发生。一旦事件产生,相关的事件消费者可以立即进行处理,适合构建对实时性要求较高的系统,如金融交易系统中的价格变动事件处理、实时监控系统中的异常事件处理等。

        在金融交易系统中,当股票价格发生变化(事件)时,交易系统中的策略执行模块可以迅速根据新的价格信息做出买卖决策。

五、事件驱动架构细分类型

(一)简单事件处理(Simple Event Processing,SEP)

        在简单事件处理中,事件消费者直接对单个事件进行处理。通常用于处理相对简单、不需要复杂关联和聚合的事件场景。

        例如,在一个在线游戏系统中,玩家登录事件发生时,系统只需要记录登录时间并更新玩家在线状态,这就是一个简单事件处理的例子。

(二)事件流处理(Event - Stream Processing,ESP)

        事件流处理主要关注对连续的事件流进行实时处理。它涉及到对事件流中的事件进行过滤、转换、聚合等操作,以提取有价值的信息。

        例如,在一个网络流量监控系统中,大量的网络数据包流入(形成事件流),事件流处理系统可以实时分析流量模式,检测异常流量行为,如DDoS攻击检测。

(三)复杂事件处理(Complex Event Processing,CEP)

        复杂事件处理处理的是由多个简单事件组合或关联而成的复杂事件。它需要分析事件之间的关系、模式和时序,以识别出有意义的复杂事件并进行相应的处理。

        在物流供应链系统中,货物的发货事件、运输途中的位置更新事件、到达目的地事件等多个简单事件可以组合成一个复杂事件,如“货物按时到达”,CEP系统可以根据这些事件的组合进行供应链效率评估和异常检测。

六、事件驱动架构的优缺点

(一)优点

高度灵活性和适应性

        由于松耦合的特性,系统能够轻松适应业务需求的变化。新的业务功能可以通过添加新的事件生产者和消费者来实现,而不需要对现有系统进行大规模的改造。

提高系统性能和可扩展性

        异步通信和可扩展性使得系统能够处理大量的并发事件,提高了系统的整体性能。在高流量场景下,如电商促销活动期间,能够有效地处理订单创建、库存更新等大量事件。

便于集成和互操作性

        事件驱动架构有利于不同系统之间的集成。不同系统可以通过事件进行通信和交互,实现数据共享和业务流程的协同。例如,企业内部的财务系统和销售系统可以通过事件驱动架构进行集成,当销售订单生成时,销售系统发布事件,财务系统订阅事件并进行相关的账务处理。

(二)缺点

调试和故障排除困难

        由于事件的异步传递和多个组件之间的复杂交互,当系统出现问题时,很难确定问题的根源。事件可能在传递过程中丢失、被错误处理或者出现延迟,定位这些问题需要更复杂的调试工具和技术。

数据一致性挑战

        在事件驱动架构中,由于事件的异步处理,可能会导致数据的暂时不一致性。例如,在库存管理系统中,如果多个事件同时对库存进行操作,可能会出现库存数据在某个瞬间不准确的情况,需要采用额外的机制(如分布式事务、补偿操作等)来确保数据的最终一致性。

增加系统复杂性

        事件驱动架构的设计和实现相对复杂,需要考虑事件的定义、发布、订阅、传递机制等多个方面。同时,需要处理事件的顺序、并发处理等问题,这增加了系统的整体复杂性,对开发人员的技术水平和系统的运维能力都提出了更高的要求。

特性描述示例
优点
高度灵活性和适应性松耦合特性使系统能轻松适应业务需求变化,新功能通过添加事件生产者和消费者实现,无需大规模改造现有系统-
提高系统性能和可扩展性异步通信和可扩展性让系统能处理大量并发事件,提升整体性能,如电商促销时处理订单、库存事件电商促销活动期间处理订单创建、库存更新事件
便于集成和互操作性有利于不同系统集成,系统间通过事件通信交互,实现数据共享和业务协同,如财务与销售系统集成销售订单生成时,销售系统发布事件,财务系统订阅并处理账务
缺点
调试和故障排除困难事件异步传递和组件复杂交互,导致问题根源难确定,事件可能丢失、错处或延迟,需复杂调试工具技术-
数据一致性挑战事件异步处理可能导致数据暂时不一致,如库存管理中多事件同时操作库存,需额外机制确保最终一致库存管理系统多事件同时操作库存时数据瞬间不准确
增加系统复杂性设计实现复杂,需考虑事件定义、发布、订阅、传递等多方面,还需处理顺序、并发等问题,提高对开发和运维要求-

七、事件驱动架构的案例

(一)Apache Kafka生态系统

        Kafka是一个分布式的流处理平台,它是事件驱动架构在大数据领域的典型应用。

        在许多大型互联网公司中,Kafka被用作消息总线,用于处理各种事件。例如,在一个在线新闻平台中,新闻文章的发布、用户的点赞和评论等事件都可以通过Kafka进行传递。新闻发布系统作为事件生产者将新闻发布事件发送到Kafka,而用户通知系统、数据分析系统等作为事件消费者从Kafka中订阅相关事件并进行处理。

        Kafka的高吞吐量、可持久化存储事件以及多副本机制等特性,使得它能够满足大规模数据处理和高并发事件处理的需求。

(二)微服务架构中的事件驱动通信

        在微服务架构中,各个微服务之间可以采用事件驱动架构进行通信。

        以一个电商平台为例,订单服务、库存服务、物流服务等微服务之间可以通过事件进行交互。当订单服务创建一个新订单时,它会发布一个订单创建事件。库存服务订阅这个事件并根据订单中的商品信息减少库存,物流服务也可以订阅该事件并启动发货流程。这种方式使得各个微服务之间的耦合度降低,每个微服务可以独立发展和演进。

八、事件驱动架构整体框架代码举例(以Python和RabbitMQ为例)

import pika
import json# 事件生产者
def produce_event(event_data):connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))channel = connection.channel()channel.queue_declare(queue='event_queue')event_json = json.dumps(event_data)channel.basic_publish(exchange='', routing_key='event_queue', body=event_json)print(f"Sent event: {event_json}")connection.close()# 事件消费者
def consume_event():connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))channel = connection.channel()channel.queue_declare(queue='event_queue')def callback(ch, method, properties, body):event_data = json.loads(body)print(f"Received event: {event_data}")# 在这里可以进行具体的事件处理逻辑,如根据事件类型调用不同的业务逻辑函数channel.basic_consume(queue='event_queue', on_message_callback=callback, auto_ack=True)print('Waiting for events...')channel.start_consuming()if __name__ == "__main__":# 示例事件数据sample_event = {"type": "order_created","data": {"order_id": 123,"customer_id": 456,"products": ["product1", "product2"]}}produce_event(sample_event)consume_event()

        在这个简单的代码示例中,我们使用RabbitMQ作为消息队列(事件总线)。produce_event函数用于创建事件并将其发送到队列中,consume_event函数用于从队列中接收事件并进行处理。这只是一个非常基础的示例,在实际应用中,还需要考虑更多的因素,如错误处理、事件的可靠性传递、多个消费者的负载均衡等。

事件定义

首先,我们定义一个事件类,这个类包含事件的类型和相关数据。

class Event:def __init__(self, event_type, data):self.event_type = event_typeself.data = data

事件队列(模拟消息总线)

我们创建一个简单的事件队列来存储和传递事件。

event_queue = []

事件生产者

事件生产者负责创建事件并将其放入事件队列中。

def event_producer(event_type, data):event = Event(event_type, data)event_queue.append(event)

事件消费者

事件消费者订阅特定类型的事件并进行处理。这里我们创建两个简单的消费者,一个处理user_login事件,另一个处理product_purchase事件。

def user_login_event_consumer():for event in event_queue:if event.event_type == 'user_login':print(f"处理用户登录事件,用户信息: {event.data}")def product_purchase_event_consumer():for event in event_queue:if event.event_type == 'product_purchase':print(f"处理产品购买事件,购买信息: {event.data}")

示例用法

我们创建一些事件并演示整个事件驱动架构的工作流程。

# 产生用户登录事件
user_login_data = {'user_id': 1, 'username': 'John'}
event_producer('user_login', user_login_data)# 产生产品购买事件
product_purchase_data = {'product_id': 101, 'quantity': 2}
event_producer('product_purchase', product_purchase_data)# 消费者处理事件
user_login_event_consumer()
product_purchase_event_consumer()

在这个简单示例中:

  • 事件生产者不需要知道谁会处理它产生的事件,只负责将事件放入队列。
  • 事件消费者只关注自己感兴趣的事件类型,它们独立于事件生产者,通过遍历事件队列来查找和处理自己订阅的事件。

        这就是一个非常基础的事件驱动架构示例,实际的事件驱动架构在工业应用中会使用更复杂的消息队列系统(如RabbitMQ、Kafka等),并且会有更完善的错误处理、分布式部署、事件持久化等机制。

九、未来发展趋势

(一)与Serverless架构的融合

        Serverless架构是一种新兴的云计算架构模式,它允许开发人员在不需要管理服务器的情况下构建和运行应用程序。事件驱动架构与Serverless架构的融合将进一步提高系统的可扩展性和成本效益。

        例如,在AWS Lambda中,函数可以由事件触发,如S3存储桶中的文件上传事件、API Gateway的HTTP请求事件等。这种融合将使得开发人员能够更加专注于业务逻辑的实现,而无需关心服务器的管理和运维。

(二)在人工智能和机器学习中的应用

        随着人工智能和机器学习技术的不断发展,事件驱动架构将在其中发挥重要作用。在数据挖掘和分析领域,事件驱动架构可以用于实时处理传感器数据、用户行为数据等大量数据,为机器学习模型提供实时的输入数据。

        例如,在智能家居系统中,通过事件驱动架构实时收集和处理各种传感器(如温度传感器、湿度传感器、人体红外传感器等)的数据,然后将这些数据作为输入提供给机器学习模型,以实现智能决策,如自动调节空调温度、智能安防预警等。

(三)跨平台和跨领域的集成

        未来,事件驱动架构将在不同的平台(如物联网平台、移动平台、云平台等)和不同的领域(如医疗、金融、交通等)之间实现更广泛的集成。通过定义统一的事件标准和接口,不同平台和领域之间可以更加方便地进行数据交换和业务协同。

        在医疗领域,医院内部的医疗设备管理系统、电子病历系统等可以与外部的医疗保险系统、药品供应链系统等通过事件驱动架构进行集成,实现医疗数据的共享、医疗费用的结算、药品的及时供应等功能。

        事件驱动架构以其独特的优势在现代软件系统中发挥着越来越重要的作用,随着技术的不断发展,它将不断演进和拓展应用领域,为构建更加灵活、高效、可扩展的系统提供有力支持。

相关文章:

【软件系统架构】事件驱动架构

一、引言 在当今的软件开发和系统架构领域,事件驱动架构(Event - Driven Architecture,EDA)正逐渐成为构建复杂、分布式和可扩展系统的热门选择。随着信息技术的不断发展,传统的架构模式在应对高并发、实时性要求高、数…...

Doris FE 常见问题与处理指南

在数据仓库领域,Apache Doris 凭借其卓越性能与便捷性被广泛应用。其中,FE(Frontend)作为核心组件,承担着接收查询请求、管理元数据等关键任务。然而,在实际使用中,FE 难免会遭遇各类问题&#…...

Manus AI “算法-数据-工程“三位一体的创新

Manus AI在多语言手写识别领域的技术突破,通过算法创新、数据工程与场景适配的协同作用,解决了传统手写识别的核心痛点。以下是其关键技术路径与创新点的系统性分析: 一、深度学习模型与算法优化 混合神经网络架构Manus AI采用"CNN与LST…...

Flutter Expanded 与 Flexible 详解

目录 1. 引言 2. Expanded 的基本用法 3. Flexible 的基本用法 4. Expanded vs Flexible 的区别 4.1 基础定义 4.2 关键差异 5. Expanded 深度解析 5.1 按比例分配 5.2 强制填充特性 6. Flexible 深度解析 6.1 基础用法:动态收缩 6.2 结合 fit 参数控制…...

乘用车制动系统设计:保障行车安全的核心技术

摘要 随着汽车工业的快速发展,乘用车制动系统的设计至关重要。本文详细阐述了乘用车制动系统的工作原理、组成部分、常见类型,深入分析了制动系统设计过程中的关键要点,包括制动力分配、制动管路设计、制动助力系统选型等。同时,…...

电力行业在保障用电安全方面正积极采用先进的物联网技术

电力行业在保障用电安全方面正积极采用先进的物联网技术 电力行业的物联网安全用电监管装置正发挥着至关重要的作用。 ASCO 电不着安全用电装置凭借其卓越的性能,成为了解决用电安全问题的得力助手。 当电漏电这种危险情况悄然发生时,物联网 ASCO 电不着…...

TDengine 语言连接器(PHP)

简介 PHP 语言广泛用于 Web 开发的开源脚本语言。它语法简单,容易学习,既支持面向过程,也支持面向对象编程。具有跨平台性,能与多种数据库交互,可与 HTML 等前端技术配合,动态生成网页内容。常用于开发各类…...

使用docker该怎么做:从公有仓库拉取镜像并上传到私有仓库

在容器化部署中,将公有镜像仓库(如Docker Hub)的镜像迁移到私有仓库(如Harbor、Nexus)是常见需求。 一、为什么需要将镜像从公有仓库传到私有仓库? 网络连通性:公有仓库依赖公网访问&#xff…...

list的使用

1:list文档 list文档 在之前我们对于链表有过最初始的模拟实现,现在进入C之后,我们可以在STL库中发现到链表这个容器的使用,list的底层也是我们最初实现的双向链表。 2:list的使用 list的接口有很多,我们…...

Redis遇到Hash冲突怎么办

在 Redis 中,哈希冲突通常是指当多个键的哈希值相同或位于相同的哈希槽中时发生冲突。Redis 通过底层的哈希表和一些冲突解决机制(如开放地址法、链表法等)来处理哈希冲突问题。这些通常是透明的,作为开发者,我们无需直…...

OpenCV 图形API(42)颜色空间转换-----将 BGR图像转换为 I420(YUV 4:2:0)格式函数BGR2I420()

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 将图像从BGR色彩空间转换为I420色彩空间。 该函数将输入图像从BGR色彩空间转换为I420。R、G和B通道值的传统范围是0到255。 输出图像必须是8位无…...

简述Apache RocketMQ

整体架构分析 基本流程 模块特性 发送消息流程原理分析 同步发送 sync 异步发送 async 直接发送 one-way 主从同步(HA)机制分析 消息投递 持久化机制 RocketMQ的RPC通信 RocketMQ中Remoting通信模块的具体实现 消息的协议涉及与编码解码 消…...

AI融合SEO关键词实战指南

内容概要 随着人工智能技术的迭代升级,SEO关键词策略正经历从人工经验驱动向数据智能驱动的范式转变。本指南聚焦AI技术在搜索引擎优化中的系统性应用,通过构建多层技术框架实现关键词全生命周期管理。核心方法论涵盖语义分析引擎的构建原理、基于NLP的…...

RK3588 实现音视频对讲

RK3588 实现音视频对讲方案 RK3588是瑞芯微推出的一款高性能处理器,非常适合用于音视频对讲系统的开发。以下是基于RK3588实现音视频对讲的方案概述: 硬件架构 核心处理器:RK3588 (4xCortex-A76 4xCortex-A55)视频处理: 内置8…...

OSPF区域间路由计算

ABR:区域边界路由器,连接两个不同区域的设备就称为ABR(不同厂商不同,定义很模糊) ASBR:自治系统边界路由器,引入了外部路由,将不是自治系统外部的不是OSPF路由的条目变成OSPF路由条目…...

NAT、代理服务、内网穿透

NAT、代理服务、内网穿透 1、NAT1.1、NAT过程1.2、NAPT2、内网穿透3、内网打洞3、代理服务器3.1、正向代理3.2、反向代理1、NAT 1.1、NAT过程 之前我们讨论了IPv4协议中IP地址数量不充足的问题。NAT技术是当前解决IP地址不够用的主要手段,是路由器的一个重要功能。 NAT能够将…...

阿尔特拉 EP1C12F324I7N AlteraFPGA Cyclone

EP1C12F324I7N 属于 Altera Cyclone I 系列 FPGA 中的中低密度型号,面向成本敏感、功耗受限的嵌入式与数据通路应用。该器件采用 0.13 μm 全层铜 SRAM 工艺,集成约 12 060 个逻辑单元(LE)、239 616 位片上 RAM、249 路可编…...

解决“驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接“问题

参考链接: https://blog.csdn.net/yyj12138/article/details/123073146...

QtApplets-实现应用程序单例模式,防止重复运行

QtApplets-实现应用程序单例模式,防止重复运行 ​ 文章目录 QtApplets-实现应用程序单例模式,防止重复运行摘要引言实现原理核心代码实现头文件定义实现文件 使用方法技术要点解析1. 文件锁机制2. 进程 ID 管理3. Windows 互斥量4. 跨平台兼容 注意事项…...

nodejs使用pkg打包文件

pkg配置 "pkg": {"assets": ["*.html","*.css","*.js"],"mirror": "https://npmmirror.com/mirrors/node-v8-compile-cache/"},"bin": "server.js",嵌入到exe中的资源使用assets打…...

学习笔记十六——Rust Monad从头学

🧠 零基础也能懂的 Rust Monad:逐步拆解 三大定律通俗讲解 实战技巧 📣 第一部分:Monad 是什么? Monad 是一种“包值 链操作 保持结构”的代码模式,用来处理带上下文的值,并方便连续处理。 …...

Idea连接远程云服务器上的MySQL,开放云服务器端口

1.开放云服务器的3306端口 (1)进入到云服务器的控制台 (2)点击使用的云服务器 (3)点击 配置安全组规则 (4)添加规则 (5)开放端口 2.创建可以远程访问…...

云服务器CVM标准型S5实例性能测评——2025腾讯云

腾讯云服务器CVM标准型S5实例具有稳定的计算性能,CPU采用采用 Intel Xeon Cascade Lake 或者 Intel Xeon Cooper Lake 处理器,主频2.5GHz,睿频3.1GHz,CPU内存配置2核2G、2核4G、4核8G、8核16G等配置,公网带宽可选1M、3…...

【Pytorch之一】--torch.stack()方法详解

torch.stack方法详解 pytorch官网注释 Parameters tensors:张量序列,也就是要进行stack操作的对象们,可以有很多个张量。 dim:按照dim的方式对这些张量进行stack操作,也就是你要按照哪种堆叠方式对张量进行堆叠。dim的…...

监控+日志=DevOps 运维的“千里眼”与“顺风耳”

监控+日志=DevOps 运维的“千里眼”与“顺风耳” 在 DevOps 体系中,监控和日志管理是不可或缺的运维基石。有人说,开发只管把代码写好,运维才是真正的“操盘手”,让系统稳定运行、不宕机、不崩溃。而要做到这一点,精准的监控与日志管理 是关键。 试想一下:如果没有监控…...

实战|使用环信Flutter SDK构建鸿蒙HarmonyOS应用及推送配置

本文为大家介绍如何在 Flutter 环境创建 Harmony 项目并集成环信即时通讯IM以及环信 Flutter Harmony 推送配置。 已经基于环信的 Flutter 项目也可以参考本文适配鸿蒙端。 一、开发环境要求 前置条件 1.安装DevEco-Studio 2.安装模拟器 DevEco-Studio 下载与操作指导&…...

构建知识体系

我认为,仅仅建立知识点之间的连接还不足够,还要建立自己的知识体系。 那么什么是知识体系呢? 知识体系,可以理解为立体的知识系统。 立体的知识系统,代表着跨越了多个领域、行业、学科的知识,是多个层面…...

Android Mainline简介

关键要点 Android Mainline 是通过模块化更新 Android 核心组件的框架,可能提高安全性。允许通过 Google Play 系统更新分发模块,无需完整固件更新。能简化厂商工作并减少碎片化,但覆盖范围有限。 什么是 Android Mainline? And…...

2026《数据结构》考研复习笔记二(C++面向对象)

C面向对象 一、类二、继承三、重载运算符和重载函数四、多态代码示例 一、类 1.1类&对象 class classname//class是关键词,classname是类名 { Access specifiers://访问修饰符:private/public/protected Date members/variables;//变量 Member fun…...

【C++】12.list接口介绍

在C标准库中,std::list 是一个基于双向链表实现的顺序容器,它支持高效的插入和删除操作,但无法直接通过下标进行随机访问。以下是关于 std::list 的简单介绍: 核心特性 底层结构 双向链表实现,每个节点包含数据、前驱指…...

决策卫生问题:考公考编考研能补救高考选取职业的错误吗

对于决策者来说,“认识你自己”是一个永恒的主题;警惕认知中的缺陷,比什么都重要。在判断与决策问题上,管理者和专业人士往往都非常自信。人类远远不如我们想象的那么理性,人类的判断也远远不如我们想象的那么完美。在…...

考研系列-计算机网络-第一章、计算机网络体系结构

一、计算机网络概述 1.知识点总结 性能指标: 注意这个指标: 2.习题总结 (一)选择题 广域网点对点,局域网广播技术 (二)简答题 (1)概念性题目: (2)计算型题目 这个题目主要是注意两种交换方式: 电路交换:…...

状态模式:有限状态机在电商订单系统中的设计与实现

状态模式:有限状态机在电商订单系统中的设计与实现 一、模式核心:用状态切换驱动行为变化 在电商订单系统中,订单状态会随着用户操作动态变化:「已创建」的订单支付后变为「已支付」,发货后变为「已发货」&#xff0…...

nohup命令使用说明

文章目录 如何在后台运行程序呢?如何正常运行代码重定向呢?nohup: ignoring input 如何在后台运行程序呢? 使用nohup命令即可, nohup python dataset/ReferESpatialDataset.py >>dataset_20250417.log 2>&1 &n…...

使用原生button封装一个通用按钮组件

效果图 代码 <script lang"ts" setup> import { computed, ref, watch } from "vue";/*** 按钮属性接口*/ interface ButtonProps {/** 按钮类型&#xff1a;default(默认)/dark/plain/link */type?: "default" | "dark" | &q…...

osu ai 论文笔记 DQN

e https://theses.liacs.nl/pdf/2019-2020-SteeJvander.pdf Creating an AI for the Rhytm Game osu! 20年的论文 用监督学习训练移动模型100首歌能达到95准确率 点击模型用DQN两千首歌65准确率 V抖用的居然不是强化学习&#xff1f; 5,6星打96准确度还是有的东西的 这是5.…...

perf 的使用方法

perf的架构 1.perf event event are pure kernel counters, in this case they are called software events. Examples include: context-switches, minor-faults.events is the processor itself and its Performance Monitoring Unit (PMU). It provides a list of events …...

【MCP教程】Claude Desktop 如何连接部署在远程的remote mcp server服务器(remote host)

前言 最近MCP特别火热&#xff0c;笔者自己也根据官方文档尝试了下。 官方文档给的Demo是在本地部署一个weather.py&#xff0c;然后用本地的Claude Desktop去访问该mcp服务器&#xff0c;从而完成工具的调用&#xff1a; 但是&#xff0c;问题来了&#xff0c;Claude Deskto…...

使用python帮助艺术家完成角色动画和服装模型等任务

使用python帮助艺术家完成角色动画和服装模型等任务 声明&#xff1a;克隆项目第 1 步&#xff1a;准备 Python 环境第 2 步&#xff1a;安装依赖✅ 第 3 步&#xff1a;运行项目主入口报错&#xff1a;报错&#xff1a;**降级 Python 到 3.10 或 3.11**推荐版本&#xff1a; 创…...

Python爬虫实战:基于 Python Scrapy 框架的百度指数数据爬取研究

一、引言 1.1 研究背景 在当今信息时代,市场调研和趋势分析对于企业和研究机构至关重要。百度指数能够精准反映关键词在百度搜索引擎上的热度变化情况,为市场需求洞察、消费者兴趣分析等提供了极具价值的数据支持。通过对百度指数数据的爬取和分析,企业可以及时调整营销策略…...

【Python】python系列之函数闭包概念

目录 一、函数 二、闭包 2.1 概念 2.2闭包的应用场景 2.3代码实例 实例 1&#xff1a;简单计数器闭包 实例 2&#xff1a;带参数的闭包 实例 3&#xff1a;闭包用于数据封装和隐藏 一、函数 函数是实现特定功能的代码段的封装&#xff0c;在需要时可以多次调用函数来实…...

【React】什么是 Hook

useStateuseEffectuseRef 什么是hook&#xff1f;16.8版本出现的新特性。可以在不编写class组件的情况下使用state以及其它的React特性 为什么有hook&#xff1f;class组件很难提取公共的重用的代码&#xff0c;然后反复使用&#xff1b;不编写类组件也可以使用类组件的状态st…...

香港科技大学广州|智能交通学域博士招生宣讲会—北京理工大学专场

香港科技大学广州&#xff5c;智能交通学域博士招生宣讲会—北京理工大学专场 &#x1f559;时间&#xff1a;4月23日&#xff08;星期三&#xff09;16:00 &#x1f3e0;地点&#xff1a;北京理工大学中关村校区唯实报告厅 &#x1f517;报名链接&#xff1a;https://www.wj…...

食品计算—Coarse-to-fine nutrition prediction

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(6):ながら 一边。。一边

日语学习-日语知识点小记-构建基础-JLPT-N4阶段&#xff08;6&#xff09;&#xff1a;ながら 一边。。一边 1、前言&#xff08;1&#xff09;情况说明&#xff08;2&#xff09;工程师的信仰 2、知识点&#xff08;1&#xff09;ながら1&#xff09;一边。。一边2&#xff0…...

Electricity Market Optimization(VI) - 机组组合模型以及 Gurobi 求解

本文参考链接&#xff1a;link \hspace{1.6em} 机组组合问题在电力系统中非常重要&#xff0c;这个问题也是一个优化问题&#xff0c;研究的就是如何调度现有的机组&#xff0c;调度的对象是以煤炭、石油、天然气为燃料的火力发电机以及水力发电机等可预测处理的发电机组&#…...

LoRA个关键超参数:`LoRA_rank`(通常简称为 `rank` 或 `r`)和 `LoRA_alpha`(通常简称为 `alpha`)

LoRA (Low-Rank Adaptation) 中的两个关键超参数&#xff1a;LoRA_rank&#xff08;通常简称为 rank 或 r&#xff09;和 LoRA_alpha&#xff08;通常简称为 alpha&#xff09;。 LoRA 的核心思想是&#xff0c;在对大型预训练模型&#xff08;如 LLM 或 Stable Diffusion&…...

Sql刷题日志(day3)

一、笔试 1、min(date_time)&#xff1a;求最早日期 2、mysql中distinct不能与order by 连用&#xff0c;可以用group by去重 二、面试 1、SQL中如何利用replace函数统计给定重复字段在字符串中的出现次数 (length(all_string)-length(all_string,目标字符串,))/length(ta…...

【AI插件开发】Notepad++ AI插件开发实践:实现对话窗口功能

引言 之前的文章已经介绍实现了AI对话窗口&#xff0c;但只有个空壳&#xff0c;没有实现功能。本次将集中完成对话窗口的功能&#xff0c;主要内容为&#xff1a; 模型动态切换&#xff1a;支持运行时加载配置的AI模型列表交互式输入处理&#xff1a;实现多行文本输入与Ctrl…...

[GESP202409 二级] 小杨的 N 字矩阵 题解

#include<bits/stdc.h> #define int long long using namespace std; int m, a[55][55], sum; signed main(){cin >> m;for(int i 1; i < m; i ){a[i][1] 1;//第一列a[i][m] 1;//第m列sum ;a[i][sum] 1;//斜着的}for(int i 1; i < m; i ){for(int j 1;…...