camunda多租户技术架构介绍和测试验证

news/2024/7/7 12:12:05/文章来源:https://www.cnblogs.com/hibpm/p/18279198

多租户考虑的是单个 Camunda 安装应该为多个租户提供服务的情况。对于每个租户,应做出一定的隔离保证。例如,一个租户的流程实例不应干扰另一租户的流程实例。

多租户可以通过两种不同的方式实现。一种方法是每个租户使用一个流程引擎。另一种方法是仅使用一个流程引擎并将数据与租户标识符相关联。这两种方式在数据隔离级别、维护工作量和可扩展性方面有所不同。两种方式的组合也是可能的。

多租户架构一:具有租户标识符的单进程引擎

多租户可以通过一个使用租户标识符(即租户ID)的流程引擎来实现。所有租户的数据存储在一张表中(相同的数据库和模式)。隔离是通过存储在列中的租户标识符来提供的。

00-多租户架构1

租户标识符在部署上指定,并传播到从部署创建的所有数据(例如,流程定义、流程实例、任务等)。为了访问特定租户的数据,流程引擎允许通过租户标识符过滤查询或为命令指定租户标识符(例如,创建流程实例)。此外,流程引擎与允许省略租户标识符的身份服务结合提供透明的访问限制。

请注意,并非所有 API 都实现了透明的租户分离。例如,使用部署 API,租户可以为另一个租户部署流程。因此,直接向租户公开此类 API 端点不是受支持的用例。自定义访问检查逻辑应该构建在 Camunda API 之上,否则存在通过API接口访问其他租户数据的安全问题。

通过以下示例演示如何对共享流程引擎使用多租户。你将了解到:

  • 如何使用租户 ID 部署流程定义
  • 如何从具有租户 ID 的流程定义启动流程实例
  • 如何通过 Camunda Web 应用程序使用多租户

设计一个流程并以租户发布

打开流程设计器,设计一个流程,并以tenant1租户发布

01-租户1流程

发布流程,注意填写租户ID为tenant1

02-发布租户1流程

发布成功后,我们打开camunda的数据库表,查看表里的记录,发现流程定义表act_re_procdef和流程部署表act_re_deployment中的TENANT_ID_字段都有了值。

03-流程部署表

2、在流程控制台添加租户

打开浏览器并转到http://localhost:8080/camunda/app/cockpit,使用demo/demo登录。

找到租户管理菜单:04-租户管理

进入租户管理界面,添加2个租户,分别命名为tenant1和tenant2:

05-新增租户

打开camunda的数据库租户表act_id_tenant,查看表里的记录,发现多了租户记录:06-租户表

打开camunda的数据库租户表act_id_tenant_member,查看表里的记录,该表记录了租户和用户的关系:

08-租户用户关系表

接着,进入用户管理界面,添加1个用户张三,并把用户张三分配给租户tenant1,即在tenant1租户下有1个张三用户:

07-新增用户到租户下

3、通过租户下的用户发起流程

切换到 Cockpit 并使用新用户张三登录,点击右上角发起流程,即以tenant1发起一个流程。09-租户1发起流程

发起流程后,可以设置待办任务task过滤器,只查看tenant1租户的待办任务:

10-张三过滤器

这时,我们再参考一下camnuda的数据库表中数据,看看是否带有租户ID的标识。

流程待办任务表act_ru_task中的TENANT_ID_字段中写入了tenant1值:

11-待办任务表数据

流程历史实例表act_hi_procinst中的TENANT_ID_字段中也写入了tenant1值:

12-流程历史实例表数据

通过API查询租户数据

特定于租户的数据的流程引擎查询(例如,部署查询、流程定义查询)允许按一个或多个租户标识符进行过滤。如果未设置标识符,则结果包含所有租户的数据。

要查找特定租户的部署,必须将租户标识符传递tenantIdIn到DeploymentQuery.

List<Deployment> deployments = repositoryService

.createDeploymentQuery()

.tenantIdIn("tenant1", "tenant2")

.orderByTenantId()

.asc()

.list();

要通过为多个租户部署的流程定义的键创建实例,必须将租户标识符传递给ProcessInstantiationBuilder 。

runtimeService

.createProcessInstanceByKey("key")

.processDefinitionTenantId("tenant1")

.execute();

