分布式系统之数据类型

上篇

  前面章节讨论了分布式系统的算法,本篇总结一下分布式系统的数据结构类型,不可变数据值易于存储和缓存,能够被可变的有唯一标识的实体引用,能让我们建立大规模的强一致性系统. 当软件规模发展时,不同组件之间必须独立扩展,我们将大型库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在多租户系统是必要
      • 多租户是艰难的
      • 咋同一个处理服务器运行多个逻辑服务经常是可行的
  • 切分你的系统变成分离的服务和领域模型
    • OO 目标: 每个名称是一个服务
      • User service用户服务
      • Video service视频服务
      • Index service索引服务
    • 函数式目标: 每个动词是一个服务
      • Auth service授权服务
      • Search service搜索服务
      • Dispatch/routing service分发路由服务
    • 大部分大系统是混合使用
      • 名词服务针对数据类型的不变性
      • 动词服务针对变化的不变性
      • 比如我们有基本的用户服务,被授权服务调用
    • 画线分界是一件难事
      • 服务可能会过重
      • 考虑工作单元
      • 分离服务,根据不同服务独立扩展。
      • 紧耦合服务必然带来紧延时的负担,也就是高延时的慢性脑
      • 对于使用慢资源的服务比如磁盘或CPU
        • 在节点上运行memcache
        • 使用: Google Borg, Mesos, Kubernetes

 

 

首页

领域驱动设计

事件模型

微服务