[Высокая производительность, Java, Микросервисы, Kubernetes] Выступает DMN, дирижирует ZeeBe: как использовать бизнес-правила в микросервисах
Автор
Сообщение
news_bot ®
Стаж: 7 лет 2 месяца
Сообщений: 27286
Меня зовут Николай Первухин, я Senior Java Developer в Райффайзенбанке. Так сложилось, что, единожды попробовав бизнес-процессы на Camunda, я стал адептом этой технологии и стараюсь ее применять в проектах со сложной логикой. Действительно сама идея подкупает: рисуешь процесс в удобном GUI-редакторе (моделлере), а фреймворк выполняет эти действия по порядку, соблюдая большой спектр элементов нотации BPMN.
К тому же в Camunda есть встроенная поддержка еще одной нотации — DMN (Decision Model and Notation): она позволяет в простой и понятной форме создавать таблицы принятия решений по входящим наборам данных. 
Но чего-то все же не хватает... Может, добавим немного скорости?Почему ускоряем процессы В банковской сфере бизнес-процессы широко используются там, где довольно часто встречаются длинные, с нетривиальной логикой процессы взаимодействия как с клиентом, так и между банковскими подсистемами. Что обычно характеризует такие процессы:
- от момента создания до завершения процесса может пройти несколько дней;
- участвует большое количество сотрудников;
- осуществляется интеграция со множеством банковских подсистем.
Фреймворк Camunda прекрасно справляется с такими задачами, однако, заглянем под капот: там находится классическая база данных для осуществления транзакционности.Но что если к логической сложности добавляется еще и требование к быстродействию? В таких случаях база данных рано или поздно становится «узким горлышком»: большое количество процессов начинает создавать блокировки, и это в конечном итоге приводит к замедлению. Отличные новости: воспользуемся ZeeBe В июле 2019 года было официально объявлено, что после двух лет разработки фреймворк ZeeBe готов к использованию на боевой среде. ZeeBe специально разрабатывался под задачи highload и, по утверждению автора, был протестирован при 10 000 процессов в секунду. В отличие от Camunda, ядро фреймворка ZeeBe принципиально не использует базу данных — из него убраны все вспомогательные подсистемы, в том числе и процессор правил DMN.В случаях, когда DMN все же необходим, он может быть добавлен как отдельное приложение. Именно такую архитектуру мы и рассматриваем в данной статье.Итак, дано:
- микросервис, инициирующий событие и запускающий процесс (event-handler);
- микросервис обработки бизнес-правил (rules-engine);
- микросервис, эмулирующий действия (action).
Данные микросервисы могут быть запущены в неограниченном количестве экземпляров для того, чтобы справиться с динамической нагрузкой.Из оркестрации у нас:
- микросервис с брокером сообщений ZeeBe (zeebe);
- микросервис визуализации работающих процессов simplemonitor (zeebe-simple-monitor).
А присматривать за всеми микросервисами будет кластер k8s.Схема взаимодействия
С точки зрения бизнес-логики в примере будет рассмотрен следующий бизнес-сценарий:
- из внешней системы происходит запрос в виде rest-обращения с передачей параметров;
- запускается бизнес-процесс, который «пропускает» входящие параметры через бизнес-правило;
- в зависимости от полученного решения из бизнес-правил запускается микросервис действий с различными параметрами.
Теперь поговорим подробнее о каждом микросервисе.Микросервис zeebeДанный микросервис состоит из брокера сообщений ZeeBe и экспортера сообщений для отображения в simple-monitor. Для ZeeBe используется готовая сборка, которую можно скачать с github. Подробно о сборке контейнера можно посмотреть в исходном коде в файле build.sh Принцип ZeeBe — минимальное число компонентов, входящих в ядро, поэтому по умолчанию ZeeBe — это брокер сообщений, работающий по схемам BPMN. Дополнительные модули подключаются отдельно: например, для отображения процессов в GUI понадобится экспортер (доступны разные экспортеры, к примеру, в ElasticSearch, в базу данных и т.п.). В данном примере возьмем экспортер в Hazelcast. И подключим его:
- добавим zeebe-hazelcast-exporter-0.10.0-jar-with-dependencies.jar в папку exporters;
- добавим в файл config/application.yamlследующие настройки:
exporters:
hazelcast:
className: io.zeebe.hazelcast.exporter.HazelcastExporter
jarPath: exporters/zeebe-hazelcast-exporter-0.10.0-jar-with-dependencies.jar
args:
enabledValueTypes: "JOB,WORKFLOW_INSTANCE,DEPLOYMENT,INCIDENT,TIMER,VARIABLE,MESSAGE,MESSAGE_SUBSCRIPTION,MESSAGE_START_EVENT_SUBSCRIPTION"
# Hazelcast port
port: 5701
Данные активных процессов будут храниться в памяти, пока simplemonitor их не считает. Hazelcast будет доступен для подключения по порту 5701. Микросервис zeebe-simplemonitorВо фреймворке ZeeBe есть две версии GUI-интерфейса. Основная версия, Operate, обладает большим функционалом и удобным интерфейсом, однако, использование Operate ограничено специальной лицензией (доступна только версия для разработки, а лицензию для прода следует запрашивать у производителя).Также есть облегченный вариант — simplemonitor (лицензируется по Apache License, Version 2.0)Simplemonitor можно оформить тоже в виде микросервиса, который периодически подключается к порту hazelcast брокера ZeeBe и выгружает оттуда данные в свою базу данных. 
Можно выбрать любую базу данных Spring Data JDBC, в данном примере используется файловая h2, где настройки, как и в любом Spring Boot приложении, вынесены в application.yml
spring:
datasource:
url: jdbc:h2:file:/opt/simple-monitor/data/simple-monitor-db;DB_CLOSE_DELAY=-1
Микросервис event-handler Это первый сервис в цепочке, он принимает данные по rest и запускает процесс. При старте сервис осуществляет поиск файлов bpmn в папке ресурсов:
private void deploy() throws IOException {
Arrays.stream(resourceResolver.getResources("classpath:workflow/*.bpmn"))
.forEach(resource -> {
try {
zeebeClient.newDeployCommand().addResourceStream(resource.getInputStream(), resource.getFilename())
.send().join();
logger.info("Deployed: {}", resource.getFilename());
} catch (IOException e) {
logger.error(e.getMessage(), e);
}
});
}
Микросервис имеет endpoint, и для простоты принимает вызовы по rest. В нашем примере передаются 2 параметра, сумма и лимит:
http://адрес-сервиса:порт/start?sum=100&limit=500
@GetMapping
public String getLoad(@RequestParam Integer sum, @RequestParam Double limit) throws JsonProcessingException {
Map<String, Object> variables = new HashMap<>();
variables.put("sum", sum);
variables.put("limit", limit);
zeebeService.startProcess(processName, variables);
return "Process started";
}
Следующий код отвечает за запуск процесса:
public void startProcess(String processName, Map<String, Object> variables) throws JsonProcessingException {
zeebeClient.newCreateInstanceCommand()
.bpmnProcessId(processName)
.latestVersion()
.variables(variables)
.send();
}
Сам процесс нарисован в специальной программе ZeeBe modeler (почти копия редактора Camunda modeler) и сохраняется в формате bpmn в папке workflow в ресурсах микросервиса. Графически процесс выглядит как:
У каждой задачи (обозначаем прямоугольником на схеме) есть свой тип задач, который устанавливается в свойствах задачи, например, для запуска правил:
Каждый дополнительный микросервис в данном примере будет использовать свой тип задач. Тип задач очень похож на очередь в Kafka: при возникновении задач к нему могут подключаться подписчики — worker’ы.После старта процесс продвинется на один шаг, и появится сообщение типа DMN.Микросервис rules-engineБлагодаря прекрасной модульной архитектуре Camunda есть возможность использовать в своем приложении (отдельно от самого фреймворка Camunda) движок правил принятия решения.Для его интеграции с вашим приложением достаточно добавить его в зависимости maven:
<dependency>
<groupId>org.camunda.bpm.dmn</groupId>
<artifactId>camunda-engine-dmn</artifactId>
<version>${camunda.version}</version>
</dependency>
Сами правила создаются в специальном графическом редакторе Camunda modeler. Одна диаграмма DMN имеет два вида отображения.Entity Relation Diagram (вид сверху) показывает зависимости правил друг от друга и от внешних параметров: 
На такой диаграмме можно представить одно или несколько бизнес-правил. В текущем примере оно одно зависит от двух параметров — сумма и лимит. Представление на этой диаграмме параметров и комментариев необязательно, но является хорошим стилем оформления.Само же бизнес-правило содержит более детальный вид:
Как видно из примера выше, бизнес-правило представляется в виде таблицы, в которой перечислены входящие и результирующие параметры. Инструмент достаточно богатый, и можно использовать различные методы сравнения, диапазоны, множества, несколько типов политик правил (первое совпадение, множественное, последовательность по диаграмме и т.п.). Такая диаграмма сохраняется в виде файла dmn. Посмотрим на примере, где такой файл располагается в папке dmn-models в ресурсах микросервиса. Для регистрации диаграммы при старте микросервиса происходит его однократная загрузка:
public void init() throws IOException {
Arrays.stream(resourceResolver.getResources("classpath:dmn-models/*.dmn"))
.forEach(resource -> {
try {
logger.debug("loading model: {}", resource.getFilename());
final DmnModelInstance dmnModel = Dmn.readModelFromStream((InputStream) Resources
.getResource("dmn-models/" + resource.getFilename()).getContent());
dmnEngine.parseDecisions(dmnModel).forEach(decision -> {
logger.debug("Found decision with id '{}' in file: {}", decision.getKey(),
resource.getFilename());
registry.put(decision.getKey(), decision);
});
} catch (IOException e) {
logger.error("Error parsing dmn: {}", resource, e);
}
});
}
Для того, чтобы подписаться на сообщения от ZeeBe, требуется осуществить регистрацию worker’а:
private void subscribeToDMNJob() {
zeebeClient.newWorker().jobType(String.valueOf(jobWorker)).handler(
(jobClient, activatedJob) -> {
logger.debug("processing DMN");
final String decisionId = readHeader(activatedJob, DECISION_ID_HEADER);
final Map<String, Object> variables = activatedJob.getVariablesAsMap();
DmnDecisionResult decisionResult = camundaService.evaluateDecision(decisionId, variables);
if (decisionResult.size() == 1) {
if (decisionResult.get(0).containsKey(RESULT_DECISION_FIELD)) {
variables.put(RESULT_DECISION_FIELD, decisionResult.get(0).get(RESULT_DECISION_FIELD));
}
} else {
throw new DecisionException("Нет результата решения.");
}
jobClient.newCompleteCommand(activatedJob.getKey())
.variables(variables)
.send()
.join();
}
).open();
}
В данном коде осуществляется подписка на событие DMN, вызов модели правил при получении сообщения от ZeeBe и результат выполнения правила сохранятся обратно в бизнес-процесс в виде переменной result (константа RESULT_DECISION_FIELD).Когда данный микросервис отчитывается ZeeBe о выполнении операции, бизнес-процесс переходит к следующему шагу, где происходит выбор пути в зависимости от выполнения условия, заданного в свойствах стрелочки:
Микросервис actionМикросервис action совсем простой. Он также осуществляет подписку на сообщения от ZeeBe, но другого типа — action.
В зависимости от полученного результата будет вызван один и тот же микросервис action, но с различными параметрами. Данные параметры задаются в закладке headers: 
Также передачу параметров можно сделать и через закладку Input/Output, тогда параметры придут вместе с переменными процесса, но передача через headers является более «каноничной». Посмотрим на получение сообщения в микросервисе:
private void subscribe() {
zeebeClient.newWorker().jobType(String.valueOf(jobWorker)).handler(
(jobClient, activatedJob) -> {
logger.debug("Received message from Workflow");
actionService.testAction(
activatedJob.getCustomHeaders().get(STATUS_TYPE_FIELD),
activatedJob.getVariablesAsMap());
jobClient.newCompleteCommand(activatedJob.getKey())
.send()
.join();
}
).open();
}
Здесь происходит логирование всех переменных бизнес-процесса:
public void testAction(String statusType, Map<String, Object> variables) {
logger.info("Event Logged with statusType {}", statusType);
variables.entrySet().forEach(item -> logger.info("Variable {} = {}", item.getKey(), item.getValue()));
}
Исходный кодВесь исходный код прототипа можно найти в открытом репозитории GitLab.Компиляция образов DockerВсе микросервисы проекта собираются командой ./build.shДля каждого микросервиса есть различный набор действий, направленных на подготовку образов docker и загрузки этих образов в открытые репозитории hub.docker.com.Загрузка микросервисов в кластер k8sДля развертывания в кластере необходимо сделать следующие действия:
- Создать namespace в кластере kubectl create namespace zeebe-dmn-example
- Создать config-map общих настроек
kind: ConfigMap
apiVersion: v1
metadata:
name: shared-settings
namespace: zeebe-dmn-example
data:
shared_servers_zeebe: <IP адрес кластера>
Далее создаем два персистентных хранилища для хранения данных zeebe и simplemonitor. Это позволит осуществлять перезапуск соответствующих подов без потери информации:kubectl apply -f zeebe--sm-volume.ymlkubectl apply -f zeebe-volume.ymlYml-файлы находятся в соответствующих проектах:
Теперь осталось последовательно создать поды и сервисы. Указанные yml-файлы находятся в корне соответствующих проектов.
kubctl apply -f zeebe-deployment.ymlkubctl apply -f zeebe-sm-deployment.ymlkubctl apply -f event-handler-deployment.ymlkubctl apply -f rules-engine-deployment.ymlkubctl apply -f action-deployment.ymlСмотрим, как отображаются наборы подов в кластере:
И мы готовы к тестовому запуску!Запуск тестового процессаЗапуск процесса осуществляется открытием в браузере соответствующий URL. К примеру, сервис event-handler имеет сервис с внешним IP и портом 81 для быстрого доступа.http://адрес-кластера:81/start?sum=600&limit=5000
Process startedДалее можно проверить отображение процесса в simplemonitor. У данного микросевиса тоже есть внешний сервис с портом 82. 
Зеленым цветом выделен путь, по которому прошел процесс. Серым выделены выполненные задачи, а снизу отображены переменные процесса.Теперь можно просмотреть лог микросервиса action, там можно увидеть значение переменной statusType, которое соответствует варианту прохождения процесса.
Поделюсь, какими ресурсами пользовался для подготовки прототипа
- https://www.youtube.com/watch?v=Q3tLKV-6J3c
- https://github.com/zeebe-io/zeebe-dmn-worker
- https://github.com/berndruecker/zeebe-camunda-dmn/blob/master/README.md
- https://zeebe.io/blog/2019/08/zeebe-horizontal-scalability/
Небольшое послесловие вместо итоговИз плюсов:
- архитектура разработанного прототипа получилась гибкой и расширяемой. Можно добавлять любое количество микросервисов для обработки сложной логики;
- простая нотация BPMN и DMN позволяет привлекать аналитиков и бизнес к обсуждению сложной логики;
- Zeebe показал себя как очень быстрый фреймворк, задержки на получение/отправку сообщений практически отсутствуют;
- Zeebe изначально разрабатывался для работы в кластере, в случае необходимости можно быстро нарастить мощности;
- без ZeeBe Operate можно вполне обойтись, Simple-Monitor отвечает минимальным требованиям.
Из минусов:
- хотелось бы иметь возможность редактирования DMN непосредственно в ZeeBe modeler (как это реализовано в Camunda), на данный момент, приходится использовать оба моделлера;
- к сожалению, только в Enterprise версии Camunda есть возможность просмотра пути, по которому принималось решение:

