写点什么

构建可伸缩的有状态服务

  • 2015-12-09
  • 本文字数:2170 字

    阅读完需:约 7 分钟

来自 Twitter 的分布式系统工程师, Caitie McCaffrey ,在 Strange Loop 会议总结了有状态服务的优点,以及如何扩展它们,有状态的服务相比于无状态的服务,在业界大家知道的要少的多。其中优点包括数据定位(可通过函数传递范例来实现)、高可用、强并发模式。McCaffrey 还给出了有状态的实际案例和少量的踩过的坑。

数据局部性是指每个请求都会被路由到(“运送到”)可以操作数据的机器上。当一个请求做到时第一次命中了数据存储,之后处理数据的请求离开了服务,在将来来自内存中的数据可以让类似的请求更快的找到同样的服务。结果就是低延时的好处,毋需再去访问数据存储。这就是“函数传递范例”,是有状态服务和无状态服务区别的关键所在。

有状态的服务通常会导致强一致性的模式。根据 CAP 理论(一致性、可用性、容忍网络分区),基本上说构建一个满足三种所有属性是几乎不可能的。这里有一个非常容易理解的有关于 CAP 概念的问答。然而没有那个分布式系统能够避免“P”(问答中的#10),现实世界是要么选择可用性胜过一致性,这称之为 AP;要么选择一致性胜过可用性,这称之为 CP。有状态的服务可以构建一种粘性的链接,也就是说客户端的请求总是会被路由到原来为之提供服务的服务器主机上。以此方式实现的服务,可以增加 AP 系统的一致性力度。这些强的模式包括有线性随机访问内存和读你所写(Read your Write)。第一种实现是所有的请求所看到的写入都来自一个有序的请求,由它们自己所发出的。第二种实现是一旦请求要写,它就会读区更新后的值,且永远不会再理会旧的值。Werner Vogels在他的文章中总结了这些内容:

无论是否是读你所写、会话以及单调的一致性,这些的实现通常都依赖于“无粘性”都客户端到服务器,为它们执行分布式的协议。如果这每次都是同一台服务器的话,相对能够容易保证读你所写和 monotonic 读取。这就对负载均衡和容错稍有难度,但是它是一个较简单的解决方案。使用粘性的会话,可以更加明确以及提供抛出的客户推理的水平。

McCaffrey 谈到业界通常聚焦于无状态的服务是为了实现可扩展性而忽略了有状态的服务, Eric Evans 在他的书领域驱动开发中写道:

当在某域中的某个重要的进程或转换不是天生的负责一个实体或值的对象时,为模式增加一操作作为独立的接口来声明一个服务。定义接口是模型预言中的一个术语,还要确保操作的名称是无处不在的语言的一部分。将服务成为无状态的。

无状态的服务很容易的通过给后端添加服务器和前端的负载均衡实现横向的扩展。此类应用拥有叫做“数据运送范例”的方式,就是数据被请求时是来自后端的数据存储为请求提供,在未来的请求中,若相同的数据被请求时,是不会去关心这些请求是从哪个服务实例来的,因为服务实例是无状态的。

此模式会放之四海而皆准吗?McCaffrey 谈到在“通信频繁”的应用中简直是一种浪费,因为这些应用要在服务端与客户端之间频繁的通信,而且在此类应用中有状态的服务显然是一种更好的选择。Kai Wähner同意并列举了有状态服务的优点:

  • 当状态是共享的跨调用时,开发是容易的;
  • 不需要额外的持久存储;
  • 通常,为低延时优化。

粘性连接可以使用持久性的连接来实现,但是会带来负载在后端分布不均的问题,这就会导致客户端捆绑到服务器,而有些服务器不能得到充分利用,而有些服务器却负载过多。其中一个减轻此种后端压力的方法就是一旦达到某个阀值就拒绝再来的请求。非粘性的服务还可以通过路由的逻辑来实现,这可以使得任何的客户端通过获得正确的路由来找到任何的服务器。此实现会带来两个问题,路由到集群成员(谁在我的集群中?)和工作分布(谁来做?)。集群成员可以是静态的也可以是动态的。后者可以通过使用 gossip 协议共识系统来实现。工作分布则有更多的实现机制-随机替代、一致性哈希、以及[分布式哈希表]。

McCaffrey 谈到了三个有状态服务的真实案例:

  • Scuba ,一个 Facebook 所使用的内存数据库,用于代码分析、bug 报告、调试性能等。单个的请求会分散到多个后端服务器,然后将响应收集起来,最后决定如何将经过量化的响应完整的返回。
  • 优步的 Ringpop ,一个应用层的切片库,也提供了请求转发。
  • Orleans ,来自微软研究所的基于行为的分布式系统编程模型

有状态的模式其实在 MMO 的开发世界中是见惯不怪的,近期有很多其它领域的也在大量的采用这些模式,上面的例子就是明证。

在采访快结束的时候,McCaffrey 讨论了通过从进程的生命周期解藕内存的生命周期, Facebook 是如何管理 Scuba 的快速重启的。在 Scuba 所在的机器重启后,会花费很长的时间去从磁盘读入数据。要解决此问题就是将这些基于内存的数据从将要宕机的机器中复制到一个共享的地方,当节点恢复后再复制回来。

McCaffrey 在他的演讲中列出了一些构建有状态服务的陷阱,其中包括没有绑定的数据结构导致的内存问题、类似长期的垃圾回收暂停和重载状态时出现的内存管理问题等。状态重载会在恢复和部署新代码时发生,这两者都会像第一次从数据库中获取数据那样付出高昂的代价。

查看英文原文: Scaling Stateful Services


感谢张龙对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们,并与我们的编辑和其他读者朋友交流(欢迎加入 InfoQ 读者交流群(已满),InfoQ 读者交流群(#2))。

2015-12-09 18:0011868
用户头像

发布了 30 篇内容, 共 10.9 次阅读, 收获喜欢 0 次。

关注

评论

发布
暂无评论
发现更多内容

管理者如何避免主观偏见

石云升

职场经验 管理经验 6月日更

北京多部门联合整治违规应用:过度收集用户信息该重罚

石头IT视角

如何用视频云技术,搞一个爆红的 “反应视频” 项目?

阿里云视频云

阿里云 RTC 英特尔 视频处理 视频制作

2021年,想要成为年薪百万的Java架构师需要掌握哪些技术?

Java架构师迁哥

前端 JavaScript 复制粘贴的奥义——Clipboard 对象概述

编程三昧

JavaScript 大前端

唯品会:在 Flink 容器化与平台化上的建设实践

Apache Flink

flink

1小时学会不打代码制作一个网页精美简历(1)

1_bit

大前端 低代码 iVX 低代码开发平台

腾讯安全姬生利:《数据安全法》下,云上数据安全最佳实践

腾讯安全云鼎实验室

数据安全 云安全 数据安全法

云开发是啥?看看它在编程导航项目的实践

程序员鱼皮

Java JavaScript 大前端 后端 云开发

Redis入门四:数据持久化

打工人!

redis redis持久化 6月日更

为什么大家都在用WebRTC?

anyRTC开发者

音视频 WebRTC 语音通话 视频通讯

Flink 和 Iceberg 如何解决数据入湖面临的挑战

Apache Flink

flink

多云部署又添新「云」,EMQ X Cloud 正式支持腾讯云部署

EMQ映云科技

阿里云 IoT 华为云 云平台 #腾讯云

机器数及特点

若尘

计算机组成原理 6月日更

58集团 x StarRocks:全面升级数据分析能力,满足多场景业务分析需求

StarRocks

数据库 数据分析 OLAP 58同城 StarRocks

网络攻防学习笔记 Day52

穿过生命散发芬芳

网络攻防 6月日更

ROS CDK | 云上资源自动化部署新模式

郭旭东

阿里云 ROS 基础设施即代码 IaC

银行业运维指标体系建设实战

云智慧AIOps社区

智能运维

RestTemplate打印日志的正确姿势

编号94530

spring 日志 log RestTemplate

5分钟速读之Rust权威指南(二十七)Rc<T>

wzx

rust

基于jira的需求交付效率统计

好孩子

Jira

批量把Excel数据自动录入系统

木头

自动录入 批量录入 自动填表

网络为本,博睿数据NPMD用20%的投入实现80%的功能

博睿数据

博睿数据 数据链DNA NPMD

剪视频一点都不难,多款超实用剪辑软件全方位评测!

懒得勤快

短视频 视频剪辑 视频制作

网络态势感知是什么?

郑州埃文科技

☕【JVM技术探索】深入分析各种锁(锁膨胀)运作流程

洛神灬殇

JVM 锁升级 6月日更 锁分析

墨奇,以“一手之力” 证明你就是你

E科讯

【Linux】使用 systemd 管理 frp 服务

赖猫

Linux 后端

工作年限、成长路线、进阶技术。怎样才能成为架构师?

Linux服务器开发

Linux服务器开发 Linux后台开发 软件架构师 服务器架构师 C++架构师

小红书 x StarRocks:实现数据服务平台统一化,简化数据链路,提升高并发极速查询能力

StarRocks

数据库 数据分析 广告系统 小红书 StarRocks

JavaScript 数组操作必须熟练运用的 10 个方法

devpoint

JavaScript array reduce 6月日更

构建可伸缩的有状态服务_DevOps & 平台工程_Hrishikesh Barua_InfoQ精选文章