기초를 초월하다
22982 단어 camundabpmnadventofcodezeebe
하지만 이제 진정한 이야기를 해보자.워크플로우에서 특정 임무를 수행하는 방법을 어떻게 가르칩니까?나는 너무 많은 세부 사항을 말하고 싶지 않지만,Camunda Cloud의 작업 원리는 다음과 같다. Zeebe, 밑바닥 엔진, 노동자를 위해pubsub 시스템을 사용한다.일꾼은 본질적으로 특정 코드를 집행하는 소프트웨어다.근로자가 엔진에 등록되어 임무를 분배하기를 기다리다.
workers 자체는 어떠한 프로그래밍 언어로도 실현할 수 있으며 Java,NodeJS 또는Go 등 언어에 대해 간략하게 통합된 라이브러리가 있다.
제 첫 번째 글의 약속은 여전히 유효합니다. 이 연습을 위해 코드를 작성할 필요가 없습니다.다시 로그인Restzeebe하고 Workers 섹션으로 이동합니다.백엔드에서worker를 임시로 실행하고 그룹에 연결하며 작업을 기다리는 세 가지 예시를 볼 수 있습니다.
무작위 수
첫 번째 예시에서, 작업자는 무작위 수를 정하고, 이 수를 이미 시작된 실례에 되돌려준다.이 숫자는 프로세스 컨텍스트에 기록되며 다음 게이트웨이에서 5보다 큰지 확인합니다.각 예제에는 트리거할 수 있는 세 가지 작업이 있습니다.
deploy
: BPMN 그림을 클러스터에 배치합니다.start
: BPMN 관계도를 시작하는 새로운 예입니다.worker
: 일꾼이 집단에 몇 초 동안 등록한 후에 코드를 실행한다.Random Number
.이 과정은 계속되지 않을 것이다. 왜냐하면 직원들은 반드시 상응하는 임무를 먼저 집행해야 하기 때문이다.지금 워크맨을 실행하면, 짧은 시간 후에 계속 실행하고, 최종적으로 종료되는 실례를 볼 수 있습니다.NodeJS의 실현은 이 노동자에게 매우 간단하다.
const { ZBClient } = require("zeebe-node");
function createWorkerRandomNumber() {
// initialize node js client with camunda cloud API client
const zbc = new ZBClient({
camundaCloud: {
clientId: connectionInfo.clientId,
clientSecret: connectionInfo.clientSecret,
clusterId: connectionInfo.clusterId,
},
});
// create a worker with task type 'random-number'
zbc.createWorker({
taskType: "random-number",
taskHandler: async (job: any, complete: any, worker: any) => {
try {
const min =
job.customHeaders.min && job.customHeaders.max
? Number(job.customHeaders.min)
: 0;
const max =
job.customHeaders.min && job.customHeaders.max
? Number(job.customHeaders.max)
: 10;
const randomNumber = Math.floor(Math.random() * (max - min + 1) + min);
complete.success({
randomNumber,
});
} catch (error) {
complete.failure(error);
}
},
});
}
작업 유형은 BPMN 그림의 서비스 작업 속성에서 구성됩니다.게이트웨이에도 적용됩니다.이 예에서 우리는 조건을 절차 상하문에 있는 변수에 추가하고 이 변수는 작업자가 설정하기를 희망한다.게이트웨이의 두 개의 전송 경로는 다음과 같이 구성됩니다.
# NO
=randomNumber<=5
및# YES
=randomNumber>5
더 이상 할 말이 없다.그러나 간단한 워크맨을 작성하고 진일보한 과정에서 사용하는 결과가 얼마나 쉬운지 알 수 있습니다.수량을 늘리다
두 번째 예도 간단하다.그것은 간단한 순환을 대표한다.적절한 Worker 구현은 다음과 같습니다.
const { ZBClient } = require("zeebe-node");
function createWorkerIncreaseNumber() {
const zbc = new ZBClient({
camundaCloud: {
clientId: connectionInfo.clientId,
clientSecret: connectionInfo.clientSecret,
clusterId: connectionInfo.clusterId,
},
});
zbc.createWorker({
taskType: "increase-number",
taskHandler: async (job: any, complete: any, worker: any) => {
const number = job.variables.number ? Number(job.variables.number) : 0;
const increase = job.customHeaders.increase
? Number(job.customHeaders.increase)
: 1;
try {
const newNumber = number + increase;
complete.success({
number: newNumber,
});
} catch (error) {
complete.failure(error);
}
},
});
}
노동자의 구조는 첫 번째 예와 같다.주요 차이점은 프로세스 컨텍스트의 값을 입력으로 사용하는 것입니다.이 값은 실행할 때마다 증가합니다.중단 기준은 워크맨이 실현하는 일부분이 아니라는 것도 볼 수 있다.일꾼은 그의 복잡한 임무에 온 정신을 기울여야 한다(하하)i++;
중지 기준이 과정 중 모델링을 하는 것이 바로 그것이 속하는 영역이다.프로세스 모델링을 할 때, 우리는 도표에서 서열을 읽을 수 있기를 희망하기 때문이다.이런 상황에서 순환은 언제 끝납니까?갈고리.사이트
이것은 이 절에서 내가 가장 좋아하는 예다.이것은 HTTP 요청을 실행함으로써 실제 용례를 보여 줍니다.Webhook.site 의 서비스가 이 목적에 사용한 효과를 보십시오.이 예제에 사용할 수 있는 별도의 HTTP 끝점이 제공됩니다.서비스에 요청을 보내면 대시보드에 새 항목이 표시됩니다.
이 예를 당신의 개인적인 웹훅에 적용시키세요.웹 사이트에서 Webhook Id를 적절하게 설정해야 합니다.작업을 시작하면 Id나 개인 Webhook을 입력할 수 있는 입력 필드를 발견할 수 있습니다.사이트 주소.Restzeebe는 URL에서 적절하게 Id를 추출합니다.
다음 작업 코드는 다음과 같습니다.
import axios, { AxiosRequestConfig, AxiosResponse } from 'axios'
const { ZBClient } = require('zeebe-node')
function createWorkerRandomNumber() {
const zbc = new ZBClient({
camundaCloud: {
clientId: connectionInfo.clientId,
clientSecret: connectionInfo.clientSecret,
clusterId: connectionInfo.clusterId,
},
})
zbc.createWorker({
taskType: 'webhook',
taskHandler: async (job: any, complete: any, worker: any) => {
const webhookId = job.customHeaders.webhook
? job.customHeaders.webhook
: job.variables.webhook
const method: 'GET' | 'POST' | 'DELETE' = job.customHeaders.method
? (String(job.customHeaders.method).toUpperCase() as
| 'GET'
| 'POST'
| 'DELETE')
: 'GET'
try {
if (!webhookId) {
throw new Error('Webhook Id not configured.')
}
if (!method || !['GET', 'POST', 'DELETE'].includes(method)) {
throw new Error(
'Method must be set and one of the following values: GET, POST, DELETE'
)
}
const url = 'https://webhook.site/' + webhookId
const config: AxiosRequestConfig = {
method,
url,
}
const response: AxiosResponse = await axios(config)
complete.success({
response: response.data ? response.data : undefined,
})
} catch (error) {
complete.failure(error)
}
},
})
}
엔진 덮개 아래Axios에서 HTTP 요청을 수행합니다.Worker는 HTTP 방법을 직접 구성할 수 있도록 설계되었습니다.이를 위해서는 BPMN 그림을 다운로드하여 서비스 작업 헤더 파라미터를 탐색하고 다른 방법을 설정해야 합니다.내가 이 예를 좋아하는 데는 몇 가지 이유가 있지만 가장 중요한 이유는 만약에 당신이 이미 마이크로 서비스 생태계를 가지고 서비스가REST를 통해 상호작용을 한다면 작업 흐름 엔진을 통해 마이크로 서비스를 조율하는 것은 작은 걸음일 뿐이다.
도전하다
지금 궁금할지도 몰라, 손을 더럽히고 싶어?Restzeebe는 마지막으로 작은 도전을 제공합니다.마찬가지로 코드는 필요 없지만, 사용자가 직접 모델링하고, 설정하고, 배치하고, 실행해야 합니다.Camunda Cloud에는 이 목적으로 사용할 수 있는 내장 모델링이 포함되어 있습니다.나는 너에게 이것이 어떤 임무인지 알려주지 않을 것이다.)그러나 하나Highscore는 당신과 다른 사람의 비교를 볼 수 있다.)
즐겁게 놀아라!
나로 하여금 이 문장이 유용한지 아닌지를 알게 해라!만약 당신이 이런 내용을 좋아한다면 나를 따라오십시오. GitHub
제목 사진 작성자Fabio Comparelli가 Unsplash
마지막 사진은 Adam Whitlock에서 찍었다Unsplash
Reference
이 문제에 관하여(기초를 초월하다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/urbanisierung/go-beyond-the-basics-3l7h텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)