Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

浅谈电商网站数据访问层(DAL)与 ORM 之适用性

2,173 views

Published on

What's Data ? What's DAL ? DAL 中的不变、变化 ?
电商网站 DAL 特点 (SoC)
.NET 世界 ORM 现状

Published in: Internet
  • Be the first to comment

浅谈电商网站数据访问层(DAL)与 ORM 之适用性

  1. 1. 浅谈电商网站数据访问层 (DAL)与ORM 之适用性 2012.11.2 中国,上海
  2. 2. What’s Data ? Data Files、Database、Data Service、etc. SQL、NoSQL、AWS RDS、SQL Azure、etc.
  3. 3. Why DAL ? 抽象不变的:DRY  Don’t Repeat Yourself 封装变化的:SoC  Separation of Concerns
  4. 4. DAL 中的不变、变化? 不变的or 一致的(核心):Interface、SQL、etc. 变化的- 1:Database、ORM Framework、etc. 变化的- 2:Caching、Logging、Sharding、etc.
  5. 5. 电商网站DAL 特点(SoC) • Simple Scalability  读写分离 DAL R/W Routing • 10x Scalability  DB Sharding  DAL Routing + Aggregation • Multi-targeting Logging  Console/File/Log4Net/EntLib/Common.Logging • Transparent Caching  DAL 支持+ App 慎用 实现难! • Lazy Loading  DAL 支持+ App 慎用 用好难! • 99% Availability  Cache High Availability – 方案1:Dual-write Cache (Memcache) / Cache Replication (AppFabric) – 方案2:Multi-level Cache  L1 分布式+ L1.5 本地跨应用+ L2 本地应用内
  6. 6. .NET 世界ORM 现状 • 10x Scalability:仅NH/MB 有限支持Sharding – 通过multi-db-session 实现shards 结果聚合、in-memory 结果排序 – NH HQL 不支持Sharding,如:排序,只能通过ICriteria 间接实现 – 长时间未更新,不兼容最新NH,不支持垂直分区及混合分区 • Multi-targeting Logging: – NH/MB 支持最好,L2S 也支持,但种类不丰富,需扩展 – EF 不支持,有开源爱好者提供了实现,较复杂、有风险 • Transparent Caching:此处略去N 字… • Lazy Loading:NH/L2S/EF/MB 都支持 • 99% Availability:此处略去N 字…
  7. 7. DAL Sharding Demo (ORM Extension) – NHibernate.Shards (ISessionFactory)
  8. 8. DAL Sharding Demo (ORM Plug-in) – ShardBatis (SQL Interception)
  9. 9. DAL Sharding Demo (ADO.NET Extension) – Enzo SQL Shard (C# Extension Method)
  10. 10. DAL Sharding Demo (ADO.NET Provider) – dbShards
  11. 11. DB Sharding 策略 • Sharding is NOT SILVER BULLET for DB Scale-out • 不适用场景 – 处理事务型应用非常复杂,跨不同DB 事务,很难保证一致性 – 不含Sharding ID 查询较多的场景,即使并行处理,也要全扫描 • 大方向选择(non-global tables) – Sharding on every table  primary separation  child separation – Sharding on every table group (sticky)  primary + all children – Sharding on every table group (non-sticky)  primary + some children • 小策略选择:Sharding ID、Aggregation、etc.
  12. 12. DB Sharding 策略(continued)
  13. 13. DB Sharding 风险 • Sharded Data Migration • Sharded Cluster Management • Replication Management • High-availability Management • Load-balancing Co-existence • Sharding Policy Change
  14. 14. DAL Sharding 难点 • 切片策略 – 精确定位:PK round-robin / PK hashing-modulus / attribute(s)-based – 查询策略:all-shards iteration / 精确定位 – 遍历策略:sequential / parallel • 结果聚合 – 方案1:单库SQL 查询 DAL 中完成聚合(order, group, avg, etc.) – 方案2:跨库union 聚合 RDBMS 直接返回结果 – 方案3:读写分离 多库实时写 同步至单库 单库非实时读 • 基于ORM、自定义实现(ADO.NET)? • 其它:DB Proxy Sharding、In-mem Sharding?
  15. 15. DAL Sharding 难点(continued) • DB Proxy Sharding:不太适合当前的Ctrip  性能问题、协议实现、etc. • In-mem Sharding – 已在酒店查询服务优化项目架构设计中使用 – 1st-Level Sharding + 2nd-Level Load Balancing  – 产品库可以这么做,订单库能这么做吗?
  16. 16. DAL Sharding 设计参考 1、eBay Data Access Layer (QCon) 2、DAL Sharding 设计方案
  17. 17. DAL Transparent Caching • 现状 – NH 二级缓存Provider:NHibernate.Caches.MemCache – MB 二级缓存Module:mybatis-memcached-module – EF:没有内建二级缓存机制,需通过EFCachingProvider 扩展 – L2S:只有一级缓存,没有扩展机制,不推荐用于scale-out 场景 • 难点 – 对Consumer 透明,如Biz Layer 不需要知道缓存的“存在” – 解决Caching Policy 和Data Consistency 间的矛盾与冲突 – 缓存刷新,拉模式or 推模式?实时推or 消息通知? • 其它:Cache Provider 与Cache-ware 区别
  18. 18. DAL Transparent Caching (continued) • High Availability 方案1:Multi-node – Dual-write Cache (Memcache, client-side, non-transactional) – Cache Replication (AppFabric, server-side, transactional) – 无论哪个option,都要考虑secondary node selection 问题! • 2 cache items  2 cache nodes  比较简单 • 3 cache items  3 cache nodes  有点复杂 • x cache items  y cache nodes  如何确保node unavailable 时造成的影响最小? • High Availability 方案2:Multi-level – L1 分布式 – L1.5 本地跨应用 – L2 本地应用内 – 无论哪几个options combination,都要考虑sync coordination 问题!
  19. 19. DAL 设计参考 1、NoSQL 数据库笔谈 2、James Hamilton
  20. 20. 这么多ORMs,众口又难调,如何选择?
  21. 21. 1、One Size does NOT Fit ALL ! 2、ORM Fx + Customized SQL + 其它 3、DAL 接口+ Base 抽象+ 自定义实现
  22. 22. Demo for【DAL 接口+ Base 抽象+ 自定义实现】
  23. 23. 介绍DDFx 及相关架构
  24. 24. What’s DDFx ? • DDFx 的第一个D 有两层含义:Data and Domain • DDFx 的第二个D == Driven,意为:…驱动的… • DDFx 的Fx == (Development / Design) Framework (and Tools) • DDFx 理解#1:Data-Driven (Development) Framework • DDFx 理解#2:Domain-Driven (Design) Framework • DDFx 具体内容尚在不断完善中,但请记住:DDFx 不是万能的,所以,你要懂得:Context + Balance • DDFx 中某些非关键技术将采用Tech-Talk 方式进行
  25. 25. 什么是Domain? 作为软件方面的专家(架构师、开发人员)和领域专家 (客户方业务人员、需求分析人员),所有人在一起创建 领域的模型,这个模型会统一体现两个专业领域的交汇
  26. 26. 什么是Data? Data Files、Database、Data Service、etc. SQL、NoSQL、AWS RDS、SQL Azure、etc.
  27. 27. DDFx 架构
  28. 28. DDFx 中几个数字 • 1 座工厂:DDFx Factory • 2 个车间:Domain Model (N 产品线)  Repository (N 产品线) • 3 种贯穿:DTO  Domain Model Intf.  Repository Intf. • 6 层架构:Presentation  Application/Controller  Service  Domain  Repository  Resource • 8 大前端: – C/S:Console  Windows Forms  WPF – B/S:ASP.NET Web Forms  Ajax  MVC / MVVM (ViewModel : DTO) – RIA:Silverlight (.NET 子集) – Device:Windows Phone 7 (Silverlight 子集)
  29. 29. 图表样例- 1:Visual Studio 生成
  30. 30. 图表样例- 2:Visual Studio 生成
  31. 31. DDFx 架构层次 • 整体架构:6 层架构+ 1 座工厂(DDFx Factory) • Layer #1:用户表现层(Presentation Layer) • Layer #2:应用系统层(Application Layer) • Layer #3:服务表现层(Service Layer, 可选) • Layer #4:领域模型层(Domain Layer) • Layer #5:资源访问层(Repository Layer) • Layer #6:资源层(关系数据库、外部服务、文件系统、etc.)
  32. 32. DDFx 架构+ 开发曲线 L1:UI -> VM/DTO (Requirement + UI Dev) L2:-> Controller (Non-UI Dev) -> IDomain (Façade Intf.) (Arch + Dev Lead) -> Domain Factory (Arch) -> Local/Service Client (Dev Lead) L3:-> Local/Service Server -> IDomain (Façade Intf.) (Arch + Dev Lead) L4:-> RealDomain (Real Façade) -> Biz. Rule + IRepository (Non-UI Dev) L5:-> Repository Factory (Arch) -> Local/Service Client (Dev Lead) -> RepositoryBase<T> : IRepository<T> (Dev Lead) -> SpecialRepository : ISpecialRepository (Non-UI Dev) -> Data Client / Service Client / etc. (Non-UI Dev) L6:-> RDBMS / Service Server / File Server / etc. (Requirement + Arch)
  33. 33. 探讨:需求变更导致新增字段, 你会怎么做?
  34. 34. Q & A

×