I would say that the biggest bottleneck in the project was the implementation of the messages. If service A sends a message to service B and is waiting a response, the response won't be sync, I mean the response from service B won't the response of the method call to send the message as you can expect with REST so in this case what will happen is that you design will need to take account messages that will arrive to services in an async way making the programming model a little bit more complex than using REST. There is a nice advantage and it's that if you have multiple instances of service X listening to the same queue you can use the "competing consumers" model to get load balancing out of the box from the queue service (this works well on ActiveMQ) so you can avoid adding an extra service just to do the load balancing of the microservices. Hopefully this helps you