The Architecture of Open Source Applications (Volume 2): Scalable Web Architecture and Distributed Systems
This sort of service-oriented design for systems is very similar to object-oriented design for programming.
When it comes to these systems there is no right answer, but it helps to go back to the principles at the start of this chapter, determine the system needs (heavy reads or writes or both, level of concurrency, queries across the data set, ranges, sorts, etc.), benchmark different alternatives, understand how the system will fail, and have a solid plan for when failure happens.