如果是用redis,那因为redis本来就是数据存储的,做水平分割肯定要比应用服务器方便,应用服务器主要是用来计算和处理逻辑的,本身无状态。把数据和逻辑分开,分布式系统一般都是如此。
比如缓存服务器集群、消息队列中间件服务器集群、应用服务器集群、数据库集群;每一个集群都有各自的作用和扩展方法;
应用服务器如果无状态,那就可以随便增加或减少;
缓存服务器,如果用mongodb,那mongodb本身就自带在线扩容(增加sharding)的能力,redis不支持,但也有方案来做,比如用redis作者所说的presharding方式;
消息队列的集群,应该很常见,像rabbitmq,淘宝的metaq都支持;
数据库集群,mysql的案例很多吧。
如果你的应用服务器里有状态,如一些消息暂存在里面;那要是这台机器挂了,谁来处理这些消息呢?相反,如果是用专业的消息队列服务器来统一存储各种消息,那通过像zookeep等分布式协调服务,可以判断出,哪个消费者挂了,然后就会把本该由该消费者的消息自动传递给其他消费者,从而保证系统一直可用,所有消息都能有服务器处理。
你这里的我可以理解,但是你这里其实并不是解决分片问题,而是解决失败后故障转移的问题,分片还是无法动态进行扩展的~~
当然如果只是失败后故障转移,我想lmax中也提到了,他是使用多个服务器同时处理的方式(只是他这种方式我也是有些疑问的,不过他这样就可以实现数据存放在应用服务器的问题了)