在CockroachDB上运行Flowable

什么是CockroachDB?

CockroachDB是一个我一直关注很长一段时间的项目。 这是一个开放源代码的Apache 2许可数据库( Github链接 ), 极大地从Google Spanner白皮书中汲取了灵感 。 它的核心是可水平扩展的键值存储。 但是,对我们而言真正有趣的是:1)它通过使用Postgres有线协议支持SQL; 2)具有完整的ACID语义和分布式事务。 如果您对他们如何实现这一目标感兴趣,请确保阅读CockroachLabs博客上的技术文章(我承认,有时这并不适合胆怯的人;-)。 请注意,它仍然是分布式系统,因此遵循CAP定理,更具体地说,它是CP系统。

cockroachdb_beta_hero

正如您将在其常见问题解答中所读到的那样,这还处于初期阶段,因为许多事情尚未进行优化。 但是,既然他们最近增加了对join的基本支持 ,我想我应该使用Flowable引擎来尝试一下。 在本文中,我将展示在CockroachDB上运行Flowable v6流程引擎有多么容易。

(旁注:我喜欢这个名字!对于不了解它的人:蟑螂是地球上能够幸存于核爆炸等生物中的少数生物之一。相当有弹性的小动物……您也希望将其用于数据收集��)

设定

CockroachDb网站上的入门文档非常清楚,但为清楚起见,这是我遵循的步骤:

  • 下载最新的CockroachDB tarball(或您的系统需要的任何文件)
  • 解压并启动第一个节点:
    • ./cockroachdb开始
  • 启动第二个节点:
    • ./cockroach start –store = node2 –port = 26258 –http-port = 8081 –join = localhost:26257
  • 启动第三个节点:
    • ./cockroach start –store = node3 –port = 26259 –http-port = 8082 –join = localhost:26257

欢呼,您现在有一个运行着三个节点的集群,它们将很高兴地在彼此之间复制数据。 有一个不错的管理应用程序,可在8080上运行,并概述了群集:

屏幕1

下一步:我们需要Flowable引擎的数据库。 通过CockroachDB SQL shell创建数据库并向默认用户(maxroach)授予权限:

./cockroachdb sql
> CREATE DATABASE flowable;
> GRANT ALL ON DATABASE flowable TO maxroach;

遗憾的是,CockroachDB尚未实现JDBC元数据功能,我们在Flowable引擎中使用了该功能来自动创建数据库模式。 另外,在某些情况下我无法完全使外键正常工作,因此我复制/粘贴了Flowable SQL脚本并删除了这些脚本。 该文件已上传到Github上 。

同样,这意味着当前您需要“手动”创建数据库模式。 如果您使用的是bash终端,则可以从github下载上面的脚本,并按如下所示将其提供给CockroachDB SQL Shell。 或者,您可以将其粘贴到SQL Shell中。

