在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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值