Что такое CockroachDB?
CockroachDB — проект, за которым я следил некоторое время с большим интересом. Это база данных с открытым исходным кодом, лицензированная Apache 2 ( ссылка на Github ), которая черпает вдохновение из документа Google Spanner . По сути, это хранилище ключей и значений, которое масштабируется горизонтально. Что делает его действительно интересным для нас, так это то, что 1) он поддерживает SQL с помощью проводного протокола Postgres и 2) имеет полную семантику ACID и распределенные транзакции. Если вам интересно, как они этого добиваются, обязательно прочитайте технические посты в блоге CockroachLabs (признаюсь, иногда это не для слабонервных ;-)). Обратите внимание, что это все еще распределенная система и, следовательно, следует теореме CAP, более конкретно, это система CP.
Пока еще рано, как вы прочтете в их FAQ, многие вещи еще не оптимизированы. Тем не менее, теперь, когда они недавно добавили базовую поддержку для соединений , я решил, что мне стоит попробовать его с движком Flowable. В этой статье я покажу, как легко запустить движок Flowable v6 на CockroachDB.
(Sidenote: Мне нравится это имя! Для людей, которые его не понимают: тараканы — это одно из немногих существ на земле, которое может пережить нечто вроде ядерного взрыва. Довольно выносливое маленькое животное … что-то, что вы хотели бы также для ваших данных & # 55357; & # 56898;)
Настроить
Документы по началу работы на веб-сайте CockroachDb вполне понятны, но для ясности вот шаги, которым я следовал:
- Загрузите последнюю версию архива CockroachDB (или что вам нужно)
- Распаковать и запустить первый узел:
- ./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 и дает обзор кластера:
Следующий шаг: нам нужна база данных для движка Flowable. Создание базы данных и предоставление разрешений пользователю по умолчанию (maxroach) выполняется через оболочку CockroachDB SQL:
|
1
2
3
|
./cockroachdb sql> CREATE DATABASE flowable;> GRANT ALL ON DATABASE flowable TO maxroach; |
К сожалению, CockroachDB еще не реализовал функцию метаданных JDBC, которую мы используем в движке Flowable для автоматического создания схемы базы данных. Кроме того, в некоторых случаях я не мог заставить работать внешние ключи должным образом, поэтому я скопировал / вставил скрипты Flowable SQL и удалил их. Файл загружен на Github .
Также это означает, что в данный момент вам необходимо создать схему базы данных «вручную». Если вы используете терминал bash, вы можете скачать приведенный выше скрипт с github и передать его в оболочку CockroachDB SQL следующим образом. Кроме того, вы можете вставить его в оболочку SQL.
|
1
2
|
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
Поскольку CockroachDB использует проводной протокол Postgres, нам просто нужно добавить драйвер JDBC Postgres в файл pom.xml :
|
01
02
03
04
05
06
07
08
09
10
|
<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, которая еще не выпущена. Вы можете легко создать его самостоятельно, клонировав проект flowable-engine и выполнив ‘mvn clean install -DskipTests’ в корневом каталоге. Конфигурационный файл, используемый для движка, довольно прост и выглядит как подключение к обычной реляционной базе данных Postgres. Обратите внимание, что я немного «обманываю» с настройками databaseSchemaUpdate , чтобы избежать автоматической проверки схемы.
|
1
2
3
4
5
6
|
<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" /> |
Определение процесса, которое мы будем использовать, представляет собой простой демонстрационный процесс, который выполняет несколько вещей, таких как задачи пользователя, задачи обслуживания, подпроцессы, таймеры и т. Д.
В следующем фрагменте показано, как Flowable API используется несколькими различными способами. Если вы следите за пользовательским интерфейсом CockroachDB, вы увидите, что трафик на некоторое время возрастает. Что происходит здесь:
- Строки 3-9: загрузка обработчика процессов Flowable с помощью файла конфигурации, описанного выше, и получение всех служб
- Строка 11: развертывание определения процесса
- Строки 15-19: запуск 100 экземпляров процесса
- Строки 24-33: Завершение всех задач в системе
- Строка 35: выполнение исторического запроса
Так что, как видите, ничего сложного, просто прикоснуться к различным API и проверить все это работает на CockroachDB.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
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();} |
Вывод точно такой, как вы ожидаете (и точно так же, как запуск его в реляционной базе данных).
|
1
2
3
4
5
6
7
|
Process definitions deployed = 1Process instances running = 100Completed 10 tasksCompleted 20 tasks…Completed 400 tasksFinished all tasks. Finished process instances = 100 |
Вывод
Практически тривиально запустить движок процессов Flowable на CockroachDB, особенно благодаря превосходному уровню SQL и реляционной поддержке, добавленной разработчиками CockroachDB. Есть еще способ (как вы прочтете в их блоге), но это, безусловно, классная технология уже сейчас! А кому не нравится горизонтальная масштабируемость без ущерба для транзакций ACID? Это идеально подходит для случаев использования технологического двигателя.
Я собираюсь продолжать внимательно следить за проектом CockroachDB, так как комбинация с Flowable демонстрирует большой потенциал. И, как вы знаете, я также с нетерпением жду, когда они начнут концентрироваться на производительности, чтобы запустить некоторые тесты :-).
| Ссылка: | Запуск Flowable на CockroachDB от нашего партнера JCG Джорама Барреса в блоге » Маленькие шаги с большими ногами» . |



