In this chapter, we have learned the importance of being asynchronous and non-blocking. We have seen that adhering to this paradigm provides us with the ability to achieve higher throughput (do more work in limited resources) and scalability to handle a large number of loads. We had a brief overview of Future objects in Scala and operations defined in it.
We have seen how Play has applied the concept of being asynchronous and non-blocking in its core ideology, and we have seen how Play applies this internally by having a default tiny pool to handle all the user requests. The Action body must then be asynchronous and non-blocking in nature.
We have also seen the technique for methods to gracefully handle blocking calls by using a separate ExecutionContext for different kinds of blocking calls.
We are now equipped with the understanding and tools to build a robust microservice...