To sum up cache absorbs a portion of the read volume - even during peak search hours and the rest of it would be through the elasticsearch cluster.
We will use REST API framework for our API design.
All our services reside behind an API gateway which handles our rate limiting and authentication using Oauth 2 as previously discussed. The write database which captures the write path can be structured as a postgres database.
Since the searches are all going to reside on elastic search we can use geospatial indexes on elastic search to optimize the search. Using userId_businessId as a primary key in our review table would ensure that we enforce one review per user per business logic. However this forces us to not be able to have anonymous reviews. Does that work with the requirements?