sql=$(wget https://raw.githubusercontent.com/jbarrez/flowable-cockroachdb-demo/master/engine-schema.sql -q -O -)
./cockroach sql –database=flowable –user=maxroach -e “$sql”

在CockroachDB上可流动

现在数据库已准备就绪。 是时候使用此数据库作为数据存储来启动Flowable引擎。 所有源代码都可以在Github上获得: https : //github.com/jbarrez/flowable-cockroachdb-demo

徽标1

由于CockroachDB使用Postgres有线协议,我们只需要将Postgres JDBC驱动程序添加到pom.xml中 :

<dependency><groupId>org.flowable</groupId><artifactId>flowable-engine</artifactId><version>6.0.0.RC1-SNAPSHOT</version>
</dependency>
<dependency><groupId>org.postgresql</groupId><artifactId>postgresql</artifactId><version>9.4.1211.jre7</version>
</dependency>

我在这里使用当前的v6 master分支,尚未发布。 通过克隆flowable-engine项目并在根目录中执行“ mvn clean install -DskipTests”,您可以轻松地自己构建它。 用于引擎的配置文件非常简单,看起来就像连接到常规Postgres关系数据库一样。 请注意,我有点“欺骗” databaseSchemaUpdate设置以避免自动模式检查。

<property name="jdbcUrl" value="jdbc:postgresql://127.0.0.1:26257/flowable?sslmode=disable" />
<property name="jdbcDriver" value="org.postgresql.Driver" />
<property name="jdbcUsername" value="maxroach" />
<property name="jdbcPassword" value="" /><property name="databaseSchemaUpdate" value="cockroachDb" />

我们将使用的流程定义是一个简单的演示流程,它行使一些任务,例如用户任务,服务任务,子流程,计时器等:

图2

以下代码段显示了如何以几种不同方式使用Flowable API。 如果您遵循CockroachDB管理员UI,则会看到流量增加了一段时间。 这里发生的是:

  • 第3-9行:从上方使用配置文件启动Flowable流程引擎,并获取所有服务
  • 第11行:部署流程定义
  • 第15-19行:启动100个流程实例
  • 第24-33行:完成系统中的所有任务
  • 第35行:进行历史查询

因此,正如您所看到的,简单地触摸各种API并对其进行验证就可以了,这在CockroachDB上是没有用的。

public static void main(String[] args) {ProcessEngine processEngine = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("flowable.cfg.xml").buildProcessEngine();RepositoryService repositoryService = processEngine.getRepositoryService();RuntimeService runtimeService = processEngine.getRuntimeService();TaskService taskService = processEngine.getTaskService();HistoryService historyService = processEngine.getHistoryService();repositoryService.createDeployment().addClasspathResource("demo-process.bpmn").deploy();System.out.println("Process definitions deployed = " + repositoryService.createProcessDefinitionQuery().count());Random random = new Random();for (int i=0; i<100; i++) {Map<String, Object> vars = new HashMap<>();vars.put("var", random.nextInt(100));runtimeService.startProcessInstanceByKey("myProcess", vars);}System.out.println("Process instances running = " + runtimeService.createProcessInstanceQuery().count());LinkedList<Task> tasks = new LinkedList<>(taskService.createTaskQuery().list());while (!tasks.isEmpty()) {Task task = taskService.createTaskQuery().taskId(tasks.pop().getId()).singleResult();if (task != null) {taskService.complete(task.getId());}if (tasks.isEmpty()) {tasks.addAll(taskService.createTaskQuery().list());}}System.out.println("Finished all tasks. Finished process instances = "+ historyService.createHistoricProcessInstanceQuery().finished().count());processEngine.close();
}

输出完全符合您的期望(并且与在关系数据库上运行的输出完全相同)。

Process definitions deployed = 1
Process instances running = 100
Completed 10 tasks
Completed 20 tasks
…
Completed 400 tasks
Finished all tasks. Finished process instances = 100

结论

在CockroachDB上运行Flowable流程引擎几乎是微不足道的,特别是通过出色的SQL层和CockroachDB开发人员添加的关系支持。 还有一段路要走(正如您将在他们的博客上阅读的那样),但是现在肯定已经是一项很酷的技术了! 谁又不喜欢不牺牲ACID交易的水平可扩展性呢? 它非常适合流程引擎的用例。

我将继续密切关注CockroachDB项目,因为与Flowable的结合显示出很大的潜力。 而且,正如您所知,一旦他们开始关注性能,我也非常期待能够运行一些基准测试:-)。

翻译自: https://www.javacodegeeks.com/2016/11/running-flowable-cockroachdb.html

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

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

相关文章

C error :Run-Time Check Failure #2 - Stack around the variable 'b' was corrupted.

运行程序遇到这样的错误&#xff1a;Run-Time Check Failure #2 - Stack around the variable b was corrupted. 检查后发现原因在于&#xff1a;数组b越界了&#xff0c;int b[4]里面有4个元素&#xff0c;包含b[0],b[1],b[2],b[3],没有b[4]&#xff0c;赋值的时候把某个数据赋…

