【Flowable 7】学习笔记 01 - 初始化数据库表创建流程(源码)

news2024/12/22 13:52:57

文章目录

    • 前言
    • 版本说明
    • 配置
    • 1、引擎配置初始化
    • 2、SQL 执行创建表
      • 2.0、创建表概览(创建表数目:38)
      • 2.1、基础组件表创建(以 common 组件为例)
      • 2.2、changelog 组件表创建(基于 liquibase)
      • 2.3、Engine | History 组件表创建
      • 2.4、检查表是否存在

前言

前段时间,RuoYi-Vue-Plus 迎来了 v5.2.0-BETA 版本,其中新增了工作流 Flowable 7

在工作中几乎没有使用过工作流,这一内容是比较陌生的,我在b站上能找到的学习的视频都不算十分满意,大多其实只是讲解如何使用,相关的书(中文版)也比较少,至于原理还是需要自己看源码或者 debug,所以还是需要慢慢学习,接下来如果有空会更新。

本文主要是记录一下初始化建表的流程,作为后续学习参考。可能会有错误的地方,或者是不完善的地方,请见谅。

版本说明

  1. 框架 RuoYi-Vue-Plus 版本:5.2.0-BETAdev 分支)
  2. Flowable 版本:7.0.0

在这里插入图片描述

配置

  1. Flowable 模块:ruoyi-modules/ruoyi-workflow(本文暂不涉及)
  2. 配置:ruoyi-admin/src/main/resources/application.yml
--- #flowable配置
flowable:
  async-executor-activate: false #关闭定时任务JOB
  #  将databaseSchemaUpdate设置为true。当Flowable发现库与数据库表结构不一致时,会自动将数据库表结构升级至新版本。
  database-schema-update: true
  activity-font-name: 宋体
  label-font-name: 宋体
  annotation-font-name: 宋体
  # 关闭各个模块生成表,目前只使用工作流基础表
  idm:
    enabled: false
  cmmn:
    enabled: false
  dmn:
    enabled: false
  app:
    enabled: false

上面的配置中只生成了基础表,其他模块相关表没有生成,所以暂且不关心。结合 AI 简单说明一下各个模块:

  • IDM(Identity Management):身份管理模块,用于管理用户、组织和权限。 它负责处理用户身份验证、授权和用户组管理等任务,以确保系统的安全性和权限控制。

  • CMMN(Case Management Model and Notation):案例管理模块,用于建模和执行复杂的业务案例。 CMMN提供了一种规范的方法来描述业务案例、案例实例和案例任务之间的关系,使得在复杂业务场景下的处理和管理变得更加灵活和可控。

  • DMN(Decision Model and Notation):决策建模与表示模块,用于建模和执行业务决策逻辑。 DMN提供了一种标准的方式来描述决策表、决策规则和决策过程,帮助业务系统更好地实现自动化决策和业务规则管理。

  • APP(Application):应用模块,提供了一个基于Web的用户界面,用于管理和监控流程、任务和案例。 APP模块使得用户能够通过浏览器访问Flowable引擎,进行流程定义、部署、启动、任务处理等操作,从而方便地管理和参与到业务流程中。

1、引擎配置初始化

初始化执行的主要方法:
org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl#init

