Mule flödena är implementerade mha Mule Studio och återges nedan som skärmdumpar från verktyget.
Not: I gällande version av aggregeringplatttformen, v1.1.0, är cache-funktionalitet implementerad men inaktiverad. Dock är implementationen designad för att kunna införa cachning i en framtida version på ett kostnadseffektivt sätt om beslutet att ta bort cachning ändras igen..
Tillgång till källkoden
Se Instruktioner för utvecklare.
aggregating-service
aggregating-service är en generisk mönster-implementation av en aggregerande tjänst i aggregeringsplattformen. Den kan anpassas för specifika aggregerande tjänsters behovs på tre ställen:
- Create Query Object
Omvandlar inkommande tjänstespecifika anrop och skapar ett generiskt Query Object som resten av tjänsten använder sig av. - Request List Transformer
Filtrerar och omvandlar svar från sökning i Engagemangs Index (via tjänsten findContent()) till anrop till underliggande källsystem via för tjänsten specifika tjänstekontrakt - Response List Transformer
Sätter samman ett tjänstespecifikt aggregerat svar baserat på delsvaren som returnerats från källsystemen.
Implementationen är uppdelad i följande Mule flöden:
- cache-flow
- main-flow
- request-reply-flow
- splitter-flow
- worker-flow
- aggregation-flow
cache-flow
- Exponerar HTTP endpunkt för den aggregerande tjänsten.
- Sätter kommunikationsheadrar enligt krav från RIV-TA och VP.
- Anropar tjänstespecifik "Create Query Object" implementation för att läsa ut information från inkommande request.
- Delegerar till bearbetningen till main-flow.
Note: Anledningen till såväl namnsättning på detta flöde samt delegeringen till ett main-flow är att det är i detta flöde som den inaktiverade cachningsfunktionen ligger.
main-flow
- Preparerar ett anrop till EI's FindContent tjänst inklusive properagering av kommunikationsheadrar.
- Anropar EI EI's FindContent tjänst mah en Message Enhancer.
- Anropar tjänstespecifik "Request List Transformation" implementation för att skapa en lista med de anrop som skall göras till underliggande tjänsteproducenter.
- Delegerar bearbetningen till request-reply-flow.
- I hanteringen av svaret, dvs i ett response-element, anropas en tjänstespecifik "Response List Transformation" implementation för att skapa det slutgiltiga aggregerade svaret baserat på de olika svar som kommit från de underliggande tjänsteproducenterna.
request-reply-flow
- Ansvarar för att brygga mellan den ytter synkrona bearbetningen i cache-flow och main-flow till den asynkrona och parallella bearbetningen i splitter-flow, worker-flow och aggregation-flow
- Skickar listan på request till vm-kön "splitter" och väntar synkront på ett asynkront aggregerat svar på vm-kön "reply".
- Timeout på väntan på svar styrs av parametern
AGGREGATED_SERVICE_TIMEOUT_MS
.
splitter-flow
- Använder en collection-splitter för att dela upp listan med request till separata request.
- Märker meddelanden med ett korrelerings-id.
- Lägger på en reply-to header som anger vm-kön "aggregate" dit svaren skickas för aggregering.
worker-flow
- Sätter upp kommunikationsheadrar enligt RIV-TA och anropar de utpekade tjänsteproducenterna via VP.
- Svar skickas mha reply-to-headern satt ovan till vm-kön "aggregate"
- Kommunikationsfel och timeout fångas upp per anrop av exception-handlern "Catch Exception Strategy" och fel-information skickas till vm-kön "aggregate" så att felet kan rapporteras enligt RIV-TA i processingStatus headern.
Timeout på väntan på svar från tjänsteproducenten styrs av parametern
SERVICE_TIMEOUT_MS
aggregation-flow
- Använder en collection-aggregator för att samla in de parallellt framställda svaren till en aggregerat svar.
- När alla svaren kommit eller timeout som styrs av parametern AGGREGATE_TIMEOUT_MS inträffar så skickas det sammansatta svar som samlats in så långt till vm-kön "reply", dvs till request-reply-flodet beskrivet ovan.
Konfiguration
Konfiguration två mekanismer är av central betydelse för att en aggregerande tjänst skall fungera bra i en produktionsmiljö med både hög last och där fel inträffar pga kommunikationsproblem och/eller långa svarstider.
Timeouter
För att den timeout-hanteringen skall fungera och den aggregerande tjänsten skall kunna ge så meningsfull felinformation som möjlig tillbaka till anropande tjänsteproducent vid timeout-relaterade fel så är det viktigt att:
AGGREGATED_SERVICE_TIMEOUT_MS > AGGREGATE_TIMEOUT_MS > SERVICE_TIMEOUT_MS
Exempel på konfiguration:
# Default timeout for synchronous services SERVICE_TIMEOUT_MS= 4000 AGGREGATE_TIMEOUT_MS= 4500 AGGREGATED_SERVICE_TIMEOUT_MS= 5000 |
Trådpool
För att en aggregerande tjänst skall kunna bibehålla låga svarstider vid uppskakad last är det av central betydelse att det finns tillräckligt med trådar konfigurerade för att kunna hantera alla parallella anrop. Samtidigt
Varje aggregerande tjänst kan konfigureras individuellt baserat på följande parametrar för en default tråd pool:
<default-threading-profile poolExhaustedAction="ABORT" maxThreadsActive="${AGP_DEFAULT_MAX_THREADS_ACTIVE}" maxThreadsIdle="${AGP_DEFAULT_MAX_THREADS_IDLE}" threadTTL="${AGP_DEFAULT_MAX_THREADS_TTL}"/>
Exempel på konfiguration:
# Default thread pool configration AGP_DEFAULT_MAX_THREADS_ACTIVE=100 AGP_DEFAULT_MAX_THREADS_IDLE=1 AGP_DEFAULT_MAX_THREADS_TTL=10000 |
Tjänstespecifika implementationer anges enligt:
# POJO implementations of the agp-api QUERY_OBJECT_FACTORY_IMPL=se.skltp.aggregatingservices.riv.crm.requeststatus.getrequestactivities.QueryObjectFactoryImpl REQUEST_LIST_FACTORY_IMPL=se.skltp.aggregatingservices.riv.crm.requeststatus.getrequestactivities.RequestListFactoryImpl RESPONSE_LIST_FACTORY_IMPL=se.skltp.aggregatingservices.riv.crm.requeststatus.getrequestactivities.ResponseListFactoryImpl |