Это очень полезная функция при отладке правил. В Community версии приходится добавлять дополнительное поле типа output для логирования, либо разработать свое решение визуализации. При развертывании прототипа в реальных условиях в кластере k8s необходимо добавить ограничения по ресурсам (CPU и RAM), также нужно будет подобрать лучшую систему хранения исторических данных.Где применять такие технологии:
- как оркестрация внутри одной команды или продукта в виде перекладывания сложной логики на диаграммы BPMN / DMN;
- в сфере, где идет потоковая обработка данных с большим количеством интеграций. В банке это может быть проведение или проверка транзакций, обработка данных из внешних систем или просто многоэтапная трансформация данных;
- как частичная альтернатива существующего стека ESB или Kafka для интеграции между командами.
Коллеги, понимаю, что есть множество разных технологий и подходов. Буду рад, если поделитесь в комментариях вашим опытом: как вы решаете подобные задачи?
===========
Источник:
habr.com
===========
Похожие новости:
- [Open source, Виртуализация, Разработка под Linux, Разработка под Windows] Шпаргалка по pip, 6 заблуждений насчет AIOps, бесплатный онлайн-курс, а еще про Windows-программы на Linux
- [ReactJS] 6 лучших практик React в 2021 году (перевод)
- [Программирование, Java] Итак, вы хотите оптимизировать gRPC. Часть 2 (перевод)
- [JavaScript, Программирование, ReactJS, Интервью] Интервью с Дэном Абрамовым: React 17, Suspense, Redux, холивары
- [Администрирование баз данных, Распределённые системы, Микросервисы] Как e2e автотесты на Selenide помогают QA-команде при частых релизах
- [Высокая производительность, JavaScript, Программирование, WebAssembly] Разгоняем JS-парсер с помощью WebAssembly (часть 2: алгоритм и его оптимизации)
- [Разработка под iOS, Разработка мобильных приложений, Разработка под Android] Эволюция социального фида в iFunny — мобильном приложении с UGC-контентом
- [JavaScript, ReactJS, Медийная реклама] Вавилонская башня из миллиона печенек. Как мы делали игру в VK mini app
- [Высокая производительность, Алгоритмы, Беспроводные технологии, Разработка робототехники, Производство и разработка электроники] Viomi SE: «Покофон» из мира роботов-пылесосов
- [Высокая производительность, Java, Микросервисы] Улучшаем производительность Java-микросервиса парой простых приемов (перевод)
Теги для поиска: #_vysokaja_proizvoditelnost (Высокая производительность), #_java, #_mikroservisy (Микросервисы), #_kubernetes, #_zeebe, #_java, #_highload, #_k8s, #_raiffeisendgtl, #_blog_kompanii_rajffajzenbank (
Блог компании Райффайзенбанк
), #_vysokaja_proizvoditelnost (
Высокая производительность
), #_java, #_mikroservisy (
Микросервисы
), #_kubernetes
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 27-Апр 05:18
Часовой пояс: UTC + 5
Автор | Сообщение |
---|---|
news_bot ®
Стаж: 7 лет 2 месяца |
|
Меня зовут Николай Первухин, я Senior Java Developer в Райффайзенбанке. Так сложилось, что, единожды попробовав бизнес-процессы на Camunda, я стал адептом этой технологии и стараюсь ее применять в проектах со сложной логикой. Действительно сама идея подкупает: рисуешь процесс в удобном GUI-редакторе (моделлере), а фреймворк выполняет эти действия по порядку, соблюдая большой спектр элементов нотации BPMN. К тому же в Camunda есть встроенная поддержка еще одной нотации — DMN (Decision Model and Notation): она позволяет в простой и понятной форме создавать таблицы принятия решений по входящим наборам данных. ![]() Но чего-то все же не хватает... Может, добавим немного скорости?Почему ускоряем процессы В банковской сфере бизнес-процессы широко используются там, где довольно часто встречаются длинные, с нетривиальной логикой процессы взаимодействия как с клиентом, так и между банковскими подсистемами. Что обычно характеризует такие процессы:
![]() С точки зрения бизнес-логики в примере будет рассмотрен следующий бизнес-сценарий:
exporters:
hazelcast: className: io.zeebe.hazelcast.exporter.HazelcastExporter jarPath: exporters/zeebe-hazelcast-exporter-0.10.0-jar-with-dependencies.jar args: enabledValueTypes: "JOB,WORKFLOW_INSTANCE,DEPLOYMENT,INCIDENT,TIMER,VARIABLE,MESSAGE,MESSAGE_SUBSCRIPTION,MESSAGE_START_EVENT_SUBSCRIPTION" # Hazelcast port port: 5701 ![]() Можно выбрать любую базу данных Spring Data JDBC, в данном примере используется файловая h2, где настройки, как и в любом Spring Boot приложении, вынесены в application.yml spring:
datasource: url: jdbc:h2:file:/opt/simple-monitor/data/simple-monitor-db;DB_CLOSE_DELAY=-1 private void deploy() throws IOException {
Arrays.stream(resourceResolver.getResources("classpath:workflow/*.bpmn")) .forEach(resource -> { try { zeebeClient.newDeployCommand().addResourceStream(resource.getInputStream(), resource.getFilename()) .send().join(); logger.info("Deployed: {}", resource.getFilename()); } catch (IOException e) { logger.error(e.getMessage(), e); } }); } http://адрес-сервиса:порт/start?sum=100&limit=500
@GetMapping
public String getLoad(@RequestParam Integer sum, @RequestParam Double limit) throws JsonProcessingException { Map<String, Object> variables = new HashMap<>(); variables.put("sum", sum); variables.put("limit", limit); zeebeService.startProcess(processName, variables); return "Process started"; } public void startProcess(String processName, Map<String, Object> variables) throws JsonProcessingException {
zeebeClient.newCreateInstanceCommand() .bpmnProcessId(processName) .latestVersion() .variables(variables) .send(); } ![]() У каждой задачи (обозначаем прямоугольником на схеме) есть свой тип задач, который устанавливается в свойствах задачи, например, для запуска правил: ![]() Каждый дополнительный микросервис в данном примере будет использовать свой тип задач. Тип задач очень похож на очередь в Kafka: при возникновении задач к нему могут подключаться подписчики — worker’ы.После старта процесс продвинется на один шаг, и появится сообщение типа DMN.Микросервис rules-engineБлагодаря прекрасной модульной архитектуре Camunda есть возможность использовать в своем приложении (отдельно от самого фреймворка Camunda) движок правил принятия решения.Для его интеграции с вашим приложением достаточно добавить его в зависимости maven: <dependency>
<groupId>org.camunda.bpm.dmn</groupId> <artifactId>camunda-engine-dmn</artifactId> <version>${camunda.version}</version> </dependency> ![]() На такой диаграмме можно представить одно или несколько бизнес-правил. В текущем примере оно одно зависит от двух параметров — сумма и лимит. Представление на этой диаграмме параметров и комментариев необязательно, но является хорошим стилем оформления.Само же бизнес-правило содержит более детальный вид: ![]() Как видно из примера выше, бизнес-правило представляется в виде таблицы, в которой перечислены входящие и результирующие параметры. Инструмент достаточно богатый, и можно использовать различные методы сравнения, диапазоны, множества, несколько типов политик правил (первое совпадение, множественное, последовательность по диаграмме и т.п.). Такая диаграмма сохраняется в виде файла dmn. Посмотрим на примере, где такой файл располагается в папке dmn-models в ресурсах микросервиса. Для регистрации диаграммы при старте микросервиса происходит его однократная загрузка: public void init() throws IOException {
Arrays.stream(resourceResolver.getResources("classpath:dmn-models/*.dmn")) .forEach(resource -> { try { logger.debug("loading model: {}", resource.getFilename()); final DmnModelInstance dmnModel = Dmn.readModelFromStream((InputStream) Resources .getResource("dmn-models/" + resource.getFilename()).getContent()); dmnEngine.parseDecisions(dmnModel).forEach(decision -> { logger.debug("Found decision with id '{}' in file: {}", decision.getKey(), resource.getFilename()); registry.put(decision.getKey(), decision); }); } catch (IOException e) { logger.error("Error parsing dmn: {}", resource, e); } }); } private void subscribeToDMNJob() {
zeebeClient.newWorker().jobType(String.valueOf(jobWorker)).handler( (jobClient, activatedJob) -> { logger.debug("processing DMN"); final String decisionId = readHeader(activatedJob, DECISION_ID_HEADER); final Map<String, Object> variables = activatedJob.getVariablesAsMap(); DmnDecisionResult decisionResult = camundaService.evaluateDecision(decisionId, variables); if (decisionResult.size() == 1) { if (decisionResult.get(0).containsKey(RESULT_DECISION_FIELD)) { variables.put(RESULT_DECISION_FIELD, decisionResult.get(0).get(RESULT_DECISION_FIELD)); } } else { throw new DecisionException("Нет результата решения."); } jobClient.newCompleteCommand(activatedJob.getKey()) .variables(variables) .send() .join(); } ).open(); } ![]() Микросервис actionМикросервис action совсем простой. Он также осуществляет подписку на сообщения от ZeeBe, но другого типа — action. ![]() В зависимости от полученного результата будет вызван один и тот же микросервис action, но с различными параметрами. Данные параметры задаются в закладке headers: ![]() Также передачу параметров можно сделать и через закладку Input/Output, тогда параметры придут вместе с переменными процесса, но передача через headers является более «каноничной». Посмотрим на получение сообщения в микросервисе: private void subscribe() {
zeebeClient.newWorker().jobType(String.valueOf(jobWorker)).handler( (jobClient, activatedJob) -> { logger.debug("Received message from Workflow"); actionService.testAction( activatedJob.getCustomHeaders().get(STATUS_TYPE_FIELD), activatedJob.getVariablesAsMap()); jobClient.newCompleteCommand(activatedJob.getKey()) .send() .join(); } ).open(); } public void testAction(String statusType, Map<String, Object> variables) {
logger.info("Event Logged with statusType {}", statusType); variables.entrySet().forEach(item -> logger.info("Variable {} = {}", item.getKey(), item.getValue())); }
kind: ConfigMap
apiVersion: v1 metadata: name: shared-settings namespace: zeebe-dmn-example data: shared_servers_zeebe: <IP адрес кластера> ![]() Теперь осталось последовательно создать поды и сервисы. Указанные yml-файлы находятся в корне соответствующих проектов. kubctl apply -f zeebe-deployment.ymlkubctl apply -f zeebe-sm-deployment.ymlkubctl apply -f event-handler-deployment.ymlkubctl apply -f rules-engine-deployment.ymlkubctl apply -f action-deployment.ymlСмотрим, как отображаются наборы подов в кластере: ![]() И мы готовы к тестовому запуску!Запуск тестового процессаЗапуск процесса осуществляется открытием в браузере соответствующий URL. К примеру, сервис event-handler имеет сервис с внешним IP и портом 81 для быстрого доступа.http://адрес-кластера:81/start?sum=600&limit=5000 Process startedДалее можно проверить отображение процесса в simplemonitor. У данного микросевиса тоже есть внешний сервис с портом 82. ![]() Зеленым цветом выделен путь, по которому прошел процесс. Серым выделены выполненные задачи, а снизу отображены переменные процесса.Теперь можно просмотреть лог микросервиса action, там можно увидеть значение переменной statusType, которое соответствует варианту прохождения процесса. ![]() Поделюсь, какими ресурсами пользовался для подготовки прототипа
![]() Это очень полезная функция при отладке правил. В Community версии приходится добавлять дополнительное поле типа output для логирования, либо разработать свое решение визуализации. При развертывании прототипа в реальных условиях в кластере k8s необходимо добавить ограничения по ресурсам (CPU и RAM), также нужно будет подобрать лучшую систему хранения исторических данных.Где применять такие технологии:
=========== Источник: habr.com =========== Похожие новости:
Блог компании Райффайзенбанк ), #_vysokaja_proizvoditelnost ( Высокая производительность ), #_java, #_mikroservisy ( Микросервисы ), #_kubernetes |
|
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 27-Апр 05:18
Часовой пояс: UTC + 5