“…4. In conclusion, to guarantee the versatility and robustness of the architecture, three aspects are important to take into account: (i) scalability, microservices can be scaled individually when running a heavy workload just by replicating them on several containers without and not replicating the others underutilized (maximize the performance with minimal cost) [19], [74]; (ii) communication in a microservice, is important establishing simple communication protocol like http, httprest "request/response" (synchronous protocol) or mqtt "publish/subscribe" (asynchronous protocol), depending on needs [67]; (iii) fine-grained microservices, it is fundamental to decompose each service focused on a specific function and of limited influence, according to the established requirements [75]; otherwise, this architecture suffers from a high level of abstraction and coordination among the teams [67], [76].…”