Saga Pattern Realization With Eventuate Tram
This project includes an example implementation of the Saga pattern using the Eventuate Tram and Eventuate Tram Sagas framework. The example application represents a travel application that consists of three backend services: TravelService, HotelService and FlightService. For simplicity reasons, only the workflow for booking a trip has been implemented.
Start the Application
-
Run
./gradlew clean build
-
Execute
docker-compose up
-
Requesting trip bookings is now possible. Either use
curl
commands, the providedTravelApplication.json
insomnia file, which includes different trip booking requests, or access the Swagger UI of the different services:
TravelService | http://localhost:8090/swagger-ui.html |
HotelService | http://localhost:8081/swagger-ui.html |
FlightService | http://localhost:8082/swagger-ui.html |
An example for such a request:
{
"duration":
{
"start":"2021-12-01",
"end":"2021-12-12"
},
"start":
{
"country":"Scotland",
"city":"Stirling"
},
"destination":
{
"country":"Sweden",
"city":"Stockholm"
},
"travellerName": "Max Mustermann",
"boardType":"breakfast",
"customerId":"1"
}
To simulate a Saga that fails because no hotel or no flight is available, use one of the following Strings
as destination country
in the trip booking request:
"Provoke hotel failure"
"Provoke flight failure"
The services also provide a health and an info endpoint that show some information about the system like that the DB is up and running. These endpoints can be accessed via:
TravelService | http://localhost:8090/api/travel/monitor/health | http://localhost:8090/api/travel/monitor/info |
HotelService | http://localhost:8081/api/hotels/monitor/health | http://localhost:8081/api/hotels/monitor/info |
FlightService | http://localhost:8082/api/flights/monitor/health | http://localhost:8082/api/flights/monitor/info |
If you are on Windows or Mac, you sometimes have to replace localhost with the default IP of your docker machine (use docker-machine ip default
to get this default IP).
Stop the Application
To stop the application and remove the created containers, execute the following command:
docker-compose down --remove-orphans
Monitor the Application
MySQL Database
The eventuate database, with its different tables, can be accessed with the following information,
which is also included in the docker-compose.yaml
file:
Username: mysqluser | Password: mysqlpw
Log Files
Each service provides a log that contains some information about it. The logs can be accessed using the name of the relevant container. The different logs can be accessed using the following commands:
Log of | Command to execute |
---|---|
TravelService | docker logs travelservice_eventuate |
HotelService | docker logs hotelservice_eventuate |
FlightService | docker logs flightservice_eventuate |
By using the --follow
supplement, it will be continued to stream the service's output to the console.
The logging level can be changed in the respective application.properties
file.
Zipkin
The services include the necessary gradle dependencies to enable distributed tracing with Zipkin when using the Eventuate Tram framework.
The Zipkin UI can be accessed via http://localhost:9411/zipkin/
Metrics of the CDC Service
Eventuate's CDC Service publishes some metrics like the number of processed messages.
The metrics can be accessed via http://localhost:8099/actuator/prometheus
Code Link
EventuateTram_Implementations/EventuateTram