如何配置Apache虚拟主机?(基于IP、基于端口、基于域名)

一、Apache虚拟机配置前的准备工作 1、下载yum源2、安装yum包3、安装httpd包4、查看并关闭selinux5、取消中心主机cd /etc/httpd/confvim httpd.conf修改文件中的内容如下&#xff1a;当以上这些工作准备好之后&#xff0c;我们就可以来配置虚拟机了二、我们首先来做一个基于IP…

[bat]删除文件

删除文件 del /f /s /q D:\HRG\NEW_Vn\CSV\*.meta 删除空文件夹 只能先删完文件夹中的文件&#xff0c;再删除空文件夹 rd /s /q D:\HRG\NEW_Vn\CSV\ 脚本 修改 echo off echo --------------------WARNING-------------------- echo [%1] folder will be deleted echo -------…

vvv在线文档导出工具_一款真正实时的在线文档协作编辑工具,多人可同时对一份文件修改...

etherpad-lite一个非常实时的网络协作文字处理器Etherpad是一款真正实时的协作编辑器&#xff0c;可扩展到数千个同步实时用户。与所有其他协作工具不同&#xff0c;Etherpad提供完全保真的数据导出和可移植性&#xff0c;使其完全符合GDPR标准。语言Etherpad是在服务器和客户端…

Mat的初始化以及Mat与数组的相互转化

Mat类型数据的初始化方法可以有以下两种&#xff1a; 1、直接初始化 Mat_<float> T_L (Mat_<float>(3, 1) << -518.97666, 01.20629, 9.14632); 2、利用数组初始化 float A[4][3] { 0 }; Mat A_mat Mat(4, 3, CV_32F, A);//如果是double类型用64 注意&…

smp架构与numa架构_NUMA架构和Java

smp架构与numa架构是时候部署您的应用程序了&#xff0c;期待着采购最适合负载要求的硬件。 如今&#xff0c;具有40核或80核的包装盒非常普遍。 总体概念是更多的内核&#xff0c;更多的处理能力&#xff0c;更多的吞吐量。 但是我看到了一些相反的结果&#xff0c;表明在80核…

CGI跟我学

CGI 意思为 Common Gateway Interface, 一种基于浏览器的输入、在Web服务器上运行的程序方法. CGI脚本 使你的浏览器与用户能交互&#xff0c;为了在数据库中寻找一个名词, 提供你写入的评论&#xff0c;或者从一个表单中选择几个条目并且能得到一个明确的回答. 如果你曾经遇到…

opencv中的矩阵拼接

hconcat、vconcat Mat_<float> T_L (Mat_<float>(3, 1) << -518.97666, 01.20629, 9.14632);//平移向量 Mat_<float> T_R (Mat_<float>(3, 2) << 518.97666, -01.20629,-9.14632,518.97666, -01.20629, -9.14632);//旋转向量 Mat_<f…

Java注释是一个大错误

注释是在Java 5中引入的&#xff0c;我们都为之兴奋。 如此出色的工具可以缩短代码&#xff01; 不再有Hibernate / Spring XML配置文件&#xff01; 只是注释&#xff0c;就在我们需要它们的代码中。 没有更多的标记接口 &#xff0c;只有运行时保留的 反射可发现注释&#xf…

tcpdump 抓二层包_可能是我见过的最简单易懂且实用的 TCPDump 和 Wireshark 抓包及分析教程!( 强烈建议收藏 )...

公众号关注 「奇妙的 Linux 世界」设为「星标」&#xff0c;每天带你玩转 Linux &#xff01;本文将展示如何使用 tcpdump 抓包&#xff0c;以及如何用 tcpdump 和 wireshark 分析网络流量。文中的例子比较简单&#xff0c;适合作为入门参考。1. 基础环境准备为方便大家跟着上手…

JDBC分页查询及实现