这样,通过这个示例验证了具有共享流程引擎租户标识符的多租户模式,即通过数据库字段标识租户ID,部署一个流程实例和一个数据库实现多租户的架构。但这样的多租户架构有几个弊端:

  1. 单表数据量大的情况下,性能问题如何解决?
  2. 多个租户的数据都在一个表里,通过API可查询到,通过数据库管理工具也可查询,数据安全如何解决?
  3. 涉及到个性化定义,如何解决?

要解决以上问题,需要采用每个租户一个流程引擎和数据Schemas的架构。

多租户架构二、多流程实例和数据schema独立架构

13-多租户架构2

多租户可以通过为每个租户提供一个流程引擎来实现。每个流程引擎被配置为使用连接租户数据的不同数据源。租户的数据可以存储在不同的数据库中,可以存储在具有不同架构的一个数据库中,也可以存储在具有不同表的一个架构中。

云程低代码平台采用了多流程实例和数据库隔离的多租户架构,可以通过官方网站的SaaS免费体验。13-saas注册登录

官方文档:https://docs.camunda.org/manual/7.19/user-guide/process-engine/multi-tenancy/

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IEEE 8802-3 以太网标准解读

PHY: CarrierSense 载波侦听 ReceveDataValid 接受数据有效 CollisionDetect 碰撞检测 Transmitting 传输中 TransmitBit 传输比特 SFD 10101011 开始 ReceiveBit 接受比特 Wait 等待1、MA_DATA.request 定义了MAC客户端访问单独实体或者z在组地址的前提下访问多个实体 MA…

在C#中使用RabbitMQ做个简单的发送邮件小项目

在C#中使用RabbitMQ做个简单的发送邮件小项目 前言 好久没有做项目了,这次做一个发送邮件的小项目。发邮件是一个比较耗时的操作,之前在我的个人博客里面回复评论和友链申请是会通过发送邮件来通知对方的,不过当时只是简单的进行了异步操作。 那么这次来使用RabbitMQ去统一发…

【进阶篇】Java 项目中对使用递归的理解分享

笔者在最近的项目开发中,遇到了两个父子关系紧密相关的场景:评论树结构、部门树结构。具体的需求如:找出某条评论下的所有子评论id集合,找出某个部门下所有的子部门id集合。【进阶篇】Java 项目中对使用递归的理解分享 目录【进阶篇】Java 项目中对使用递归的理解分享前言一…

C#/.NET/.NET Core编程技巧练习集(学习,实践干货)

DotNet Exercises介绍 DotNetGuide专栏C#/.NET/.NET Core编程常用语法、算法、技巧、中间件、类库练习集,配套详细的文章教程讲解,助你快速掌握C#/.NET/.NET Core各种编程常用语法、算法、技巧、中间件、类库等等。GitHub开源地址:https://github.com/YSGStudyHards/DotNetE…

2024年6月文章一览

2024年6月编程人总共更新了5篇文章: 1.2024年5月文章一览 2.《编译原理》阅读笔记:p18 3.《编译原理》阅读笔记:p19-p24 4.《编译原理》阅读笔记:p25-p32 5.《Programming from the Ground Up》阅读笔记:p1-p18 6月再挖一个坑,开始《Programming from the Ground Up》的学…

【论文阅读】自动驾驶光流任务 DeFlow: Decoder of Scene Flow Network in Autonomous Driving

再一次轮到讲自己的paper!耶,宣传一下自己的工作,顺便完成中文博客的解读 方便大家讨论。Title PictureReference and pictures paper: https://arxiv.org/abs/2401.16122 code: https://github.com/KTH-RPL/DeFlow b站视频: https://www.bilibili.com/video/BV1GH4y1w7LQ1.…

利用SonarCloud和Azure DevOps提升代码质量

利用SonarCloud和Azure DevOps提升代码质量 在软件开发过程中,代码质量是至关重要的。为了确保代码的清洁和安全性,我们可以使用SonarCloud——一个基于云的代码质量与安全服务。SonarCloud不仅对开源项目免费,还为私有项目提供了14天的免费试用。本文将指导您如何将SonarCl…

免费申请一张SSL证书-包含100个域名-挑战!!

