读了"华黎"的“淘宝Java中间件之路”,记录一下自己的体会。
文章主要讲了淘宝在3个方面的改进:消息中间件(JMS的引入),服务框架(业务模块分离)和分布式数据层(如何处理海量数据的数据库操作)
1. 消息中间件
和EBAY的“Asynchrony Everywhere”想法类似【见Reference中的“Architectural Lessons (round 1)”】,将原本同步的操作,转成异步操作。此外,淘宝采用JMS的发布者/订阅者模式,因此实现了Publisher和Subscriber两端的代码解耦。
2. 服务框架
将业务模块分离,与EBAY的“Partition Everything”想法类似【见Reference中的“Architectural Lessons (round 1)”】。
3. 分布式数据层**
文章中,关于数据库架构的演进很典型:数据垂直拆分->数据分库分表->读写分离。
数据垂直拆分:将不同类型的数据,存储在不同的数据库中。(例:将User和Trade分别存储在两个不同的数据库)
数据分库分表:将同一个数据库表中的海量数据存储在多个隔离的数据库中。(例:将User数据拆分成8份,分别存储在8个不同的数据库(User1-User8)中。
读写分离:采用DB复制,数据写在Oracle中进行,然后将Oracle中的数据复制到MySql,用MySql提供数据读功能。
淘宝的分布式数据层(TDDL)实现了由“Client->DB方式走向了Client->Server->DB”。原本Client直接通过JDBC访问数据库。而在Client->Server->DB方式下,TDDL包括了DB-proxy Client和DB-proxy Server。
Client无论是用iBatiS,hibernate还是直接写JDBC SQL,实际上都是通过DB-proxy Client来访问DB-proxy Server, DB-proxy Server才会真正实现JDBC的调用。TDDL实现了SQL 解析,路由规则和数据合并,在Client端看不到数据的垂直拆分、分库分表存储和读写分离。
此外,TDDL的DB-proxy Client和DB-proxy Server之间通信采用的是NIO方式,这样大大减少了大量数据库连接的压力。
Reference:
eBay’s Challenges and Lessons
1、 Partition Everything 2、 Asynchrony Everywhere 3、 Automate Everything 4、 Remember Everything Fails 5、 Embrace Inconsistency 6、 Expect (R)evolution 7、 Dependencies Matter 8、 Be Authoritative 9、 Never Enough Data 10、Custom Infrastructure