当数据过多时&#xff0c;一页之内是无法显示的&#xff0c;因此需要进行分页显示。 &#xff08;一&#xff09;分页技术实现&#xff1a; 物理分页&#xff1a; - 在数据库执行查询时&#xff08;实现分页查询&#xff09;&#xff0c;查询需要的数据—-依赖数据库的SQL语句 …

SELinux深入理解

1. 简介 SELinux带给Linux的主要价值是&#xff1a;提供了一个灵活的&#xff0c;可配置的MAC机制。 Security-Enhanced Linux (SELinux)由以下两部分组成&#xff1a; 1) Kernel SELinux模块(/kernel/security/selinux) 2) 用户态工具 SELinux是一个安全体系结构&#xff0c;它…

头文件的写法

#ifndef SURF_FUNC_H_//大写&#xff0c;防止头文件被多次包含&#xff0c;防止与自带的头文件重复 #define SURF_FUNC_H_float** SURFCompare(Mat srcImage1, Mat srcImage2, float paraHessian);#endif 1.只需要将函数声明、宏定义、结构声明等内容写入。 2.头文件可以定义很…

windows调用python_如何在Windows操作系统中从R调用Python?

我正在寻找一种在Windows操作系统上调用R中的python的方法。因为似乎没有可用的R包(至少没有最近更新的包)&#xff0c;我正在寻找如何在R脚本中编写一组命令的线索&#xff0c;然后可以以批处理模式发送蟒蛇。简而言之&#xff0c;如何在Windows操作系统中从R调用python&#…

range

# i 1 # while i <100: # print(i) # i 1# range(参数) [0,参数) # for i in range(20): # range()可以被迭代 0-9 # print(i)# range(参数1, 参数2) [参数1, 参数2) 切片 # for i in range(10, 20): # print(i)# range(参数1, 参数2, 参数3) [参数1…

OSI七层网络模型与TCP/IP四层网络模型

2.1 OSI网络分层参考模型网络协议设计者不应当设计一个单一、巨大的协议来为所有形式的通信规定完整的细节&#xff0c;而应把通信问题划分成多个小问题&#xff0c;然后为每一个小问题设计一个单独的协议。这样做使得每个协议的设计、分析、时限和测试比较容易。协议划分的一个…

python小学生课本剧_二年级上学期课本剧

我们把这美丽的景色看个够。 (二人分别立在舞台两边&#xff0c;向远处眺望&#xff0c;作观赏状。) 小洁&#xff1a;(开心地)啊&#xff0c;岸上的景色真美&#xff01; 小刚&#xff1a;瞧&#xff0c;那些奇形怪状的石头真好看&#xff01; (石蛙、石鹰、石兔、石龟边舞边上…

用数组存储循环序号的数据

一个i&#xff08;i<10&#xff09;对应四个坐标值&#xff0c;需要用4*i大小的一维数组循环存储&#xff0c;或者用二维数组b[i][4]存储&#xff0c;i行4列。 一维存储方法&#xff08;类似于opencv存储彩图的顺序&#xff09;for (int i 0; i < viewMatches.size(); i…

spring 事物合并_Spring系列合并

spring 事物合并Spring Collection合并是我第一次遇到的功能&#xff0c;它是对StackOverflow 问题的回答 这是一种创建基本集合&#xff08;列表&#xff0c;集合&#xff0c;地图或属性&#xff09;并在其他Bean中修改此基本集合的方法&#xff0c;下面通过一个示例对此进行最…

2018/11/29 一个64位操作系统的设计与实现 03 (在Bochs上运行Boot程序)

使用命令dd强制将引导程序boot.bin写入引导扇区: dd ifboot.bin of/home/parallels/Documents/bochs-2.6.9/boot.img bs512 count1 convnotrunc 在P39页有完整的讲解命令的意思 注意: 书中使用的: of../../bochs-2.6.9/boot.img 是错误的. 使用命令: ./bochs -f .bochsrc 书中使…