کموندا یک موتور هماهنگ ساز و گردش کار مبتنی بر REST با استفاده آسان
من در مورد معماریهای میکروسرویس با افراد غیرجاوا صحبت میکنم. همه با این مشکل روبرو هستند که در معماری میکروسرویس خود به یک موتور هماهنگ ساز نیاز دارند – یا به سادگی می خواهند از گردش کار، ترتیب فعالیت ها، مدیریت وقفه ها، Saga و جبران یا سایر ویژگی های جالب استفاده کنند.
پلتفرم منبع باز BPM از کاموندا این موارد استفاده را به خوبی ارائه میدهد. یادگیری آسان توسعهدهنده یکی از ارزشهای کلیدی پشت محصول است – اما به محض اینکه به مستندات وارد میشوید، ممکن است این تصور را داشته باشید که بیشتر یادگیری آسان توسعهدهنده مخصوص جاوا است.
این پلتفرم تعداد زیادی قلاب برای اتصال قابلیتها و برنامههای افزودنی شما فراهم میکند، اما همه اینها در جاوا انجام میشود. بنابراین آیا سایر فناوران امکان انجام آن را ندارند؟
نه! در واقع اجرای کاموندا بدون دانش جاوا و تنظیم معماری برای کدنویسی به زبان دلخواه شما آسان است. این پست وبلاگ:
- معماری پایه را معرفی می کند
- REST API را معرفی می کند
- نکاتی در مورد کتابخانه های مشتری موجود برای زبان هایی غیر از جاوا میدهد
- مثالی را با استفاده از C# و Node.JS نشان میدهد
- روش هایی برای اجرای سرور کاموندا (Docker یا Tomcat) را شرح میدهد
معماری
کاموندا به زبان جاوا نوشته شده است و برای اجرا به ماشین مجازی جاوا (JVM) نیاز دارد. کاموندا یک REST API ارائه میدهد که به شما امکان میدهد به هر زبانی که دوست دارید کدنویسی کنید و فقط با کاموندا REST صحبت کنید:
گردش کار در کاموندا در BPMN تعریف شده است که اساسا یک فایل XML است. می توان آن را به صورت گرافیکی با استفاده از Camunda Modeler مدل سازی کرد.
کاموندا را از طریق تصویر از پیش ساخته شده Docker اجرا کنید
ساده ترین راه برای اجرای کاموندا استفاده از Docker است. روش های جایگزین اجرای کاموندا در ادامه این مقاله توضیح داده شده است:
در ساده ترین حالت فقط اجرا کنید:
docker run -d -p 8080:8080 camunda/camunda-bpm-platform:latest
لازم نیست به لینوکس، ماشین های مجازی جاوا یا تامکت ها اهمیت دهید. Dockerfiles و برخی از اسناد (به عنوان مثال نحوه اتصال آن با پایگاههای داده انتخابی) در Github موجود است:
اگر میخواهید Camunda Enterprise Edition را اجرا کنید، میتوانید به راحتی Dockerfile را برای استفاده از دانلود سازمانی تغییر دهید:
https://www.github.com/camunda/docker-camunda-bpm-platform/blob/master/Dockerfile#L26
اما یک نقطه ضعف در این رویکرد وجود دارد: شما یک نسخه تامکت توزیع شده توسط کاموندا دریافت میکنید که ممکن است همیشه شامل آخرین patch نباشد.
بنابراین شما میتوانید تصویر داکر را خودتان بر اساس توزیع مناسب Tomcat بسازید که در این مثال نشان داده شده است. یا یکی از گزینههایی که بعدا توضیح داده شد را دنبال میکنید.
استقرار یک مدل فرآیند
بیایید به مثالی با استفاده از Saga رزرو سفر کلاسیک نگاه کنیم که در آن میخواهید سه فعالیت را پشت سر هم فراخوانی کنید – و در صورت شکست بعدی، فعالیتهای با موفقیت انجام شده را به درستی جبران کنید. به صورت BPMN بیان میشود که در شکل زیر آمده است:
اکنون میتوانید از REST API برای استقرار مدل فرآیند استفاده کنید. فرض کنید آن را با نام trip.bpmn ذخیره و کاموندا را از طریق Docker راهاندازی کردهاید تا در localhost:8080 در دسترس باشد:
curl -w “\n” \
-H “Accept: application/json” \
-F “deployment-name=trip” \
-F “enable-duplicate-filtering=true” \
-F “deploy-changed-only=true” \
-F “trip.bpmn=@trip.bpmn” \
http://localhost:8080/engine-rest/deployment/create
اکنون میتوانید نمونههای جدید گردش کار را از طریق REST API شروع کنید و دادههایی را که میخواهید به عنوان متغیرهای نمونه گردش کار داشته باشید، تحویل دهید:
curl \
-H “Content-Type: application/json” \
-X POST \
-d ‘{“variables”:{“someData” : {“value” : “someValue”, “type”: “String”}},”businessKey” : “12345”}}’ \
http://localhost:8080/engine-rest/process-definition/key/FlowingTripBookingSaga/start
حال، سوال جالب بعدی این است: چگونه کاموندا با خدماتی مانند رزرو خودرو تماس میگیرد؟ کاموندا نه تنها میتواند خدمات را فوراً (Push-Principle) با استفاده از برخی اتصال دهنده های داخلی فراخوانی کند، بلکه موارد کاری را نیز در نوعی صف داخلی قرار دهد.
سپس یک کارگر میتواند آیتم های کاری را از طریق REST بیاورد، کار را انجام دهد و به کاموندا از تکمیل (Pull-Principle) اطلاع دهد.
بنابراین ابتدا وظایف را واکشی میکنید و آنها را برای خود قفل میکنید (همانطور که سایر کارگران ممکن است همزمان واکشی کنند تا سیستم شما را مقیاسبندی کنند):
curl \
-H “Content-Type: application/json” \
-X POST \ d'{“workerId”:”worker123″,”maxTasks”:1,”usePriority”:true,”topics”:[{“topicName”: “reserve-car”, “lockDuration”: 10000, “variables”: [“someData”]}]}’ \
http://localhost:8080/engine-rest/external-task/fetchAndLock
و به کاموندا بگویید کارگر کار خود را کامل کرده است (توجه داشته باشید که باید شناسه وظیفه خارجی را که در اولین درخواست بازیابی کردهاید وارد کنید):
curl \
-H “Content-Type: application/json” \
-X POST \
-d ‘{“workerId”:”worker123″, “variables”: {}}’ \
http://localhost:8080/engine-rest/external-task/EXTERNAL_TASK_ID/complete
برای اطلاعات بیشتر، با مراجعه به External Tasks، موارد استفاده جدید با Camunda BPM یا External Tasks را در اسناد اجازه میدهد.
همچنین ممکن است بخواهید یک دقیقه وقت بگذارید و در مورد اینکه چرا هنگام استفاده از کاموندا از طریق REST مهم است به ناتوانی فکر کنید، وقت بگذارید.
همین – شما تا به حال هیچ جاوا را لمس نکردید – درست است؟ و ما قبلاً به اندازه کافی دست به کار شدهایم تا شروع کنیم!
کتابخانههای مشتری
تماس REST API از هر زبانی آسان است. در جاوا اسکریپت شما به سادگی از JQuery استفاده میکنید و در سی شارپ میتوانید از System.Net.Http و Newtonsoft.Json برای این کار استفاده کنید.
اما ممکن است پرمخاطب شود. بنابراین ممکن است بخواهید جزئیات REST را در پشت برخی از کتابخانههای مشتری پنهان کنید.
در حال حاضر چند کتابخانه مشتری از پیش ساخته شده در دسترس هستند:
- جاوا اسکریپت: camunda-external-task-client-js این توسط خود کاموندا پشتیبانی میشود.
- جاوا: camunda-external-task-client-java این توسط خود کاموندا پشتیبانی میشود.
- C#: دو ابتکار camunda-dot-net-showcaseو camundacsharpclient در یک حالت میانی و نسبتاً غیرفعال هستند، اما می توانند به عنوان نقطه شروع خوبی باشند.
- PHP: انتظار نداشته باشید که camunda-bpm-php-sdk کامل باشد یا با آخرین تغییرات API مطابقت داشته باشد، اما من پروژههایی را میشناسم که از آن استفاده میکنند.
به جز جاوا اسکریپت و جاوا، کتابخانه های مشتری بخشی از خود محصول کاموندا نیستند. از آنها انتظار نداشته باشید که API کامل Camunda REST را پوشش دهند، بنابراین اگر کتابخانه ویژگی خاصی را ارائه نمیدهد به این معنی نیست که وجود ندارد، همیشه Camunda REST API را بررسی کنید. پروژههای معمولی از کتابخانهها به عنوان نقطه شروع و کپی و چسباندن الگو استفاده میکنند.
مثال با سی شارپ
با استفاده از کتابخانه سرویس گیرنده بالا میتوانیم به سادگی بنویسیم:
var camunda = new CamundaEngineClient(“http://localhost:8080/engine-rest/engine/default/”, null, null);
// Deploy the BPMN XML file from the resources
camunda.RepositoryService.Deploy(“trip-booking”, new List
کد منبع کاملاً کارآمد را میتوانید به صورت آنلاین پیدا کنید:https://github.com/flowing/flowing-trip-booking-saga-c-sharp
نمونه دیگری در https://github.com/berndruecker/camunda-dot-net-showcase موجود است.
مثال با Node.js
جزئیات بیشتر را میتوانید در https://github.com/nikku/camunda-worker-node پیدا کنید
راههای جایگزین برای اجرای کاموندا
تصویر Docker سفارشی با “Camunda standalone WAR”
به عنوان جایگزینی برای تصویر از پیش ساخته شده Docker از کاموندا، میتوانید Tomcat را خودتان تهیه کنید (به عنوان مثال بر اساس تصاویر رسمی داکر Tomcat) و سپس کاموندا را به عنوان یک فایل به اصطلاح جنگی در آن کپی کنید. در اینجا نمونهای را پیدا میکنید که این کار را به عنوان Dockerfile انجام میدهد.
اگر نیازهای اضافی گستردهای دارید و قادر به راهاندازی یک محیط ساخت جاوا هستید، حتی میتوانید این standalone war کاموندا را سفارشی کنید. بنابراین یک ساخت Maven را مانند این مثال تنظیم کنید: ساخت Maven با پیکربندی مجدد جنگ یا ساخت Maven با Overlay.
توزیع Camunda Tomcat را اجرا کنید
جایگزین دیگر این است که به سادگی توزیع Camunda Tomcat را دانلود کنید، آن را از حالت فشرده خارج کنید – و آن را اجرا کنید. این فقط به یک Java Runtime Enviromnent (JRE) روی دستگاه شما نیاز دارد که میتوانید به راحتی از اینجا نصب کنید.
اگر اکنون می خواهید پایگاه داده یا شبیه به آن را تغییر دهید، باید Tomcat را همانطور که در اسناد توضیح داده شده است پیکربندی کنید.
من میدانم که Tomcat ممکن است برای شما کار سختی ایجاد کند، اما در واقع این کار بسیار ساده است و گوگل همه چیزهایی را که ممکن است لازم باشد بپرسید می داند.
کاموندا را روی Tomcat اجرا کنید
آخرین گزینه این است که Tomcat را خودتان راهاندازی کنید و کاموندا را در آن نصب کنید، طبق توضیحات نصب. این به شما این آزادی را میدهد که از هر نسخه تامکتی که ترجیح می دهید استفاده کنید یا به عنوان مثال آن را به عنوان یک سرویس ویندوز نصب کنید.
اجرای کاموندا در مرحله تولید
معمولاً برای اجرای کاموندا باید تنظیمات نهایی را انجام دهید. بهترین روشهایی از کاموندا وجود دارد که این را با جزئیات زیاد نشان میدهد، اما من در این پست مقدماتی از آن صرفنظر میکنم و فقط یک مثال را نام میبرم: REST API توزیع پیشفرض برای نیاز به احراز هویت پیکربندی نشده است. ممکن است بخواهید این را تغییر دهید.
خلاصه
همانطور که دیدید شروع کار با کاموندا مستقل از زبانی که به آن مسلط هستید بسیار آسان است. نکته کلیدی این است که تمام ارتباطات از طریق REST API انجام میشود. نصب بسیار ساده است، به خصوص هنگام استفاده از Docker.
بسیار جالب و مفید
سپاسگزاریم
موفق باشید