With the continued growth and transition to microservices, it’s important to ensure that the time and money re-engineering systems to modern, cloud-based solutions lead to tangible benefits to the organization. In this multi-part series, we’ll look at different components and pitfalls that need to be considered when modernizing to microservices.
In this blog, we’ll look at why it’s important to experiment with microservices communication patterns before committing to one.
Experiment Early with Communication Patterns
We previously discussed how a small team should prepare microservices templates. The most notable long-term consequence will be how those microservices talk to each other. Their own technology stack can evolve independently, but the paradigm in how they communicate is something that’s harder to change later. Experimenting early pays off.
Architectural Options Worth Investigating
- Synchronous API calls between microservices, and waiting for the downstream calls to complete. This paradigm is reassuringly simple, and when moving from legacy technologies with so many moving parts, that simplicity might be its strongest benefit. Options include JSON over HTTP (simplest) or gRPC (smaller, faster, and relying on HTTP/2).
- Reactive programming at a microservice level. This is a much more efficient way to design your service if you are going to be I/O-bound, waiting for multiple other services to complete. Instead of using a single thread for each downstream request, non-blocking I/O will leverage callbacks into the code and lead to much better resource utilization.
- Reactive programming at the overall system level (with one of the POC teams potentially leveraging frameworks such as Akka).
- A pub/sub architecture with technologies like Kafka. Scaling consumers reading from a shared message queue has multiple advantages, like easier elasticity to handle spikes and replaying traffic for testing. It’s worth trying this out, especially if a single request is divided into a high number of East/West sub-requests.
Need to catch up? Previously, lessons included:
Part 1: The Importance of Starting with the Team
Part 2: Defining Ownership
Part 3: Process Management and Production Capacity
Part 4: Reserving Capacity for Innovation
Part 5: Microservices Communication Patterns
Part 6: Using Shadow Release Strategy
Part 7: Performance Testing Microservices
Part 8: Memory Configuration Between Java and Kubernetes
Part 9: Prioritizing Testing within Microservices
Part 10: Distributed Systems
Ready to modernize your organization’s microservices? Oteemo is a leader in cloud-native application development. Learn more: https://oteemo.com/cloud-native-application-development/