挑战一下,申请一张包含100个域名的证书 首先,我们访问来此加密网站,进入登录页面,输入我的账号密码。登录后,咱们就可以开始申请证书,首先说一下,咱账号是SVIP哦,只有SVIP才可以申请包含100个域名的证书。为了方便验证,咱么先添加一下域名接口,这样可以自动配置验证信…

.net6+ 在单文件应用程序中获取程序集位置

一般来说,获取执行程序集的位置,您可以调用: var executableDirectory = System.Reflection.Assembly.GetExecutingAssembly().Location;如果发布为单个文件, 会提示如下警告 warning IL3000: System.Reflection.Assembly.Location always returns an empty string for assemb…

(set+拓扑排序) CF1572A Book

题意:思路: 每本书之间很明显存在拓扑关系,由此想到拓扑排序。使用set对图进行拓扑排序,将阅读次数小的放在前面,若阅读次数相同则按照阅读章节编号排序。假设第 x 章在第 y 章理解之后就能理解,若 x 大于 y 则本次阅读就可以理解 x 章,否则需要下一次才能理解第 x 章。 …

【github报错解决】Failed to connect to github.com port 443: Couldnt connect to server

今天使用github push时候报错的 解决办法: 1、查看本机代理 路径:设置->网络和Internet->代理->地址:端口 2、用git cmd修改配置,port就用刚刚代理端口值git config --global http.proxy http://127.0.0.1:[port] git config --global https.proxy http://127.0.0…

LVGL组件

LVGL组件的使用 目录LVGL组件的使用1 . 父和子对象2. 部件的基本属性及设置3. 图解:还有其他样式可以设置2. 组件分类 1 . 父和子对象2. 部件的基本属性及设置 /******** 设置打小 ********/ /******** 注意:设置部件位置时,坐标原点在父对象的左上角 ********/ lv_…

Maven 笔记

开发工具:Maven相关内容笔记# Maven简介 Maven的本质是一个项目管理工具,将项目开发和管理过程抽象成一个项目对象模型(POM)) 这玩意儿是使用Java开发的,所以采用的就是Java的思想:面向对象 POM (Project Object Model):项目对象模型Maven的作用:项目构建:提供标准的、…

202406月度小结

这个学期比上个学期有意思得多了。但是为什么我只写了6月小结,没有写3月4月5月小结呢?因为那时候还没有想到用博客写这种小结形式的随笔啦…… 横向对比,这四个月都挺有意思的。但是由于我太容易忘记事情了……我的记忆是有限的,先把6月发生的趣事赶紧记录下来比较好。 昨天…

大模型技术方向Task1笔记

赛题概要 一、赛事背景 在当今数字化时代,企业积累了丰富的对话数据,这些数据不仅是客户与企业之间交流的记录,更是隐藏着宝贵信息的宝库。在这个背景下,群聊对话分角色要素提取成为了企业营销和服务的一项重要策略。 群聊对话分角色要素提取的理念是基于企业对话数据的深度…

[LeetCode] 122. Best Time to Buy and Sell Stock II

medium是你的谎言. class Solution:def maxProfit(self, prices: List[int]) -> int:#1if len(prices) == 1:return 0#elsemax_profit = 0min_price = prices[0]for i, element in enumerate(prices):#find a min_price if element <= min_price:min_price = elementelse…

【esp32 学习笔记】esp-idf学会调用组件管理——以button

简单不看版——esp-idf组件管理步骤 在ESP-IDF 组件管理器网页(https://components.espressif.com/)搜索我们需要的组件,比如【button】,然后 点开相应的组件,比如 espressif/button 组件。 【关键步骤】复制相关组件界面上配置组件的命令 ,形如:idf.py add-dependency &…

idea创建javaweb项目

1.新建project项目 2.添加依赖<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>6.0.10</version> </dependency>…

Linguistics-English-Would, Should, and Could: How to Use Them Correctly

https://7esl.com/would-should-could/ Key Takeaways“Would” is used for hypotheticals and future possibilities that may not occur. “Should” implies advice, expectation, or probability. “Could” expresses past ability or present possibility.Home Knowled…

[LeetCode] 121. Best Time to Buy and Sell Stock

想清楚了确实算是简单题. class Solution:def maxProfit(self, prices: List[int]) -> int:#1if len(prices) == 1:return 0#elsemax_profit = 0min_price = prices[0]for i, element in enumerate(prices):if element <= min_price:min_price = elementelif element - m…