Zpět na domů

Decentralizovaná orchestrace na RabbitMQ

Článek popisuje knihovnu pro decentralizovanou orchestraci na RabbitMQ jako náhradu Apache Camel. Podrobně: entity, režimy provádění, migrace. Výhody: obnovení stavu, škálování.

RabbitMQ orchestrace: odmítnutí Camel v mikroslužbách
Advertisement 728x90

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:

Google AdInline article slot
  • 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:

Google AdInline article slot
  • 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.

Google AdInline article slot

— Editorial Team

Advertisement 728x90

Číst dál