这个方法用于初始化 Flowable 引擎的配置和各种组件:

  1. initEngineConfigurations():初始化引擎配置。
  2. initConfigurators():初始化配置器。
  3. configuratorsBeforeInit():在初始化之前配置器的初始化。
  4. initClock():初始化时钟。
  5. initObjectMapper():初始化对象映射器。
  6. initProcessDiagramGenerator():初始化流程图生成器。
  7. initCommandContextFactory():初始化命令上下文工厂。
  8. initTransactionContextFactory():初始化事务上下文工厂。
  9. initCommandExecutors():初始化命令执行器。
  10. initIdGenerator():初始化ID生成器。
  11. initHistoryLevel():初始化历史级别。
  12. initFunctionDelegates():初始化函数委托。
  13. initAstFunctionCreators():初始化AST函数创建器。
  14. initDelegateInterceptor():初始化委托拦截器。
  15. initBeans():初始化Beans。
  16. initExpressionManager():初始化表达式管理器。
  17. initMailClients():初始化邮件客户端。
  18. initAgendaFactory():初始化议程工厂。
  19. 根据数据库是否使用,选择性初始化数据源:initDataSource()initNonRelationalDataSource()
  20. 如果使用关系型数据库或者使用模式管理,初始化模式管理器。
  21. 配置变量服务配置和作业服务配置。
  22. initHelpers():初始化助手。
  23. initVariableTypes():初始化变量类型。
  24. initFormEngines():初始化表单引擎。
  25. initFormTypes():初始化表单类型。
  26. initScriptBindingsFactory():初始化脚本绑定工厂。
  27. initScriptingEngines():初始化脚本引擎。
  28. initBusinessCalendarManager():初始化业务日历管理器。
  29. initServices():初始化服务。
  30. initWsdlImporterFactory():初始化WSDL导入器工厂。
  31. initBehaviorFactory():初始化行为工厂。
  32. initListenerFactory():初始化监听器工厂。
  33. initBpmnParser():初始化BPMN解析器。
  34. initProcessDefinitionCache():初始化流程定义缓存。
  35. initProcessDefinitionInfoCache():初始化流程定义信息缓存。
  36. initAppResourceCache():初始化应用资源缓存。
  37. initKnowledgeBaseCache():初始化知识库缓存。
  38. initJobHandlers()initHistoryJobHandlers():初始化作业处理程序和历史作业处理程序。
  39. initTransactionFactory():初始化事务工厂。
  40. 如果使用关系型数据库,初始化SQL会话工厂。
  41. initSessionFactories():初始化会话工厂。
  42. initDataManagers():初始化数据管理器。
  43. initEntityManagers():初始化实体管理器。
  44. initProcessDefinitionDeploymentDeletionManager():初始化流程定义部署删除管理器。
  45. initCandidateManager():初始化候选人管理器。
  46. initVariableAggregator():初始化变量聚合器。
  47. initDependentScopeTypes():初始化依赖范围类型。
  48. initHistoryConfigurationSettings():初始化历史配置设置。
  49. initHistoryManager():初始化历史管理器。
  50. initChangeTenantIdManager():初始化更改租户ID管理器。
  51. initDynamicStateManager():初始化动态状态管理器。
  52. initProcessInstanceMigrationValidationManager():初始化流程实例迁移验证管理器。
  53. initIdentityLinkInterceptor():初始化身份链接拦截器。
  54. initJpa():初始化JPA。
  55. initDeployers():初始化部署器。
  56. initEventHandlers():初始化事件处理程序。
  57. initFailedJobCommandFactory():初始化失败作业命令工厂。
  58. initEventDispatcher():初始化事件分发器。
  59. initProcessValidator():初始化流程验证器。
  60. initFormFieldHandler():初始化表单字段处理程序。
  61. initDatabaseEventLogging():初始化数据库事件日志记录。
  62. initFlowable5CompatibilityHandler():初始化Flowable 5兼容性处理程序。
  63. initVariableServiceConfiguration()initIdentityLinkServiceConfiguration()initEntityLinkServiceConfiguration()initEventSubscriptionServiceConfiguration()initTaskServiceConfiguration()initJobServiceConfiguration()initBatchServiceConfiguration():初始化各种服务配置。
  64. initAsyncTaskInvoker()initAsyncExecutor()initAsyncHistoryExecutor():初始化异步任务调用程序、异步执行器和异步历史执行器。
  65. configuratorsAfterInit():在初始化之后的配置器初始化。
  66. afterInitTaskServiceConfiguration()afterInitEventRegistryEventBusConsumer():在初始化任务服务配置之后和初始化事件注册表事件总线消费者之后的操作。
  67. initHistoryCleaningManager():初始化历史清理管理器。
  68. initLocalizationManagers():初始化本地化管理器。

2、SQL 执行创建表

2.0、创建表概览(创建表数目:38)

