LoongFlow:专为龙芯架构打造的高性能开源工作流引擎

news2026/4/29 12:50:16
1. 项目概述LoongFlow一个为龙芯生态量身定制的开源工作流引擎如果你在龙芯平台上开发过应用尤其是那些涉及复杂业务流程、需要自动化编排的系统你大概率会和我有同样的感受现有的主流工作流引擎在龙芯这个独特的生态里总有些“水土不服”。要么是依赖的底层库在龙芯上编译困难要么是性能表现不尽如人意再或者就是社区支持力度不够出了问题只能自己硬着头皮啃源码。baidu-baige/LoongFlow这个项目的出现可以说精准地击中了这个痛点。它不是一个通用工作流引擎的简单移植而是从设计之初就深度拥抱龙芯架构LoongArch旨在成为龙芯生态中流程自动化的“基础设施”。简单来说LoongFlow是一个轻量级、高性能、云原生的开源工作流引擎。它的核心目标是为运行在龙芯服务器上的应用提供一个稳定、高效、易用的流程编排与执行框架。你可以把它想象成龙芯版的企业级“自动化流水线”无论是数据处理、定时任务调度、微服务编排还是复杂的业务审批流LoongFlow都能帮你清晰地定义、可靠地执行、并直观地监控每一个步骤。它的开源意味着我们这些开发者终于有了一个可以深度参与、共同打磨的“自家人”工具这对于推动整个龙芯应用生态的成熟至关重要。2. 核心设计理念与架构拆解2.1 为什么需要“龙芯原生”的工作流引擎在深入LoongFlow的架构之前我们得先搞清楚一个根本问题为什么不能直接用现成的、成熟的开源工作流引擎比如Camunda、Flowable或者Airflow答案在于指令集架构的差异和生态的完整性。龙芯采用的LoongArch指令集是一个从底层完全自主设计的架构。这意味着所有为x86或ARM架构编译的二进制软件都无法直接在龙芯上运行。虽然通过二进制翻译或虚拟化技术可以解决一部分兼容性问题但对于工作流引擎这类对性能、稳定性和底层系统调用有较高要求的基础软件直接使用翻译层会引入不可预测的性能损耗和潜在的稳定性风险。其次许多开源项目在构建时会依赖大量针对特定架构优化的底层库如加密库、压缩库。这些库在LoongArch上的适配和完善度直接决定了上层应用的运行效率。LoongFlow选择“原生开发”的道路就是为了彻底规避这些兼容性陷阱从编译器优化、内存模型对齐到系统调用都针对LoongArch进行深度调优确保引擎能充分发挥龙芯硬件的性能。2.2 总体架构轻量、解耦与可扩展LoongFlow的架构设计充分体现了现代云原生应用的思想。它不是一个大而全的“巨无霸”系统而是采用微内核和插件化的设计将核心流程引擎与外围组件如任务执行器、持久化存储、用户界面解耦。这种设计带来了极高的灵活性。整个系统可以划分为几个核心层次流程定义层支持通过图形化设计器或标准的BPMN 2.0 XML文件来定义工作流。这是业务的蓝图。核心引擎层这是LoongFlow的“大脑”。它负责解析流程定义驱动流程实例的状态流转做出路由决策比如根据网关条件选择下一个节点。这一层完全用适合系统编程的语言如Rust或C实现并针对LoongArch进行指令级优化追求极致的解析与调度效率。任务执行层引擎本身不负责具体业务逻辑的执行。它通过定义良好的接口如HTTP、gRPC将任务派发给外部的“工作者”Worker。这些工作者可以用任何语言编写Java, Python, Go等只需实现对应的客户端SDK即可。这种设计使得业务集成变得非常简单也便于利用龙芯生态中已有的各种语言运行时。持久化与状态层流程实例的状态、历史日志等需要持久化。LoongFlow默认支持高性能的关系数据库如PostgreSQL, MySQL并且存储接口是插件化的理论上可以扩展到任何满足ACID特性的存储系统。控制与观测层提供丰富的RESTful API用于集成同时包含一个Web管理控制台用于流程的部署、监控、实例管理和问题诊断。注意这种“引擎调度外部执行”的模式是LoongFlow高性能的关键。引擎只做最擅长的流程控制将耗时的业务计算剥离出去避免了因某个任务阻塞而拖慢整个引擎。同时它也天然支持分布式部署可以通过横向扩展工作者节点来提升整体处理能力。3. 核心功能与关键技术点解析3.1 流程建模不仅仅是BPMNLoongFlow对BPMN 2.0标准提供了良好的支持这意味着你可以使用业界通用的符号来绘制流程图包括开始/结束事件、用户任务、服务任务、并行网关、排他网关等。但它的价值不止于此。针对龙芯生态常见的应用场景它很可能内置或计划内置一些“领域特定”的节点类型。例如在国产化软硬件环境中与国产中间件、数据库的交互非常频繁。LoongFlow可能会提供预置的“数据库查询节点”、“消息队列发送/接收节点”这些节点针对龙芯平台上的达梦、金仓等数据库或RocketMQ的龙芯版本客户端进行了优化配置开箱即用减少了开发者自己封装适配的工作量。另一个关键点是它对“长周期流程”的支持。在政务、金融等场景一个流程实例可能持续数天甚至数月。LoongFlow的引擎必须能够高效地管理大量休眠等待外部事件或定时器的流程实例并在事件到达时快速唤醒这对状态管理和内存调度提出了很高要求。3.2 高性能调度与一致性保障工作流引擎的核心挑战之一是在高并发下保证流程状态的正确性和调度的高效性。LoongFlow在这方面 likely 采用了多种技术组合。首先事件驱动的异步架构。引擎内部可能使用一个高性能的事件总线所有状态变更、任务完成、定时器触发都转化为事件进行发布和订阅。这避免了阻塞式调用极大提升了吞吐量。其次针对状态持久化它很可能采用了“状态快照事件溯源”的混合模式。定期将流程实例的完整状态快照保存到数据库同时记录导致状态变化的所有事件。这样在故障恢复时既可以从最近的快照快速恢复也可以通过重放事件来精确重建任何历史状态保证了数据的一致性。最后在分布式部署下如何保证同一个流程实例不会被多个引擎节点同时处理这需要引入分布式锁如基于Redis或etcd或者通过流程实例ID哈希到固定引擎节点的策略来解决。3.3 可观测性与运维支持一个无法被有效监控的系统在生产环境中是危险的。LoongFlow的可观测性设计 likely 包含了三个维度Metrics指标暴露关键性能指标如每秒处理的流程实例数、任务队列长度、各类型节点的平均执行时间、错误率等。这些指标可以通过Prometheus等监控系统采集并绘制成Grafana仪表盘让运维人员对系统健康度一目了然。Tracing链路追踪为每个流程实例生成唯一的追踪ID并贯穿该实例的所有任务执行。无论任务被派发到哪个工作者节点通过这个追踪ID都能在类似Jaeger的系统中看到完整的、可视化的调用链路这对于排查复杂流程中的性能瓶颈或逻辑错误至关重要。Logging日志结构化日志输出详细记录引擎的关键操作、状态迁移和异常信息。日志会与追踪ID关联方便进行聚合查询。此外它的管理控制台应该提供流程实例的实时状态查看、手动干预如跳转节点、终止实例、重试失败任务等功能这些都是日常运维中必不可少的“救火”工具。4. 从零开始部署与核心配置实战4.1 环境准备与依赖安装假设我们在一台搭载LoongArch架构处理器的服务器如龙芯3A5000/3C5000系列上进行部署。首先需要确保基础环境。# 1. 操作系统选择建议使用最新的LoongArch原生发行版如Loongnix龙蜥社区版、UOS、麒麟等。 # 检查系统架构 uname -m # 应输出loongarch64 # 2. 安装必要的系统工具和开发环境 sudo apt update sudo apt install -y git curl wget build-essential pkg-config # 3. 安装Rust工具链假设LoongFlow核心引擎用Rust编写 # 使用rustup进行安装确保获取LoongArch版本 curl --proto https --tlsv1.2 -sSf https://sh.rustup.rs | sh source $HOME/.cargo/env rustup target add loongarch64-unknown-linux-gnu # 添加LoongArch编译目标 # 4. 安装数据库以PostgreSQL为例 sudo apt install -y postgresql postgresql-contrib sudo systemctl start postgresql sudo systemctl enable postgresql # 创建数据库和用户 sudo -u postgres psql -c CREATE USER loongflow WITH PASSWORD your_secure_password; sudo -u postgres psql -c CREATE DATABASE loongflow_db OWNER loongflow;4.2 编译与部署LoongFlow服务端获取源码并进行编译。这里我们假设项目结构清晰提供了标准的Cargo构建配置。# 1. 克隆项目代码 git clone https://github.com/baidu-baige/LoongFlow.git cd LoongFlow/server # 进入服务端代码目录 # 2. 配置数据库连接等信息 # 通常项目会提供一个配置文件模板如 config.toml.example cp config/config.toml.example config/config.toml vim config/config.toml # 编辑关键配置项示例如下 # [database] # url postgres://loongflow:your_secure_passwordlocalhost:5432/loongflow_db # [server] # bind_address 0.0.0.0:8080 # API服务监听地址 # [queue] # 如果使用内置队列 # type redis # redis_url redis://localhost:6379 # 3. 编译针对LoongArch目标 # 项目可能通过features或环境变量指定目标平台请参考项目README cargo build --release --targetloongarch64-unknown-linux-gnu # 4. 编译完成后可执行文件通常在 target/loongarch64-unknown-linux-gnu/release/ 下 # 例如可执行文件名为 loongflow-server cp target/loongarch64-unknown-linux-gnu/release/loongflow-server /usr/local/bin/ # 5. 创建系统服务以systemd为例 sudo vim /etc/systemd/system/loongflow.serviceLoongFlow的systemd服务文件内容示例[Unit] DescriptionLoongFlow Workflow Engine Afternetwork.target postgresql.service redis-server.service [Service] Typesimple Userloongflow WorkingDirectory/opt/loongflow ExecStart/usr/local/bin/loongflow-server --config /etc/loongflow/config.toml Restarton-failure RestartSec5s [Install] WantedBymulti-user.target# 创建运行用户和目录 sudo useradd -r -s /bin/false loongflow sudo mkdir -p /opt/loongflow /etc/loongflow sudo cp config/config.toml /etc/loongflow/ sudo chown -R loongflow:loongflow /opt/loongflow /etc/loongflow # 启动服务 sudo systemctl daemon-reload sudo systemctl start loongflow sudo systemctl enable loongflow sudo systemctl status loongflow # 检查运行状态4.3 编写并部署你的第一个工作流服务启动后我们可以通过其API来部署一个简单的工作流。假设我们有一个简单的顺序流程开始 - 打印任务A - 打印任务B - 结束。首先我们需要用BPMN 2.0 XML定义这个流程。可以使用在线设计器如bpmn.io绘制后导出或直接编写XML。这里提供一个极简的示例XML (simple-sequence.bpmn20.xml)?xml version1.0 encodingUTF-8? definitions xmlnshttp://www.omg.org/spec/BPMN/20100524/MODEL ... process idsimple_print_process name简单打印流程 isExecutabletrue startEvent idstart / sequenceFlow sourceRefstart targetReftaskA / serviceTask idtaskA name打印任务A extensionElements !-- LoongFlow可能使用自定义扩展属性来指定任务类型和执行器 -- loongflow:taskDef typehttp / loongflow:inputParameter nameurlhttp://worker:8080/task/print/loongflow:inputParameter loongflow:inputParameter namepayload{message: Hello from Task A}/loongflow:inputParameter /extensionElements /serviceTask sequenceFlow sourceReftaskA targetReftaskB / serviceTask idtaskB name打印任务B extensionElements loongflow:taskDef typehttp / loongflow:inputParameter nameurlhttp://worker:8080/task/print/loongflow:inputParameter loongflow:inputParameter namepayload{message: Hello from Task B}/loongflow:inputParameter /extensionElements /serviceTask sequenceFlow sourceReftaskB targetRefend / endEvent idend / /process /definitions然后使用curl命令将流程定义部署到LoongFlow服务器curl -X POST \ http://localhost:8080/api/v1/process-definitions \ -H Content-Type: multipart/form-data \ -F filesimple-sequence.bpmn20.xml \ -F deploymentNameMyFirstDeployment如果成功服务器会返回一个部署ID和流程定义ID。接下来我们可以启动一个流程实例curl -X POST \ http://localhost:8080/api/v1/process-instances \ -H Content-Type: application/json \ -d { processDefinitionId: simple_print_process:1:your-generated-id, variables: { initiator: zhangsan } }启动后LoongFlow引擎会解析流程创建实例并开始执行。它会发现taskA是一个HTTP类型的服务任务于是将这个任务放入队列或直接通过HTTP调用等待外部工作者来领取并执行。4.4 编写一个简单的工作者Worker工作者是一个独立的服务它从LoongFlow引擎拉取任务执行具体的业务逻辑然后向引擎报告任务完成或失败。这里用一个简单的Python Flask应用来模拟。# worker.py from flask import Flask, request, jsonify import requests import threading import time app Flask(__name__) LOONGFLOW_SERVER http://localhost:8080 WORKER_ID print-worker-01 def poll_and_execute(): 轮询并执行任务 while True: try: # 1. 轮询任务 (长轮询) resp requests.post( f{LOONGFLOW_SERVER}/api/v1/tasks/poll, json{workerId: WORKER_ID, taskType: http, maxTasks: 1}, timeout30 ) if resp.status_code 200 and resp.json(): tasks resp.json() for task in tasks: task_id task[id] # 2. 执行任务逻辑这里模拟打印 payload task.get(inputData, {}) print(f[Worker {WORKER_ID}] Executing task {task_id}: {payload.get(message)}) time.sleep(1) # 模拟处理耗时 # 3. 上报任务完成 requests.post( f{LOONGFLOW_SERVER}/api/v1/tasks/{task_id}/complete, json{workerId: WORKER_ID, outputData: {status: success}} ) print(f[Worker {WORKER_ID}] Task {task_id} completed.) except Exception as e: print(fPolling error: {e}) time.sleep(1) # 避免空轮询 app.route(/task/print, methods[POST]) def handle_direct_http_task(): 处理引擎直接HTTP调用的任务如果引擎配置为直接调用 data request.json print(f[Direct Call] Received task: {data}) # 执行业务逻辑... return jsonify({status: ok}) if __name__ __main__: # 启动后台轮询线程 thread threading.Thread(targetpoll_and_execute, daemonTrue) thread.start() # 启动HTTP服务用于直接调用模式 app.run(host0.0.0.0, port8080)运行这个工作者python worker.py它就会开始从LoongFlow服务器拉取http类型的任务并执行。你会在工作者的控制台看到它打印出消息同时流程实例会在引擎中一步步向前推进直到结束。5. 高级特性与生产级考量5.1 错误处理与重试机制在生产环境中任务失败是常态。LoongFlow需要提供健壮的错误处理机制。通常它会在任务定义层面支持配置重试策略。重试策略可以配置最大重试次数、重试间隔固定间隔、指数退避。例如一个调用外部API的任务可以配置重试3次每次间隔2秒。错误处理器当任务重试耗尽后仍然失败流程不应卡死。可以定义“错误边界事件”将流程导向一个专门的错误处理子流程进行告警、数据补偿或人工干预。超时控制为任务设置执行超时时间防止因工作者僵死而导致流程实例无限期等待。在流程定义中这些策略可能通过扩展属性来配置serviceTask idcallExternalAPI name调用外部服务 extensionElements loongflow:taskDef typehttp / loongflow:retry maxAttempts3 backoffFactor2.0 initialInterval1000 / loongflow:timeout durationPT30S / !-- ISO 8601格式30秒 -- /extensionElements /serviceTask5.2 子流程与事务补偿对于复杂的业务场景LoongFlow likely 支持嵌入式子流程和调用式子流程。嵌入式子流程用于将一组相关的任务逻辑上分组提高可读性调用式子流程则允许复用已定义的流程。更关键的是事务补偿。在分布式环境下实现传统ACID事务成本极高。工作流引擎常采用Saga模式来管理长事务。一个Saga由一系列可补偿的事务性步骤组成。如果某个步骤失败引擎会触发之前所有已成功步骤的补偿操作Compensation从而将系统状态回滚到一致点。LoongFlow需要提供定义补偿任务和自动触发补偿流程的机制。例如一个“创建订单”流程包含“扣减库存”、“创建订单记录”、“通知物流”三个步骤。如果“通知物流”失败引擎应能自动执行“恢复库存”和“取消订单记录”的补偿任务。5.3 性能调优与高可用部署当流程实例数量达到万级、十万级时性能调优至关重要。数据库优化流程实例和任务实例表会快速增长。需要合理设计索引如基于状态、创建时间的复合索引定期归档历史数据。对于超大规模部署可能需要考虑分库分表策略。缓存策略流程定义BPMN XML在部署后通常不会改变但会被频繁解析。引擎应内置流程定义缓存避免每次实例化都去数据库读取和解析XML。工作者管理采用动态工作者注册与发现机制。工作者启动时向引擎注册自己支持的任务类型和负载能力。引擎可以根据负载情况智能分发任务避免某些工作者过载而其他闲置。高可用集群LoongFlow服务端本身应支持无状态集群部署。通过负载均衡器将请求分发到多个引擎节点。所有状态都持久化在共享数据库和消息队列中。任何一个节点宕机其他节点可以无缝接管其正在处理的流程实例通过数据库锁或队列消息可见性超时机制。同时数据库和消息队列如Redis、PostgreSQL也需要配置为主从或集群模式确保数据高可用。一个典型的高可用部署架构可能如下表示组件角色高可用方案备注LoongFlow Engine流程调度核心无状态多实例前加负载均衡器如Nginx通过共享数据库和队列保证状态一致性PostgreSQL流程状态持久化主从复制 读写分离或使用云托管服务核心状态存储可靠性要求最高Redis任务队列/缓存/分布式锁Redis Sentinel 或 Redis Cluster提升任务派发和锁性能Worker集群业务逻辑执行多实例自动扩缩容根据任务队列长度动态调整监控组件(Prometheus, Grafana, Jaeger)系统可观测性独立部署数据持久化非核心但必不可少6. 常见问题与故障排查实录在实际使用和测试LoongFlow的过程中你肯定会遇到各种各样的问题。下面是我根据类似系统经验总结的一些常见坑点和排查思路。6.1 流程部署失败症状通过API部署BPMN文件时返回4xx错误提示“解析失败”或“无效的流程定义”。排查步骤验证BPMN文件首先使用在线的BPMN 2.0验证工具或本地XML解析器检查文件格式是否正确。一个多余的标签或属性错误都可能导致解析失败。检查扩展属性LoongFlow使用的自定义扩展元素如loongflow:taskDef的命名空间xmlns是否正确属性名是否拼写错误参考项目文档或示例文件进行核对。查看引擎日志服务端的日志通常会给出更详细的错误信息比如具体是哪一行XML出了问题。日志路径通常在/var/log/loongflow/或通过systemd journal查看sudo journalctl -u loongflow -f。实操心得在开发阶段建议先使用LoongFlow可能提供的图形化设计器来生成BPMN文件这能最大程度避免语法错误。如果必须手写XML从一个能正常工作的简单流程文件开始逐步添加复杂元素。6.2 流程实例启动后无反应卡住症状成功启动了流程实例但流程没有执行在管理控制台看到实例停留在“开始事件”或某个任务节点。排查步骤检查任务队列首先确认任务是否被成功创建。调用APIGET /api/v1/tasks?processInstanceIdxxx查看该实例产生的任务列表。如果任务列表为空可能是流程定义有逻辑错误如网关条件永远不满足或者引擎内部处理异常。检查工作者状态如果任务已存在且状态为CREATED或SCHEDULED说明引擎已派发。接下来检查工作者工作者进程是否在运行ps aux | grep worker工作者是否成功连接到引擎服务器查看工作者日志看是否有连接错误或认证失败。工作者轮询的任务类型taskType是否与引擎创建的任务类型匹配这是最常见的配置错误。检查网络与防火墙如果引擎配置为直接HTTP调用工作者而非工作者主动轮询请检查引擎服务器是否能访问到工作者服务的IP和端口。使用curl或telnet在引擎服务器上测试。实操心得在测试环境开启引擎和工作者DEBUG级别的日志可以清晰地看到任务创建、派发、拉取、执行的完整生命周期是定位这类问题最快的方法。6.3 数据库连接池耗尽或性能瓶颈症状系统运行一段时间后响应变慢API调用超时引擎日志中出现大量数据库连接超时或获取连接失败的报错。排查步骤监控数据库连接数登录数据库执行SELECT count(*) FROM pg_stat_activity WHERE datname loongflow_db;PostgreSQL查看当前连接数。对比数据库最大连接数设置。分析引擎配置检查LoongFlow的数据库连接池配置通常在config.toml中。max_connections参数是否设置过大超过了数据库的限制或者设置过小无法支撑并发请求检查是否存在连接泄漏长时间运行的SQL查询或未正确关闭的数据库会话会导致连接被占用。查看数据库中state为idle in transaction或执行时间过长的会话。数据库性能检查CPU、内存、磁盘IO。流程实例表和任务实例表是否缺少关键索引对经常查询的字段如status,process_definition_id,create_time建立复合索引能极大提升查询效率。解决方案根据实际负载调整引擎连接池大小和数据库最大连接数。为高频查询添加数据库索引。建立历史数据归档机制将已结束的流程实例迁移到历史表或冷存储保持主表体积可控。考虑对读多写少的查询如管理控制台的统计查询使用数据库只读从库。6.4 分布式环境下的重复执行与状态冲突症状在引擎多实例集群部署时偶尔出现同一个任务被执行了两次或者流程状态出现不一致。原因分析这是分布式系统的经典问题。可能原因有任务派发重复两个引擎实例几乎同时从数据库查询到可派发的任务并派发给了不同的工作者。消息队列at-least-once语义如果使用消息队列如Redis Streams派发任务在消费者工作者ack失败时消息可能会被重新投递。幂等性未处理工作者执行的任务逻辑不是幂等的重复执行导致业务数据错误。解决策略数据库乐观锁在更新任务状态如从CREATED变为IN_PROGRESS时使用版本号或条件更新UPDATE tasks SET statusIN_PROGRESS WHERE id? AND statusCREATED只有更新成功的引擎实例才算派发成功。全局唯一任务锁使用Redis分布式锁在派发或执行任务前先获取锁。实现工作者幂等在工作者端根据任务ID实现幂等逻辑。可以在业务数据库中记录已处理的任务ID或者在执行前先检查任务在引擎中的状态是否仍是可执行状态。选用合适的队列如果使用队列确保理解其消息传递语义at-most-once, at-least-once, exactly-once并在设计和编码时做出相应应对。提示对于金融、交易等对一致性要求极高的场景建议优先采用“数据库状态驱动乐观锁”的模式虽然可能牺牲一点性能但能提供最强的一致性保证。对于日志处理、数据同步等允许少量重复的场景可以优先考虑性能通过实现幂等性来容忍重复。7. 与龙芯生态的深度集成展望LoongFlow的价值不仅在于其本身更在于它作为一块“积木”如何与龙芯生态中的其他软硬件更好地耦合发挥出“112”的效应。与国产中间件的无缝对接未来LoongFlow可以预置针对龙芯平台优化的国产中间件连接器。例如一键配置即可与国产消息中间件如TongLINK/Q、东方通消息队列、国产分布式事务框架如Seata的龙芯版本进行深度集成简化在信创环境下的微服务编排和事务管理。利用硬件特性提升性能龙芯处理器在二进制翻译、虚拟化等方面有其特色指令。LoongFlow的运行时是否可以探索利用这些指令来优化Java工作者通过龙芯版JDK的启动速度或脚本任务Python的执行效率虽然这属于更底层的优化但却是体现“原生”优势的深水区。构建可视化低代码平台一个成熟的工作流引擎最终会向上生长出低代码/无代码的开发平台。基于LoongFlow的稳定引擎可以开发一个图形化的流程设计、表单设计、规则配置平台。让业务人员也能通过拖拽的方式在龙芯服务器上构建复杂的业务流程应用这将极大降低国产化环境下的应用开发门槛和周期。融入云原生技术栈提供官方的Helm Chart方便在基于龙芯的Kubernetes集群上一键部署LoongFlow及其依赖PostgreSQL, Redis。支持将工作者打包为容器镜像通过K8s的HPA水平自动扩缩容根据任务队列长度动态调整工作者副本数实现真正的弹性伸缩。LoongFlow作为一个开源项目其生命力在于社区。作为开发者我们不仅是使用者也可以是贡献者。从提交文档、修复bug到开发新的连接器、优化核心调度算法每一个贡献都在让这个“龙芯原生”的自动化基石变得更加稳固和强大。在国产化浪潮下这样的项目值得我们投入精力去关注、试用和共建。

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

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

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…