Decentralizovaná orchestrace procesů na RabbitMQ: alternativa k Apache Camel
Systém pro zpracování velkých objemů dat z FTP souborů a Kafka/RabbitMQ streamů využívá mikroslužební architekturu s více než 40 službami. Dříve byly zpracovatelské řetězce implementovány v Apache Camel pomocí Java DSL s REST voláními z centrální služby. Problémy: ztráta stavu při restartech, omezení škálování kvůli paralelním tokům a rizika při vydávání nových verzí.
Nová knihovna na RabbitMQ s kvorumovými frontami zajišťuje decentralizovanou správu. Stav se uchovává v brokeru, proces se automaticky obnovuje. Služba inicializace se horizontálně škáluje.
Hlavní entity knihovny
Knihovna obsahuje třídy a rozhraní pro kroky, trasy a vykonavatele:
- RouteStepInfo: identifikuje krok v trase.
public class RouteStepInfo {
private final String routeName;
private final String stepId;
public RouteStepInfo(String routeName, String stepId) {
this.routeName = routeName;
this.stepId = stepId;
}
}
- StepExecutor: rozhraní pro async/sync/detached provádění.
public interface StepExecutor {
String getStepName();
void runAsync(RouteStepInfo routeStepInfo, Long objectId);
void runSync(RouteStepInfo routeStepInfo, Long objectId);
void runDetached(RouteStepInfo routeStepInfo, Long objectId);
void appendListener(StepExecutionFinishedListener listener);
}
- StepExecutionFinishedListener: zpětné volání při dokončení kroku.
public interface StepExecutionFinishedListener {
void onStepExecutionFinished(RouteStepInfo routeStepInfo, Long objectId);
}
- RouteStep: krok s režimy ASYNC, SYNC, DETACHED.
public interface RouteStep {
String getRouteName();
String getStepId();
String getStepName();
ExecutionMode getExecutionMode();
void run(Long objectId);
void appendListener(StepExecutionFinishedListener listener);
enum ExecutionMode {
ASYNC,
SYNC,
DETACHED
}
}
- ExecutionRoute: trasa jako seznam kroků s indexy.
@Slf4j
public class ExecutionRoute {
@Getter
private final String routeName;
private final List<RouteStep> routeSteps;
private final Map<String, Integer> stepsIndex;
public ExecutionRoute(String routeName, List<RouteStep> routeSteps) {
this.routeName = routeName;
this.routeSteps = routeSteps;
this.stepsIndex = new HashMap<>();
for (int i = 0; i < routeSteps.size(); i++) {
stepsIndex.put(routeSteps.get(i).getStepId(), i);
}
}
}
Dále: RoutesConfigBuilder pro konfiguraci, RouterConfigProvider pro trasy, ProcessRouter jako posluchač a vykonavatel.
Režimy provádění kroků
Knihovna podporuje tři režimy:
- ASYNC: sekvenční spuštění na pozadí, přechod k dalšímu po dokončení.
- SYNC: blokující volání, návrat po celém řetězci.
- DETACHED: spuštění bez čekání, okamžitý přechod dál.
Kombinace umožňují větvení a paralelismus:
- Trasa 1: SYNC kroky 1→2→3.
- Trasa 2: ASYNC kroky 1→2→3, návrat okamžitě.
- Trasa 3: ASYNC s DETACHED krokem 2.
- Trasa 5: paralelní podtrasa Trasa 4.
Zavedení a migrace
Zátěžové testování potvrdilo funkčnost. Migrace je postupná: nahrazení částí Camel s A/B přepínáním. Stávající závislosti se zachovávají pro případný návrat.
Co je důležité:
- Stav v RabbitMQ zajišťuje obnovení po restartech.
- Horizontální škálování inicializátoru.
- Průhledná konfigurace přes builder.
- Podpora větvení a paralelismu bez centralizované služby.
Přístup je vhodný pro systémy s vysokými nároky na spolehlivost a škálovatelnost.
— Editorial Team
Zatím žádné komentáře.