موتورهای مدیریت فرآیندهای کسبوکار (BPMS) و مدیریت موارد (Case Management - CMMN) مانند Flowable Enterprise به عنوان مغز متفکر اتوماسیون فرآیندهای سازمانی در بانکها، شرکتهای فینتک و سازمانهای بزرگ عمل میکنند. در محیطهای پرترافیک که روزانه دهها هزار فرآیند، تایمرهای زمانبندیشده، و وظایف سرویس ناهمگام (Async Service Tasks) اجرا میشوند، گلوگاه اصلی سیستم عملکرد هسته پردازش پسزمینه یعنی Async Job Executor و بنبستهای تراکنشی پایگاه داده است.
در صورت عدم پیکربندی دقیق پارامترهای کلاسترینگ، رقابت نودهای مختلف بر سر برداشتن جابها (Lock Acquisition Competition) موجب قفل شدن ردیفهای جدول ACT_RU_JOB، تاخیر در اجرای وظایف خودکار و کندی پرتال کاربری میگردد. در این مقاله جامع، معماری کلاسترینگ چندنودی Flowable، تیونینگ پارامترهای Thread Pool در Spring Boot، پیکربندی پایگاه داده و استقرار لایسنس دائمی آفلاین تشریح میشود.
۱. توپولوژی کلاسترینگ و تفکیک نودهای پردازشی (App Nodes vs Worker Nodes) #
در بارهای کاری بالا، پیشنهاد استاندارد معماری تفکیک سرورهای پاسخدهی به کاربران (Web Application Nodes) از سرورهای پردازش فرآیندهای سنگین پسزمینه (Dedicated Worker Nodes) است:
┌─────────────────────────────────────────┐
│ Reverse Proxy / Load Balancer │
│ 192.168.60.100 │
└───────────────────┬─────────────────────┘
│
┌─────────────────────────┴─────────────────────────┐
│ │
▼ ▼
┌───────────────────────┐ ┌───────────────────────┐
│ Web Node 1 (Task/UI) │ │ Web Node 2 (Task/UI) │
│ Async Executor: OFF │ │ Async Executor: OFF │
│ 192.168.60.101 │ │ 192.168.60.102 │
└───────────┬───────────┘ └───────────┬───────────┘
│ │
├─────────────────────────┬─────────────────────────┤
│ │ │
▼ ▼ ▼
┌───────────────────────┐ ┌───────────────────────┐ ┌───────────────────────┐
│ Dedicated Worker 1 │ │ Dedicated Worker 2 │ │ PostgreSQL Cluster │
│ Async Executor: ON │ │ Async Executor: ON │ │ (Read Committed) │
│ 192.168.60.103 │ │ 192.168.60.104 │ │ 192.168.60.110 │
└───────────────────────┘ └───────────────────────┘ └───────────────────────┘
مزایای تفکیک نقشها:
۱. حفظ سرعت پاسخدهی پرتال کاربران: با خاموش کردن flowable.async-executor-activate در سرورهای Web Node، تمام توان CPU و RAM این ماشینها صرف پاسخدهی فوری به لاگین کاربران، بارگذاری فرمها و تایید وظایف کارتابلی میشود.
۲. مقیاسپذیری افقی جابهای پسزمینه: در زمانهای اوج بار (مانند فرآیندهای صدور صورتحساب پایان ماه)، کافی است سرورهای اختصاصی Worker اضافه شوند تا فرآیندهای ناهمگام را در صفها پردازش کنند.
۲. پارامترهای طلایی پیکربندی Async Job Executor #
در فایل application.properties یا application.yml سرورهای Worker، مقادیر پیشفرض هسته Async Executor باید متناسب با منابع سرور بازنویسی شوند:
# فعالسازی موتور پردازش ناهمگام در سرورهای پردازشی
flowable.async-executor-activate=true
# تنظیمات اندازه استخر پردازشی (Thread Pool)
flowable.async-executor.core-pool-size=16
flowable.async-executor.max-pool-size=64
flowable.async-executor.queue-size=2048
# بهینهسازی دوره قفلگذاری و برداشت دستهای جابها
flowable.async-executor.max-async-jobs-due-per-acquisition=512
flowable.async-executor.default-async-job-acquire-wait-time-in-millis=2000
flowable.async-executor.default-timer-job-acquire-wait-time-in-millis=5000
# زمان معتبر بودن قفل هر جاب برای جلوگیری از اجرای تکراری
flowable.async-executor.async-job-lock-time-in-millis=300000
# فعالسازی مکانیسم صفوف مدرن به جای قفل سنتی دیتابیس
flowable.async-executor.use-lock-time=true
این تنظیمات سبب میشود نودهای Worker به جای تکتک خواندن رکوردها، جابها را به صورت دستهای (Batch of 512) از جدول بخوانند که این کار فشار خواندن روی پایگاه داده را تا ۹۰٪ کاهش میدهد.
۳. تیونینگ پایگاه داده PostgreSQL برای رفع Deadlock #
بزرگترین عامل خطای Deadlock در دیتابیس Flowable، رکوردهای در حال قفل در جدولهای ACT_RU_EXECUTION و ACT_RU_VARIABLE است. دستورات زیر بر روی دیتابیس PostgreSQL اعمال گردد:
-- بهینهسازی پارامترهای اتصال و حافظه در postgresql.conf
ALTER SYSTEM SET max_connections = '500';
ALTER SYSTEM SET shared_buffers = '8GB';
ALTER SYSTEM SET effective_cache_size = '24GB';
ALTER SYSTEM SET maintenance_work_mem = '2GB';
ALTER SYSTEM SET checkpoint_completion_target = '0.9';
ALTER SYSTEM SET wal_buffers = '16MB';
ALTER SYSTEM SET default_statistics_target = '100';
ALTER SYSTEM SET random_page_cost = '1.1'; -- بهینهسازی برای درایوهای NVMe SSD
-- ایجاد ایندکسهای اختصاصی بر روی جداول پرتردد Flowable
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_act_ru_job_lock
ON act_ru_job (lock_exp_time_, lock_owner_)
WHERE lock_exp_time_ IS NOT NULL;
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_act_ru_var_proc_inst
ON act_ru_variable (proc_inst_id_, execution_id_);
۴. استقرار فرآیندها و مدیریت نگارشها (Version Management) #
در محیطهای سازمانی، بهروزرسانی مدلهای BPMN نباید موجب اختلال در فرآیندهای در حال اجرای کاربران گردد:
-
Migration of In-Flight Instances: از ابزار
ProcessInstanceMigrationBuilderجهت مهاجرت فرآیندهای فعال از نگارش قدیم به نگارش جدید بدون نیاز به ریست یا کنسل کردن پروندهها استفاده کنید. -
Tenant Isolation: با فعالسازی فیلد
tenantIdدر زمان استقرار فرآیندها (deployment.tenantId("TEHRAN-HQ"))، محیط شرکتها یا هلدینگهای تابعه در یک دیتابیس متمرکز اما کاملاً ایزوله تفکیک میگردد.
۵. لایسنسینگ دائمی آفلاین و تثبیت پلتفرم توسط Licentra #
نسخههای انترپرایز Flowable شامل ابزارهای ویژهای چون Flowable Work، Flowable Design، Flowable Inspect و موتور قدرتمند تصمیمگیری DMN است. در شبکههای سازمانی بسته و فاقد اینترنت:
-
لایسنس کامل Enterprise Suite: فعالسازی بدون محدودیت تعداد کاربر همزمان، بدون سقف تعداد فرآیندهای فعال ماهانه.
-
عملکرد مستقل از کالبکهای License Server: کدهای فعالسازی به طور مستقیم در کلاسهای بارگذاری Spring Boot تزریق شده و نیازی به استعلام لایسنس آنلاین ندارند.
-
پایداری کامل در استقرارهای کانتینری (Docker / Kubernetes): بدون حساسیت به تغییر داینامیک نام پادها و آیپیهای داخلی کانتینرها.
# نمونه کانفیگ تزریق لایسنس آفلاین در متغیرهای محیطی کانتینر
environment:
- FLOWABLE_LICENSE_LOCATION=file:/opt/flowable/conf/flowable-license.lic
- SPRING_DATASOURCE_URL=jdbc:postgresql://db-cluster.corp.local:5432/flowable_db
این معماری، سرعت بالا در چرخش پروندههای اداری، پایداری بدون وقفه در مقیاسهای کلان و امنیت دادهها را در بالاترین سطح استانداردهای مهندسی فراهم میسازد.


