本案例在业务拆分的基础上,结合分库分表和读写分离,如上图:
业务拆分后:每个子系统需要单独的库。
如果单独的库太大,可以根据业务特性,进行再次分库,比如商品分类库,产品库。
分库后,如果表中有数据量很大的,则进行分表,一般可以按照 ID,时间等进行分表;(高级的用法是一致性 Hash)
在分库、分表的基础上,进行读写分离。
相关中间件可参考 Cobar(阿里,目前已不在维护),TDDL(阿里),Atlas(奇虎360),MyCat。
分库分表后序列的问题,JOIN,事务的问题,会在分库分表主题分享中介绍。
服务化
将多个子系统公用的功能/模块,进行抽取,作为公用服务使用。比如本案例的会员子系统就可以抽取为公用的服务。
消息队列
消息队列可以解决子系统/模块之间的耦合,实现异步,高可用,高性能的系统。它是分布式系统的标准配置。
本案例中,消息队列主要应用在购物,配送环节:
用户下单后,写入消息队列,后直接返回客户端。
库存子系统:读取消息队列信息,完成减库存。
配送子系统:读取消息队列信息,进行配送。
目前使用较多的 MQ 有 Active MQ、Rabbit MQ、Zero MQ、MS MQ 等,需要根据具体的业务场景进行选择,建议可以研究下 Rabbit MQ。
其他架构(技术)
除了以上介绍的业务拆分,应用集群,多级缓存,单点登录,数据库集群,服务化,消息队列外,还有 CDN,反向代理,分布式文件系统,大数据处理等系统。
架构汇总
大型网站的架构是根据业务需求不断完善的,根据不同的业务特征会做特定的设计和考虑。