分布式系统之数据类型
前面章节讨论了分布式系统的算法,本篇总结一下分布式系统的数据结构类型,不可变数据值易于存储和缓存,能够被可变的有唯一标识的实体引用,能让我们建立大规模的强一致性系统. 当软件规模发展时,不同组件之间必须独立扩展,我们将大型库API分离成独立的微服务结构,服务结构适合团队与团队之间的协调合作。
不可变值
- 不可可变的数据易于存储
- 从来不需要协调
- 廉价复制和恢复
- 最小化打包到磁盘
- 在Cassandra, Riak, 和 LSM-tree数据库中都有使用.
- 包括Kafka
- 易于质疑: 是或者不是
- 消除各种传统头疼问题
- 超级可缓存化
- 超高可用性和持久性,可微调写延时
- 读操作低延时: 能从最近复制节点响应
- 对于跨地域复制特别有价值
- 需要垃圾回收机制
- 但是还有好的方式优化
可变的标识实体
- 指向不可变的值
- 指针很小,仅仅是元数据
- 在一个小数据库能放入大量指针
- 对于共识服务或关系数据库是好的数据结构。
- 基于标识的强一致性操作能够由不可变的HA高可用存储支持
- 利用CAP中AP存储的优点:低延时和大规模
- 利用有共识系统提供的基于小数据集的强一致性
- 写操作可用性由实体存储限制
- 但是读操作非常亲和缓存,如果你只需要顺序一致性。
- 如果只需要串行化,则代价更小。
- 参考Rich Hickey在Datomic architecture讲话
- 参考Pat Helland的 2013的“ RICON West keynote on Salesforce's storage”
领域模型的服务
- 问题是交互逻辑碎片的组合
- 逻辑碎片代码分离代码 性能和存储
- Monolithic应用 application在多租户系统是必要
- 多租户是艰难的
- 咋同一个处理服务器运行多个逻辑服务经常是可行的
- Monolithic应用 application在多租户系统是必要
- 切分你的系统变成分离的服务和领域模型
- OO 目标: 每个名称是一个服务
- User service用户服务
- Video service视频服务
- Index service索引服务
- 函数式目标: 每个动词是一个服务
- Auth service授权服务
- Search service搜索服务
- Dispatch/routing service分发路由服务
- 大部分大系统是混合使用
- 名词服务针对数据类型的不变性
- 动词服务针对变化的不变性
- 比如我们有基本的用户服务,被授权服务调用
- 画线分界是一件难事
- 服务可能会过重
- 考虑工作单元
- 分离服务,根据不同服务独立扩展。
- 紧耦合服务必然带来紧延时的负担,也就是高延时的慢性脑
- 对于使用慢资源的服务比如磁盘或CPU
- 在节点上运行memcache
- 使用: Google Borg, Mesos, Kubernetes
- OO 目标: 每个名称是一个服务
猜你喜欢