How would you design a system with spikes in writes?
Spikes in reads are more or less handled with cascading levels of caching, but what about writes? Horizontally scaling a database is not something that is done easily without integrity problems, but you don't want to overpay for your cluster when you have low traffic.
Sharding your DB works if you can figure out how to segment your customers. Then you just need queue(s) and worker nodes.