序号SQL文件名(生成表数量)创建表名称生成逻辑对应 Manager备注
1.flowable.mysql.create.common.sql(2)ACT_GE_PROPERTY
ACT_GE_BYTEARRAY
CommonDbSchemaManager
2.liquibase.sqlgenerator.SqlGenerator(2)FLW_EV_DATABASECHANGELOGLOCK
FLW_EV_DATABASECHANGELOG
执行方法:
CreateDatabaseChangeLogLockTableGenerator#generateSql
CreateDatabaseChangeLogTableGenerator#generateSql
3.flowable-eventregistry-db-changelog.xml(4)FLW_EVENT_DEPLOYMENT
FLW_EVENT_RESOURCE
FLW_EVENT_DEFINITION
FLW_CHANNEL_DEFINITION
EventDbSchemaManager(包含三个部分 changeSet
4.flowable.mysql.create.identitylink.sql(1)ACT_RU_IDENTITYLINKIdentityLinkDbSchemaManager
5.flowable.mysql.create.identitylink.history.sql(1)ACT_HI_IDENTITYLINKIdentityLinkDbSchemaManager
6.flowable.mysql.create.entitylink.sql(1)ACT_RU_ENTITYLINKEntityLinkDbSchemaManager
7.flowable.mysql.create.entitylink.history.sql(1)ACT_HI_ENTITYLINKEntityLinkDbSchemaManager
8.flowable.mysql.create.eventsubscription.sql(1)ACT_RU_EVENT_SUBSCREventSubscriptionDbSchemaManager
9.flowable.mysql.create.task.sql(1)ACT_RU_TASKTaskDbSchemaManager
10.flowable.mysql.create.task.history.sql(2)ACT_HI_TASKINST
ACT_HI_TSK_LOG
TaskDbSchemaManager
11.flowable.mysql.create.variable.sql(1)ACT_RU_VARIABLEVariableDbSchemaManager
12.flowable.mysql.create.variable.history.sql(1)ACT_HI_VARINSTVariableDbSchemaManager
13.flowable.mysql.create.job.sql(6)ACT_RU_JOB
ACT_RU_TIMER_JOB
ACT_RU_SUSPENDED_JOB
ACT_RU_DEADLETTER_JOB
ACT_RU_HISTORY_JOB
ACT_RU_EXTERNAL_JOB
JobDbSchemaManager
14.flowable.mysql.create.batch.sql(2)FLW_RU_BATCH
FLW_RU_BATCH_PART
BatchDbSchemaManager
15.flowable.mysql.create.engine.sql(7)ACT_RE_DEPLOYMENT
ACT_RE_MODEL
ACT_RU_EXECUTION
ACT_RE_PROCDEF
ACT_EVT_LOG
ACT_PROCDEF_INFO
ACT_RU_ACTINST
ProcessDbSchemaManager
16.flowable.mysql.create.history.sql(5)ACT_HI_PROCINST
ACT_HI_ACTINST
ACT_HI_DETAIL
ACT_HI_COMMENT
ACT_HI_ATTACHMENT
ProcessDbSchemaManager

同样结合 AI 说明一下表前缀:

  1. ACT_RE(Repository)

    • 存储静态信息:这个前缀表示repository,即存储。带有这个前缀的表包含的是静态信息,例如流程定义和流程的资源(如图片、规则等)。
    • 与建模相关的操作:这些表通常是由RepositoryService接口操作,涉及到流程定义的部署、查询和管理等操作。
  2. ACT_RU(Runtime)

    • 存储运行时数据:这个前缀表示runtime,即运行时。带有这个前缀的表存储着流程变量、用户任务、变量、职责(job)等运行时的数据。
    • 流程实例执行期间的数据:Flowable只存储实例执行期间的运行时数据,当流程实例结束时,将删除这些记录。这就保证了这些运行时的表小且快,提高了性能。
  3. ACT_ID(Identity)

    • 管理组织机构信息:这个前缀表示identity,即身份。带有这个前缀的表包含标识的信息,如用户、用户组等组织机构相关的数据。
    • 支持用户身份管理和权限控制:这些表支持用户身份的创建、修改、删除、密码修改、登录等功能,以及用户分组和权限管理。
  4. ACT_HI(History)

    • 存储历史数据:这个前缀表示history,即历史。带有这个前缀的表包含着历史的相关数据,如结束的流程实例、变量、任务等。
    • 审计和报告:这些表用于审计和报告目的,记录了流程实例的历史信息,方便用户查看和分析流程的执行情况。
  5. ACT_GE(General)

    • 通用数据表:这个前缀没有特定的指向,表示general,即通用。带有这个前缀的表被用于各种情况,包含通用的流程定义和流程资源等信息。
    • 系统相关属性:这些表还可能包含系统相关的属性设置,如系统的配置信息等。
  6. FLW(Flowable Work或Engage)

    • 特定于Flowable Work或Engage的表:以FLW_前缀开头的数据库表是特定于Flowable Work或Engage的,这两个产品分别提供了工作流和数字化业务流程服务。
    • 区分核心功能和特定产品功能:这样的命名方式有助于区分Flowable核心功能和特定产品功能相关的数据表。

2.1、基础组件表创建(以 common 组件为例)

common 组件是最早执行生成的,因此以 common 为例进行说明,对应的 manager 是 CommonDbSchemaManager,是 ServiceSqlScriptBasedDbSchemaManager 的扩展。不同的组件有不同的扩展:

在这里插入图片描述

不同的扩展 实现对应执行相关的 sql 文件,命名遵循相关的规范。common 组件对应的 sql 文件:flowable.mysql.create.common.sql

调用链:

  • org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl#init
  • org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl#initSchemaManager
  • org.flowable.common.engine.impl.AbstractEngineConfiguration#initSchemaManager

在这里插入图片描述

  • org.flowable.common.engine.impl.db.LiquibaseBasedSchemaManager#initSchema
  • org.flowable.eventregistry.impl.db.EventDbSchemaManager#schemaUpdate
  • org.flowable.common.engine.impl.db.ServiceSqlScriptBasedDbSchemaManager#schemaUpdate
  • org.flowable.common.engine.impl.db.ServiceSqlScriptBasedDbSchemaManager#schemaCreate
  • org.flowable.common.engine.impl.db.ServiceSqlScriptBasedDbSchemaManager#internalDbSchemaCreate

在这里插入图片描述

sql 文件:

在这里插入图片描述

在这里插入图片描述

  • org.flowable.common.engine.impl.db.AbstractSqlScriptBasedDbSchemaManager#executeSchemaResource

在这里插入图片描述

在这里插入图片描述

创建表:

在这里插入图片描述

日志输出:

在这里插入图片描述

2.2、changelog 组件表创建(基于 liquibase)

在调用 flowable-eventregistry-db-changelog.xml 时,先生成了两个 changelog 表。对应的类:org.flowable.eventregistry.impl.db.EventDbSchemaManager

调用链:

  • org.flowable.common.engine.impl.db.LiquibaseBasedSchemaManager#initSchema
  • org.flowable.common.engine.impl.db.LiquibaseBasedSchemaManager#schemaUpdate
  • ……
  • liquibase.command.core.helpers.DatabaseChangelogCommandStep#run
  • liquibase.command.core.helpers.DatabaseChangelogCommandStep#checkLiquibaseTables

在这里插入图片描述

  • 1:changeLogHistoryService.init();
  • liquibase.changelog.StandardChangeLogHistoryService#init
  • ……
  • liquibase.sqlgenerator.core.CreateDatabaseChangeLogTableGenerator#generateSql
  • 2:LockServiceFactory.getInstance().getLockService(database).init();
  • liquibase.lockservice.StandardLockService#init
  • ……
  • liquibase.sqlgenerator.core.CreateDatabaseChangeLogLockTableGenerator#generateSql
  • ……
  • org.flowable.engine.impl.db.ProcessDbSchemaManager#schemaUpdate (Engine | History 组件表创建)

2.3、Engine | History 组件表创建

sql 文件: flowable.mysql.create.engine.sqlflowable.mysql.create.history.sql

调用链:

  • org.flowable.spring.SpringProcessEngineConfiguration#buildProcessEngine
  • org.flowable.engine.impl.ProcessEngineImpl#ProcessEngineImpl
  • org.flowable.engine.impl.SchemaOperationsProcessEngineBuild#execute
  • org.flowable.engine.impl.db.ProcessDbSchemaManager#schemaUpdate

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2.4、检查表是否存在

由于配置 database-schema-updatetrue,应用每次启动,Flowable 都会检查表是否存在以及是否需要更新表。

如果设置为 false,则假定数据库已经是最新状态,不做任何更新。
设置为 validate 时,仅验证 Schema 是否匹配,不执行更新操作。
设置为 update 时,如有需要则更新 Schema。

底层判断逻辑:

  • org.flowable.common.engine.impl.db.ServiceSqlScriptBasedDbSchemaManager#schemaCreate

在这里插入图片描述

在这里插入图片描述

  • org.flowable.common.engine.impl.db.AbstractSqlScriptBasedDbSchemaManager#isTablePresent

  • org.flowable.engine.impl.db.ProcessDbSchemaManager#schemaUpdate
  • org.flowable.common.engine.impl.db.ServiceSqlScriptBasedDbSchemaManager#schemaUpdate

在这里插入图片描述

(完)

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

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

相关文章

Ora-32004错误处理

问题现象 处理方法 观察alert会发现报错的参数在加载spfile的阶段 按照mos的方法对其reset 重新启动无报错 观察日志无报错

人工智能在肺癌领域的最新进展|【医学AI·顶刊速递·05-28】

小罗碎碎念 2024-05-28|文献速递 今天推荐的6篇文章,质量都非常的高,都是与肺癌相关的最新进展。 看我推文的,很多来自不同的专业,研究不同的癌种。小罗友情提醒,不要只盯着自己领域的癌种,要兼…

Creating parameterized straight waveguide in INTERCONNECT 创建参数化的器件

Creating parameterized straight waveguide in INTERCONNECT 创建参数化的器件 引言正文引言 之前,我们在 INTERCONNECT 中使用库中器件制作一个损耗为 3 dB /m 的直波导 一文中介绍了如何使用 Library 中的直波导来进行仿真,这里我们简单介绍如何在 INTERCONNECT 中创建属…

两年前的微信聊天记录能恢复吗?正确答案在这里(全)

微信已经成为我们日常沟通中不可或缺的一部分,承载着无数重要的对话和回忆。然而,面对手机更换、系统升级或意外删除等情况,许多人不禁要问:两年前的微信聊天记录能恢复吗?这个问题的答案并不简单,因为能否…

【荐闻】空中目标检测综述

https://t.zsxq.com/tgUjbhttps://t.zsxq.com/tgUjb 这篇综述论文全面回顾了空中目标检测的最新进展,包括五个不平衡问题、相关方法、实际应用和性能评估。以下是对论文内容的详细描述: 1)引言:介绍了空中目标检测的概念&#x…

2.使用代码完成一下逻辑,根据输入的行数打印如下图案请输入需要打印的行数:5 * *** ***** ****************

2.使用代码完成一下逻辑,根据输入的行数打印如下图案 请输入需要打印的行数:5**************** ********* str " " b int(input("输入一个整数:")) for i in range(1, b 1):for j in range(b - i):print(" &quo…

计算机网络-BGP基础概念

一、BGP的基本概念 BGP是一种实现自治系统AS之间的路由可达,并选择最佳路由的矢量性协议。早期发布的三个版本分别是BGP-1(RFC1105)、BGP-2(RFC1163)和BGP-3(RFC1267),1994年开始使用…

【Linux】23. 线程封装

如何理解C11中的多线程(了解) #include <iostream> #include <unistd.h> #include <thread>void thread_run() {while (true){std::cout << "我是新线程..." << std::endl;sleep(1);} } int main() {// 任何语言需要在Linux上实现多线…

【Pandas】深入解析`pd.to_sql()`函数

【Pandas】深入解析pd.to_sql()函数 &#x1f308; 欢迎莅临我的个人主页&#x1f448;这里是我深耕Python编程、机器学习和自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;并乐于分享知识与经验的小天地&#xff01;&#x1f387; &#x1f393; 博主简介&#xff1…

【香橙派 AIpro】OrangePi AIpro :教育、机器人、无人机领域的超级AI大脑,华为昇腾处理器驱动的AI开发板新标杆

【OrangePi AIpro&#xff1a;教育、机器人、无人机领域的超级AI大脑&#xff0c;华为昇腾处理器驱动的AI开发板新标杆】 文章目录 一、开箱与初印象1. 初印象2. 上手开机3. 安装和运行 TightVNC 远程桌面3.1. 安装 TightVNC 服务器3.2. 启动 VNC 服务器3.3. 在 Windows 上使用…

RTT UART设备框架学习

UART简介 UART&#xff08;Universal Asynchronous Receiver/Transmitter&#xff09;通用异步收发传输器&#xff0c;UART 作为异步串口通信协议的一种&#xff0c;工作原理是将传输数据的每个字符一位接一位地传输。是在应用程序开发过程中使用频率最高的数据总线。 UART串…

免费,Python蓝桥杯等级考试真题--第12级(含答案解析和代码)

Python蓝桥杯等级考试真题–第12级 一、 选择题 答案&#xff1a;B 解析&#xff1a;【0:4】表示取值【1,2,3,4,5】&#xff0c;故答案为B。 答案&#xff1a;B 解析&#xff1a;del lis【2】表示删除列表的元素5&#xff0c;故答案为B。 答案&#xff1a;C 解析&#xff1a;…

基础—SQL—DML(数据操作语言)插入数据

一、介绍 分类全称说明DMLData Manipulation Language数据操作语言。用来对数据库表中的数据进行增删改(插入、删除、修改) 则增、删、改是三个操作也就对应着三个关键字&#xff0c;分别是&#xff1a; 添加数据&#xff1a;&#xff08; INSERT &#xff09;修改数据&#…

数据结构与算法之线性表01

数组是一种线性数据结构&#xff0c;把相同数据类型的元素存储在连续的内存空间中&#xff0c;数组的索引&#xff08;元素在数组中的位置&#xff09;从0开始。 一、常用操作&#xff1a; 1、初始化 # 给定初始值 arr:list[int] [0] * 5 nums:list[int] [1, 2, 3, 4, 5] …

企业微信hook接口协议,ipad协议http,已读消息

已读消息 参数名必选类型说明uuid是String每个实例的唯一标识&#xff0c;根据uuid操作具体企业微信send_userid是long要发送的人idisRoom是bool是否是群消息 请求示例 {"uuid":"1753cdff-0501-42fe-bb5a-2a4b9629f7fb","send_userid":788130255…

旋转矩阵00

题目链接 旋转矩阵 题目描述 注意点 将图像旋转 90 度不占用额外内存空间 解答思路 需要找到将图像旋转90度的规律&#xff0c;为了不占用额外内存空间&#xff0c;可以先将图像上下翻转&#xff0c;然后再将图像沿着主对角线进行翻转&#xff0c;得到的就是旋转90度之后的…

职业探索--运维体系-SRE岗位/CRE岗位/运维岗位-服务心态-运维职业发展方向-运维对象和运维场景

参考来源&#xff1a; 极客时间专栏&#xff1a;赵成的运维体系管理课 极客时间专栏&#xff1a;全栈工程师修炼指南 赵成大佬在鹏讯云社区的文章&#xff08;77篇&#xff09; 有了CMDB&#xff0c;为什么还要应用配置管理 故障没有根因&#xff0c;别再找了 如何理解CMDB的套…

基础—SQL—图形化界面工具的DataGrip使用(2)

一、回顾与引言 &#xff08;1&#xff09; 上次内容&#xff0c;博客讲到了DDL语句的数据库操作、表操作、表字段的操作的相关语法&#xff0c;然而之前都是在MySQL的命令行当中去操作演示的。这种方式可以用&#xff0c;但是使用的话&#xff0c;第一&#xff0c;在我们日常…

JVM 内存布局深度解析,你所不知道的一面

作为Java开发者&#xff0c;想要写出高质量的代码&#xff0c;理解JVM的内存结构是必修课。本文将为您深度解析 Java 虚拟机(JVM)中的内存布局及其细节分析&#xff0c;让你在内存管理的道路上行稳致远。希望通过本文能让你彻底理解其中的奥秘。 一、内存布局概览 在我们深入具…

使用EMQX搭建MQTT服务

简介&#xff1a;EMQX 是一款开源的大规模分布式 MQTT 消息服务器&#xff0c;功能丰富&#xff0c;专为物联网和实时通信应用而设计。EMQX 5.0 单集群支持 MQTT 并发连接数高达 1 亿条&#xff0c;单服务器的传输与处理吞吐量可达每秒百万级 MQTT 消息&#xff0c;同时保证毫秒…