CAP应用
1.工作原理
CAP(Consistent,Available,Partition - tolerant)框架在.NET 中的工作原理。CAP 是一个用于.NET 的分布式事务解决方案,主要用于实现微服务架构中的数据一致性(实现分布式事务的最终一致性),其工作原理如下:
发布 / 订阅模型
-
CAP 基于发布 / 订阅模式来处理消息。当一个应用程序需要执行一个可能涉及多个微服务的数据操作时,它会将相关的操作封装成一个消息,并将其发布到消息队列中。其他对该消息感兴趣的微服务则会订阅这个消息队列,当消息到达时,订阅者会接收并处理消息。
本地事务与消息持久化
-
在发布消息的过程中,CAP 使用了本地事务来确保消息的可靠性。当一个服务执行一个业务操作(如数据库插入、更新等)时,它会将这个操作与消息的发布放在同一个本地事务中。如果业务操作成功,那么消息也会被成功持久化到数据库的Published表中;如果业务操作失败,那么整个事务回滚,消息也不会被发布。这样就保证了消息与业务数据的一致性。
消息发送与重试机制
-
消息持久化后,CAP 会尝试将消息发送到消息队列(如 RabbitMQ、Kafka 等)。如果消息发送失败,CAP 会根据预设的重试策略进行重试。重试机制可以确保在消息队列暂时不可用或出现网络故障等情况下,消息不会丢失,最终能够成功发送到消息队列。
消费者接收与处理消息
-
订阅了消息队列的消费者服务会从队列中接收消息,并根据消息的内容执行相应的业务逻辑。在处理消息时,消费者也会使用本地事务来确保消息处理的原子性。如果消息处理成功,消费者会将消息标记为已处理,并从Received表中删除相关记录;如果处理失败,消费者可以根据具体情况选择重试或进行其他处理方式。
分布式事务一致性保证
-
通过上述的发布 / 订阅模型、本地事务与消息持久化、消息发送与重试机制以及消费者接收与处理消息等一系列操作,CAP 框架实现了在分布式系统中跨多个微服务的数据一致性。即使在出现网络分区、服务故障等情况下,CAP 也能够通过消息的持久化和重试等机制,保证数据在最终一致性的前提下进行可靠的传输和处理。
CAP 框架通过巧妙地结合本地事务、消息队列和重试机制等技术,为.NET 微服务架构提供了一种高效、可靠的分布式事务解决方案,帮助开发者在复杂的分布式环境中轻松实现数据的一致性和可靠性。
2.作用
实现分布式事务的最终一致性
- 在分布式系统中,保证数据一致性颇具挑战,如电商场景里用户下单需同时更新库存、订单和支付信息,若服务失败易致数据不一致。CAP 不采用两阶段提交(2PC) ,而是用本地消息表 + MQ(如 RabbitMQ、Kafka 等消息队列 )的异步确保方式。具体过程为:
- 业务操作与事件发布:服务完成操作后,发布含操作类型、数据标识等信息的事件到消息队列。
- 事件存储与确认:发布的事件存于指定介质以防丢失,CAP 等待事件处理确认。
- 事件处理与重试机制:其他服务接收事件并处理,成功则发送确认,失败则 CAP 按设定策略重试,直至成功或达最大重试次数。为避免重复处理致数据不一致,处理逻辑需保证幂等性。
- 数据一致性检查与补偿:必要时,CAP 定期检查数据一致性,通过补偿机制修复不一致问题。
- 充当高可用的 EventBus(事件总线)
- 实现了 EventBus 的发布 / 订阅功能,借助本地消息表对消息持久化。当消息队列宕机或连接失败,消息也不会丢失。比如在复杂业务系统中,各微服务可通过 CAP 实现的 EventBus 进行通信。一个服务发布事件(如订单创建事件 ),其他订阅该事件的服务(如库存服务、物流服务 )就能收到通知并执行相应操作(如扣减库存、安排发货 ) 。
- 实际使用时,需引用相关包(基本包、消息层包、数据库包 ) ,配置本地消息记录库,生产者通过 _capBus.PublishAsync 方法发布消息,消费者在 Controller 或服务层通过 [CapSubscribe] 特性标记方法来订阅处理消息 。 此外,在应用中要注意确保幂等性、合理配置重试策略、搭建监控与报警机制以及进行性能调优 。
3.Published 和Received 表作用
在.NET CAP(一个用于解决微服务或分布式系统中分布式事务问题的开源项目 )中:
Published 表作用
-
消息暂存:当生产者服务执行本地事务(如创建订单 )时,会将相关事件消息(如订单创建事件 )插入到该表,此时消息状态为未发布。这是为了确保消息和本地业务事务的原子性,即要么两者都成功执行,要么都失败回滚,避免消息丢失。
-
发布状态记录:CAP 会扫描该表,将未发布消息发送到消息队列(如 RabbitMQ、Kafka ) 。消息成功发送后,会更新该表中消息的状态为已发布,用于记录消息的发布过程和状态。
-
保障数据一致性:通过该表对消息的存储和管理,为实现分布式事务的最终一致性提供支持。比如在分布式系统中,不同服务通过消息进行交互,该表可确保消息按正确顺序、在合适时机被发送到消息队列,进而被消费者服务接收处理,保证各服务间数据状态的一致。
-
故障恢复依据:当系统出现故障(如消息队列短暂不可用 ) ,重启后可依据该表中未成功发布的消息记录,进行重试发送操作,恢复消息传递流程,保障系统可靠运行。
Received 表作用
-
消息接收记录:消费者从消息队列接收消息后,该表用于记录已接收的消息。记录内容包括消息的唯一标识、消息体、接收时间、消息来源等相关信息,方便对消息的消费情况进行跟踪和审计。
-
处理重复消费:通过记录已处理消息的相关信息(如消息 ID ) ,帮助消费者判断接收的消息是否已被处理过,以实现幂等消费。当消费者接收到消息时,会检查该表中是否已有相同标识的消息记录,若存在则可避免重复处理,确保即使在网络抖动、消息重发等情况下,也不会因重复消费导致数据不一致等问题。
-
监控与排查:开发人员可通过查看该表,了解消息的接收和处理情况,排查消息消费过程中出现的问题。比如,若发现某类消息一直未被正确处理,可根据表中记录进一步分析是消息格式问题、消费者服务异常还是其他原因,便于定位和解决问题,保障分布式系统的正常运行。
4.CapSubscribe的作用
[CapSubscribe]是.NET CAP 框架中的一个特性(Attribute)1。
作用
标识事件处理方法:用于标记那些需要处理特定事件的方法,告诉 CAP 框架当有相关事件发布时,需要调用这些被标记的方法来进行处理1。
实现消息订阅:使服务能够订阅由其他服务发布的事件消息,从而实现微服务之间基于事件的异步通信和交互,以保证各服务间的数据同步和业务流程的协同1。
使用方法
在 Controller 中使用:如果处理事件的方法在 Controller 中,直接在 Action 方法上添加[CapSubscribe]特性即可。例如:
csharp[Route("api/[controller]")][ApiController]public class MyController : ControllerBase{[CapSubscribe("xxx.services.show.time")]public IActionResult HandleShowTime(DateTime time){// 处理接收到的消息,例如记录日志、更新数据库等操作Console.WriteLine($"Received time: {time}");return Ok();}}
在非 Controller 类中使用:若订阅方法不在 Controller 中,订阅的类需要继承ICapSubscribe接口。例如:
csharppublic class MySubscriberService : ICapSubscribe{[CapSubscribe("xxx.services.show.time")]public void HandleShowTime(DateTime time){// 处理接收到的消息Console.WriteLine($"Received time: {time}");}}然后在Startup.cs中的ConfigureServices方法中注入该服务类:csharpservices.AddTransient<MySubscriberService>();
指定参数:
Name参数:用于指定订阅的消息名称,对应通过_capBus.PublishAsync("name", ...)发布消息时指定的名称。在不同的消息队列中,它对应不同的项,如在 RabbitMQ 中对应路由键(routing key),在 Kafka 中对应主题(topic)等。
Group参数:可选参数,用于将订阅者放置在一个单独的消费者组中。具有相同名称但不同组的订阅者都会接收消息;而同一组内具有相同名称的订阅者只有一个会接收消息。
GroupConcurrent参数:可选参数,用于设置订阅者并发执行的并行度。如果不指定Group参数,CAP 会自动使用Name的值创建一个组。需要注意的是,该设置仅适用于新消息,重试的消息不受并发限制。
在使用[CapSubscribe]前,需在项目中引入 CAP 相关的 NuGet 包,并在Startup.cs中进行 CAP 的配置,包括选择消息队列(如x.UseRabbitMQ("ConnectionStrings"))和存储介质(如x.UseSqlServer("数据库连接字符串"))
5.案例说明
以下是一个完整的示例,展示了如何使用 CAP、SQL Server 和 RabbitMQ 来实现下单服务器和订单处理服务器之间的协作,完成订单处理流程。
项目结构和整体流程概述
-
下单服务器(OrderPlacingServer):一个.NET Core Web API 项目,负责接收用户的下单请求,执行本地订单数据插入操作,并通过 CAP 发布订单消息到消息队列。
-
订单处理服务器(OrderProcessingServer):一个.NET Core Console 应用项目,订阅来自消息队列的订单消息,处理订单逻辑并更新订单状态。
-
共享项目(OrderShared):用于存放共享的实体类和数据库上下文,两个服务器项目都会引用该项目。
整体流程如下:
-
用户在下单服务器发起下单请求。
-
下单服务器执行本地事务插入订单数据到 SQL Server 数据库,并通过 CAP 将订单消息发布到 RabbitMQ 队列。
-
订单处理服务器从 RabbitMQ 队列接收订单消息,执行订单处理逻辑,更新订单状态并保存到 SQL Server 数据库。
详细代码及解释
1. OrderShared 项目
csharp
// Order.cs
using System;
using Microsoft.EntityFrameworkCore;namespace OrderShared
{public class Order{public int OrderId { get; set; }public string CustomerName { get; set; }public decimal TotalAmount { get; set; }public string Status { get; set; } = "Placed"; // 初始状态为已下单}public class OrderDbContext : DbContext{public OrderDbContext(DbContextOptions<OrderDbContext> options) : base(options){}public DbSet<Order> Orders { get; set; }protected override void OnModelCreating(ModelBuilder modelBuilder){// 可以在这里配置实体关系等base.OnModelCreating(modelBuilder);}}
}
解释:
-
Order
类定义了订单的实体结构,包含订单 ID、客户名称、总金额和订单状态等属性。 -
OrderDbContext
是继承自DbContext
的数据库上下文类,用于与 SQL Server 数据库进行交互,定义了Orders
属性来操作Order
实体的集合。
2. OrderPlacingServer 项目(.NET Core Web API)
csharp
// Startup.cs
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using DotNetCore.CAP;
using OrderShared;namespace OrderPlacingServer
{public class Startup{public Startup(IConfiguration configuration){Configuration = configuration;}public IConfiguration Configuration { get; }public void ConfigureServices(IServiceCollection services){// 配置SQL Server数据库连接services.AddDbContext<OrderDbContext>(options =>options.UseSqlServer(Configuration.GetConnectionString("OrderDbConnection")));// 配置CAPservices.AddCap(x =>{// 使用SQL Server作为存储x.UseEntityFramework<OrderDbContext>();// 使用RabbitMQ作为消息队列x.UseRabbitMQ(Configuration.GetConnectionString("RabbitMQConnection"));// 设置重试次数和间隔x.FailedRetryCount = 3;x.FailedRetryInterval = 5000;});services.AddControllers();}public void Configure(IApplicationBuilder app, IWebHostEnvironment env){if (env.IsDevelopment()){app.UseDeveloperExceptionPage();}app.UseRouting();app.UseAuthorization();app.UseEndpoints(endpoints =>{endpoints.MapControllers();});// 注册CAPapp.UseCap();}}
}// OrdersController.cs
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using DotNetCore.CAP;
using OrderShared;namespace OrderPlacingServer.Controllers
{[Route("api/[controller]")][ApiController]public class OrdersController : ControllerBase{private readonly ICapPublisher _capPublisher;public OrdersController(ICapPublisher capPublisher){_capPublisher = capPublisher;}[HttpPost]public async Task<IActionResult> PlaceOrder(Order order){using (var scope = HttpContext.RequestServices.CreateScope()){var dbContext = scope.ServiceProvider.GetRequiredService<OrderDbContext>();// 开启本地事务using (var transaction = dbContext.Database.BeginTransaction(_capPublisher)){try{// 插入订单数据到本地数据库dbContext.Orders.Add(order);await dbContext.SaveChangesAsync();// 发布订单消息到CAPawait _capPublisher.PublishAsync("order.process", order);// 提交事务transaction.Commit();return Ok("Order placed successfully");}catch (Exception ex){// 回滚事务transaction.Rollback();return BadRequest($"Failed to place order: {ex.Message}");}}}}}
}
解释:
-
Startup.cs
:配置了 SQL Server 数据库连接,使用OrderDbContext
来操作数据库。配置 CAP,指定使用 SQL Server 作为消息存储,RabbitMQ 作为消息队列,并设置了重试策略。在Configure
方法中注册了 CAP 中间件。 -
OrdersController.cs
:PlaceOrder
方法接收订单数据,通过ICapPublisher
发布订单消息到名为order.process
的主题。在本地事务中,先插入订单数据到数据库,然后发布消息,如果操作成功则提交事务,失败则回滚事务。
3. OrderProcessingServer 项目(.NET Core Console 应用)
csharp
// Program.cs
using System;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using DotNetCore.CAP;
using OrderShared;namespace OrderProcessingServer
{class Program{static async Task Main(string[] args){var host = Host.CreateDefaultBuilder(args).ConfigureServices((hostContext, services) =>{// 配置SQL Server数据库连接services.AddDbContext<OrderDbContext>(options =>options.UseSqlServer(hostContext.Configuration.GetConnectionString("OrderDbConnection")));// 配置CAPservices.AddCap(x =>{x.UseEntityFramework<OrderDbContext>();x.UseRabbitMQ(hostContext.Configuration.GetConnectionString("RabbitMQConnection"));});// 注册订单消费者服务services.AddHostedService<OrderConsumerHostedService>();}).Build();await host.RunAsync();}}// OrderConsumer.csusing System.Threading.Tasks;using DotNetCore.CAP;using OrderShared;public class OrderConsumer : ICapSubscribe{private readonly OrderDbContext _dbContext;public OrderConsumer(OrderDbContext dbContext){_dbContext = dbContext;}[CapSubscribe("order.process")]public async Task ProcessOrder(Order order){try{// 处理订单逻辑,例如更新订单状态为已处理order.Status = "Processed";_dbContext.Orders.Update(order);await _dbContext.SaveChangesAsync();System.Console.WriteLine($"Processed order: {order.OrderId}");}catch (Exception ex){System.Console.WriteLine($"Failed to process order: {ex.Message}");throw; // 让CAP进行重试}}}// OrderConsumerHostedService.csusing System.Threading;using System.Threading.Tasks;using Microsoft.Extensions.Hosting;using Microsoft.Extensions.Logging;using DotNetCore.CAP;public class OrderConsumerHostedService : BackgroundService{private readonly ICapPublisher _capPublisher;private readonly ILogger<OrderConsumerHostedService> _logger;public OrderConsumerHostedService(ICapPublisher capPublisher, ILogger<OrderConsumerHostedService> logger){_capPublisher = capPublisher;_logger = logger;}protected override async Task ExecuteAsync(CancellationToken stoppingToken){while (!stoppingToken.IsCancellationRequested){// 这里可以做一些定时任务相关的操作,目前只是简单等待await Task.Delay(1000, stoppingToken);}}}
}
解释:
-
Program.cs
:创建了一个.NET Core 主机,配置了 SQL Server 数据库连接和 CAP。注册了OrderConsumerHostedService
,用于在后台运行应用并处理消息。 -
OrderConsumer.cs
:OrderConsumer
类实现了ICapSubscribe
接口,ProcessOrder
方法被[CapSubscribe("order.process")]
标记,用于处理接收到的订单消息。在方法中更新订单状态并保存到数据库,如果处理失败则抛出异常让 CAP 进行重试。 -
OrderConsumerHostedService.cs
:OrderConsumerHostedService
继承自BackgroundService
,在ExecuteAsync
方法中可以实现一些定时任务逻辑,目前只是简单地等待,确保应用持续运行以接收和处理消息。
配置和注意事项
-
配置文件:在两个项目的
appsettings.json
中配置 SQL Server 数据库连接字符串和 RabbitMQ 连接字符串。
json
{"ConnectionStrings": {"OrderDbConnection": "Data Source=YOUR_SERVER_NAME;Initial Catalog=YOUR_DATABASE_NAME;User ID=YOUR_USERNAME;Password=YOUR_PASSWORD","RabbitMQConnection": "host=YOUR_RABBITMQ_HOST;port=YOUR_RABBITMQ_PORT;user=YOUR_USERNAME;password=YOUR_PASSWORD"}
}
-
幂等性:订单处理方法
ProcessOrder
应保证幂等性,避免重复处理导致数据不一致。 -
异常处理:合理处理异常,确保消息能够正确重试或进行其他处理。
-
数据一致性:下单服务器的本地事务和消息发布应保证原子性,确保订单数据和消息状态的一致性。
-
消息队列健康:确保 RabbitMQ 服务正常运行,网络连接稳定,避免消息丢失或积压。
通过以上代码和配置,可以实现下单服务器和订单处理服务器之间基于 CAP、SQL Server 和 RabbitMQ 的订单处理流程。
相关文章:
CAP应用
1.工作原理 CAP(Consistent,Available,Partition - tolerant)框架在.NET 中的工作原理。CAP 是一个用于.NET 的分布式事务解决方案,主要用于实现微服务架构中的数据一致性(实现分布式事务的最终一致性&…...
典型操作系统内核架构
在典型操作系统架构(如下图所示)中,内核负责以安全、公平的方式为多个应用程序管理和共享硬件资源。 内核通过一组 API(即系统调用)向应用程序提供服务。这些 API 不同于常规库函数,因其是用户模式到内核模…...
AWS Redshift的使用场景及一些常见问题
Redshift 不是关系型数据库, 提供了Amazon Redshift Serverless 和 Amazon Redshift 都是构建于 Redshift 数仓引擎之上的,但它们适用的场景不同。Redshift和Dynamodb都可以存储数据, 分别怎么选择? 这里记录一些常见的问题和场景。 1. 如何选择用Amazon Redshift…...
**searchProperties 是什么,python中**是什么:解包字典的操作符
searchProperties 是什么,python中是什么:解包字典的操作符 在 Python 中,** 是用于解包字典的操作符,**searchProperties 是一个可变关键字参数。它允许函数接受任意数量的关键字参数,这些参数会被收集到一个字典中,字典的键是参数名,值是参数对应的值。 在 ButtonCon…...
.NET MCP 文档
MCP 概述 MCP(Model Context Protocol)是由 Anthropic 推出的一种开放协议,类似 AI 的 USB-C 扩展坞,用于在大模型和数据源之间建立安全的通信(授权),让 AI 应用能够安全地访问和操作本地或远程…...
07软件测试需求分析案例-修改用户信息
修改用户信息是后台管理菜单的一个功能模块,只有admin才有修改权限。包括查询用户名进行显示用户相关信息,并且修改用户相关信息的功能。 1.1 通读文档 通读需求规格说明书是提取信息,提出问题,输出具有逻辑、规则、流程的业务…...
第九届“创客中国”中小企业创新创业大赛总决赛企业组三等奖项目—基于AI智能代码疫苗技术的数字供应链安全解决方案
项目名称:基于AI智能代码疫苗技术的数字供应链安全解决方案 企业名称:北京安普诺信息技术有限公司(悬镜安全) 项目简介: 基于AI智能代码疫苗技术的数字供应链安全解决方案,悬镜安全在全球范围内首创…...
企业级RAG行业应用落地方案——阿里云百炼
行业痛点分析 这张图主要围绕“行业痛点锚定”展开,通过雷达图和表格结合的方式,分析电商选品在不同维度下的情况: 分析对象:聚焦电商选品。维度展示:从可结构化程度、重复性、数据可得性、人机互动性、AI带来的价值这…...
Mac切换node版本
Mac切换node版本 1.首先安装n模块: sudo npm install -g n 2.升级node.js到最新稳定版 sudo n stable 3.升级到最新版 sudo n latest 4.n后面也可以跟随版本号,升级到任意版本 sudo n v0.10.26或sudo n 0.10.26 5.切换使用版本 sudo n 7.10.0 6.删除制定版本…...
从零开始学A2A一:A2A 协议概述与核心概念
A2A 协议概述与核心概念 学习目标 基础理解 掌握A2A协议的基本概念和背景理解协议的设计原则和核心思想了解协议在AI领域的重要性 技术掌握 熟悉A2A协议的核心功能组件掌握能力发现和任务管理机制理解多模态交互和安全通信原则 实践应用 能够设计基于A2A的智能体系统掌握协议…...
科普:如何通过ROC曲线,确定二分类的“理论阈值”
在二分类问题中,已知预测概率(如逻辑回归、神经网络输出的概率值)时,阈值的选择直接影响分类结果(正/负样本判定)。 一、实践中的阈值选择方法 1. 基于业务目标的调整 最大化准确率:适用于样…...
Cherry Studio + MCP,从0到1保姆教程,3个场景体验
📺 详细操作以视频方式呈现,视频地址周五会更新出来 💯 鉴于很多观众网络环境受限,文末提供所需安装文件网盘分享 💬 什么是 MCP ? MCP(Model Context Protocol,MCP)模型…...
Docker学习笔记-docker安装、删除
一、在centOS 7中docker的默认安装目录 # Docker 主配置文件目录 ls /etc/docker# Docker 数据目录(镜像、容器、卷等) ls /var/lib/docker# Docker 可执行文件路径 which docker # 输出类似 /usr/bin/docker 二、docker文件目录说明 目录/文件用途/…...
visual studio 常用的快捷键(已经熟悉的就不记录了)
以下是 Visual Studio 中最常用的快捷键分类整理,涵盖代码编辑、调试、导航等核心场景: 一、生成与编译 生成解决方案 Ctrl Shift B 一键编译整个解决方案,检查编译错误(最核心的生成操作)编译当前文件 Ctrl F…...
使用人工智能大模型腾讯元宝,如何做课题研究?
今天我们学习使用人工智能大模型腾讯元宝,如何做课题研究? 手把手学习视频地址:https://edu.csdn.net/learn/40402/666424 在腾讯元宝对话框中输入如何协助老师做课题(申报书、开题报告、中期报告、结题报告)&#x…...
开源模型应用落地-模型上下文协议(MCP)-第三方MCP Server实战指南(五)
一、前言 在AI技术高速发展的2025年,如何让大语言模型(LLM)更灵活地调用外部工具与数据,成为开发者关注的焦点。模型上下文协议(MCP)作为AI与外部资源的“万能接口”,通过标准化交互框架解决了传统集成中的碎片化问题。而第三方MCP Server的引入,进一步降低了开发门…...
python每日一练
题目一 输入10个整数,输出其中不同的数,即如果一个数出现了多次,只输出一次(要求按照每一个不同的数第一次出现的顺序输出)。 解题 错误题解 a list(map(int,input().split())) b [] b.append(a[i]) for i in range(2,11):if a[i] not in b:b.append(a[i]) print(b)但是会…...
跨境贸易之常见的贸易术语
外贸出口中经常会听到FOB、CIF、DDP各种术语,这些都是什么意思呢? 今天我们来介绍一下他们的确切含义。一般来说你听到的这些话语都是表示交货的方式。 如果普通的贸易过程大家一听就明白的,就是货到付款,款到发货,支…...
KingbaseES之KDts迁移SQLServer
项目适配迁移SQLServer至金仓,今天写写KDts-WEB版迁移工具迁移SQLServer至KingbaseES的步骤,以及迁移注意事项. SQLServer版本:SQLServer2012 KingbaseES版本:V009R004C011(SQLServer兼容版) --1.进入数据库客户端工具KDTS工具目录,启动KDts服务: [king…...
Rust编程学习(一): 变量与数据类型
我们先从Rust基本的变量声明定义与数据类型开始学习,了解这门语言基本特性。 1 变量与可变性 变量声明 变量声明以let关键字开头,x为变量名,变量名后紧跟冒号和数据类型,但是rust编译器有自动推导变量类型的功能,可以省略显式的声…...
Java 在人工智能领域的突围:从企业级架构到边缘计算的技术革新
一、Java AI 的底层逻辑:从语言特性到生态重构 在 Python 占据 AI 开发主导地位的当下,Java 正通过技术重构实现突围。作为拥有 30 年企业级开发经验的编程语言,Java 的核心优势在于强类型安全、内存管理能力和分布式系统支持,这…...
[极客大挑战 2019]HardSQL1
打开网页,貌似存在SLQ注入,尝试闭合单引号 才生报错信息,但是尝试联合注入 不出意外应该是被过滤了,没法使用,可以考虑一下报错注入 这里可以使用字典爆破一下,利用页面返回情况,看看哪些关键词…...
深入剖析C++中 String 类的模拟实现
目录 引言 一、基础框架搭建 成员变量与基本构造函数 析构函数 二、拷贝与赋值操作 深拷贝的拷贝构造函数 赋值运算符重载 三、字符串操作功能实现 获取字符串长度 字符串拼接 字符串比较 字符访问 四、迭代器相关实现(简单模拟) 迭代器类型…...
KWDB创作者计划— KWDB技术范式革命:从数据存储到认知进化的架构跃迁
引言:数据库的认知觉醒 在AIoT设备数量突破万亿、边缘计算节点算力总和超越云端的2025年,传统数据库的"存储-计算"二元结构正面临认知维度缺失的困境。当工业数字孪生需要实时推演百万设备状态,城市大脑需处理多模态时空数据时&…...
【后端开发】Spring配置文件
文章目录 配置文件properties配置文件基本语法读取配置文件 yml配置文件基本语法读取配置文件配置空字符串及null单双引号配置对象配置集合配置Map 优缺点优点缺点 配置文件 硬编码是将数据直接嵌入到程序或其他可执行对象的源代码中,也就是常说的"代码写死&q…...
探讨HMI(人机界面)设计原则,如何通过优秀的设计提升操作效率和用户体验
在物联网与人工智能深度渗透的今天,人机界面(Human-Machine Interface, HMI)已成为连接数字世界与物理世界的神经末梢。优秀的HMI设计不仅关乎视觉美感,更是认知工程、信息架构与交互范式的协同创新。本文从神经认知科学原理出发&…...
网络7 配置网卡 路由表
我配置了两张网卡,一个是仅主机模式,一个是NAT模式。刚才NAT模式动态配置下,ping百度ping的通,路由表中只显示NAT的网关。我把NAT模式修改为静态IP,路由表中显示仅主机模式的网关和NAT模式的网关,ping百度ping不通了 …...
InnoDB的MVCC实现原理?MVCC如何实现不同事务隔离级别?MVCC优缺点?
概念 InnoDB的MVCC(Multi-Version Concurrency Control)即多版本并发控制,是一种用于处理并发事务的机制。它通过保存数据在不同时间点的多个版本,让不同事务在同一时刻可以看到不同版本的数据,以此来减少锁竞争&…...
同构应用开发
以下是关于 同构应用(Isomorphic/Universal Application)开发 的系统知识梳理,涵盖核心概念、技术实现、性能优化及工程实践,帮助我们全面掌握这一现代Web开发范式: 一、同构应用核心概念 1. 定义与价值 定义:同一套代码在服务端(Node.js)和客户端(浏览器)运行,实现…...
如何制定有效的风险应对计划
制定有效的风险应对计划的核心在于: 识别潜在风险、评估风险的影响与概率、选择合适的应对策略、建立动态监控和反馈机制。 其中,识别潜在风险是最为关键的第一步。只有准确识别出可能的风险,才能在后续的评估、应对、监控等环节中做到有的放…...
使用wpa_cli和wpa_supplicant配置Liunx开发板的wlan0无线网
目录 1 简单介绍下wpa_cli和wpa_supplicant 1.1 wpa_supplicant 简介 1.2 wpa_cli 简介 1.3 它们之间的关系 2 启动wpa_supplicant 3 使用rz工具把wpa_cli命令上传到开发板 4 用wpa_cli配置网络 参考文献: 1 简单介绍下wpa_cli和wpa_supplicant 1.1 wpa_su…...
深度学习模型的概述与应用
📌 友情提示: 本文内容由银河易创AI(https://ai.eaigx.com)创作平台的gpt-4-turbo模型生成,旨在提供技术参考与灵感启发。文中观点或代码示例需结合实际情况验证,建议读者通过官方文档或实践进一步确认其准…...
基于Ubuntu系统搭建51单片机开发环境的详细教程
一、环境搭建 1. 安装SDCC编译器 SDCC(Small Device C Compiler)是Linux下常用的开源51单片机编译器,支持多种芯片架构。 安装命令: sudo apt update sudo apt install sdcc 验证安装:输入 sdcc -v,若显…...
通义灵码助力Neo4J开发:快速上手与智能编码技巧
在 Web 应用开发中,Neo4J 作为一种图数据库,用于存储节点及节点间的关系。当图结构复杂化时,关系型数据库的查找效率会显著降低,甚至无法有效查找,这时 Neo4J 的优势便凸显出来。然而,由于其独特的应用场景…...
项目班——0408
qt的多线程开发 一、并发、并行的概念: 1. 并发:多个任务在同一时间段内交替执行(可能共享同一资源),但不一定同时发生。 核心思想:通过快速切换任务(例如时间片轮转)模拟“同时进…...
【Linux】42.网络基础(2.4)
文章目录 2.3 TCP协议2.3.10 拥塞控制2.3.11 延迟应答2.3.12 捎带应答2.3.13 面向字节流2.3.14 粘包问题2.3.15 TCP异常情况2.3.16 TCP小结2.3.17 基于TCP应用层协议 2.3 TCP协议 2.3.10 拥塞控制 虽然TCP有了滑动窗口这个大杀器, 能够高效可靠的发送大量的数据. 但是如果在刚…...
大模型在直肠癌诊疗全流程预测及应用研究报告
目录 一、引言 1.1 研究背景与目的 1.2 国内外研究现状 1.3 研究方法与创新点 二、大模型预测直肠癌的原理与技术基础 2.1 大模型技术概述 2.2 用于直肠癌预测的数据来源 2.3 模型构建与训练过程 三、术前预测 3.1 肿瘤分期预测 3.1.1 基于影像组学的 T 分期预测模型…...
Ceph块存储
#### 一、Ceph块存储 ##### 镜像快照管理 > 实现数据备份、恢复和测试等操作,而不影响原始数据,提高系统的可靠性和可用性。 shell # 创建镜像 rbd create img1 --size 10G # 映射镜像到本地并格式化挂载 rbd map img1 mkfs -t xfs /dev/rbd0 moun…...
【转载翻译】Open3D和PCL的一些比较
转自个人博客:【转载翻译】Open3D和PCL的一些比较 本人在逛Github时,发现一个解答Open3D和PCL对比的小文章,还挺有参考价值的 原文:https://github.com/LaplaceKorea/investigate_open3d_vs_pcl/blob/main/README.rst#whats-the-s…...
ebpf: CO-RE, BTF, and Libbpf(二)
本文内容主要来源于Learning eBPF,可阅读原文了解更全面的内容。 本文涉及源码也来自于书中对应的github:https://github.com/lizrice/learning-ebpf/ 概述 上篇文章主要讲了CO-RE最关键的一环:BTF,了解其如何记录内核中的数据结…...
RHCE第五章:NFS服务器
一、NFS(network file system) 网络文件系统:在互联网中共享服务器中的文件资源(用于Linux主机共享文件的协议)。 使用nfs服务需要安装:nfs-utils 以及 rpcbind nfs-utils : 提供nfs服务的程序 rpcbind :…...
qt(vs2010) 手动配置moc生成规则
在 Visual Studio 2010 中写QT项目时,有时需要 手动配置 MOC 生成规则 操作步骤: 右键 .h 文件 → Properties。在 Configuration Properties > Custom Build Tool 中: Command Line:"$(QTDIR)\bin\moc.exe" "%(FullPath)…...
mongodb 安装配置
1.下载 官网下载地址:MongoDB Community Download | MongoDB 2.使用解压包 解压包安装:https://pan.baidu.com/s/1Er56twK9UfxoExuCPlJjhg 提取码: 26aj 3.配置环境: (1)mongodb安装包位置: …...
Java多态课堂练习题
Java多态课堂练习题 题目:动物乐园的多态展示 背景设定: 设计一个动物乐园程序,展示不同类型动物的行为特点,要求使用多态特性实现。 1. 基础类设计(已给出部分代码) // 基类:动物 abstract…...
Android Studio 实现自定义全局悬浮按钮
文章目录 一、基础实现方案1. 使用 WindowManager 实现全局悬浮窗2. 布局文件 (res/layout/floating_button.xml)3. 圆形背景 (res/drawable/circle_background.xml)4. 启动服务 二、权限处理1. AndroidManifest.xml 中添加权限2. 检查并请求权限 三、高级功能扩展1. 添加动画效…...
Android Studio 中文字大小的单位详解
文章目录 一、Android 中的尺寸单位1. dp (Density-independent Pixels - 密度无关像素)2. sp (Scale-independent Pixels - 可缩放像素)3. px (Pixels - 像素)4. pt (Points - 磅)5. mm (Millimeters - 毫米) 和 in (Inches - 英寸) 二、文字大小单位的最佳实践1. 始终使用 sp…...
Project ERROR: liblightdm-qt5-3 development package not found问题的解决方法
问题描述:使用make命令进行ukui-greeter-Debian构建时出现Project ERROR: liblightdm-qt5-3 development package not found错误,具体如图: 问题原因:缺乏liblightdm-qt5-3 development软件包 解决方法:安装liblightd…...
基于QT(C++)+SQLServer实现(WinForm)超市管理系统
超市库存管理系 使用 QT 开发,SQLserver 数据库配置 ODBC 数据源:QSQLServer 超市库存管理系统需求规格说明书 1 引言 校园超市的库存物资管理往往是很复杂、很繁琐的。由于所掌握的物资种类众多,订货、管理的渠道各有差异,各个校园超市之间的管理体制…...
06 - 多线程-JUC并发编程-原子类(二)
上一章,讲解java (java.util.concurrent.atomic) 包中的 支持基本数据类型的原子类,以及支持数组类型的原子类,这一章继续讲解支持对实体类的原子类,以及原子类型的修改器。 还有最后java (java…...
HTML:网页的骨架 — 入门详解教程
HTML:网页的骨架 — 入门详解教程 HTML(HyperText Markup Language,超文本标记语言)是构建网页的基础语言,负责定义网页的结构和内容。无论是简单的个人博客,还是复杂的企业网站,HTML都是不可或…...