In this chapter, we covered a lot of core concepts, starting with adding a regular relational database to back our get requests. We enhanced its performance with a local cache and then a distributed cache, Hazelcast. We also looked at a CQRS pattern, replacing our relational databases with a MongoDB for flexible schema and Elasticsearch for flexible search and query capabilities.
We added insert, update, and delete operations to our product service and ensured that the necessary cache invalidation happens in the case of the relational project. We added input validations and proper error messages to our APIs. We covered eventing to ensure that the query model stays up to date with the command model. This is achieved by command model services sending a broadcast of changes, and query model services listening to the changes and updating their data model.
Up next, we will...