2.2 过去的性能和你的用户

没有完美的预测者。没有人能预知未来。当我们有足够多的数据时,或许可以利用很多数学公式做预测,但是对于其他人来说可能并不重要。人们有一个习惯,就是说,对大多数人来说,过去的表现预示着未来的表现。或者至少,过去的表现可以预测人们对未来表现的预期。

当你开始考虑你的服务的可靠性时,必须从它的历史开始。你的用户过去对你的服务是否满意并不重要,重要的是要了解你的服务曾经怎么样,现在怎么样。这是因为用户对你的期望值很高,而且你可能已经与他们达成了隐式协议,即使你现在还没有正式发布的SLO或SLA。

如果你的服务还不存在,别担心!第10章介绍了如何使用这些方法从头开始构建一个可靠的系统。

2.2.1 隐式协议

当一项服务在某个级别上运行了一定时间后,你的用户会将此视为与他们达成的协议——无论你是否缺少文档或合同来说明这一点。你的用户习惯的可靠性水平通常是他们期望的。你的用户相信你会这样做。

这并不意味着你现在的状态就是你将来应该努力的目标。这可能是因为你正在失去用户,或者你的用户不高兴,即使他们还没有其他可替代的服务。有时你的服务是唯一可用的选择,而用户可能别无选择。

这也不意味着你不应该变得更好。如果你的服务更可靠,你可能会得到更多的用户,并有更快乐的支持工程师。

关键是,当你开始考虑服务的可靠性时,你需要知道你的服务过去怎么样,并承认用户很有可能期望未来服务的可靠性跟之前一样。SLO不是合同,即使只是从用户的角度来看,你仍然需要向你的用户保证服务的可靠性。如果不记住这一点,你就无法正确度量可靠性。

2.2.2 制定协议

设置SLO可能不能保证SLA在合同中的义务,但也不应该对用户隐藏SLO。无论是付费客户还是内部团队,人们都应该能够理解和了解你的目标。我们将在本书后面更详细地解释为什么会这样,但是要知道,你的目标如果不能被其他人发现的话,那么这些目标将只有一部分是有用的。对用户透明是一个强大的工具。

如果其他人不知道你想要多可靠,他们就不能说出自己对这个目标是否满意。此外,如果依赖于你的服务的用户无法了解你想要的可靠性,他们就无法准确地设置自己的可靠性目标。

通过采用基于SLO的可靠性方法,从某种意义上讲,你承诺将尽最大努力在一定程度上提供服务。有时你可能会错过目标级别,并且可能会随着时间的推移而改变目标级别,但仍然存在一定程度的一致性。你至少要努力使你的服务像你公布的目标那样可靠。SLO可能没有绑定SLA,但是如果不承认用户将把可靠性目标视为与他们达成的协议,就不能开始考虑服务的可靠性。

意外可靠性要求

正如我们刚刚讨论过的,你过去的可靠性水平很可能已经成为用户所依赖的一种协议,不管你是否打算这样做。这在一定程度上是因为你的服务可能比你最初意识到的用途更多。Hyrum定律(https://www.hyrumslaw.com):

如果一个API有了足够数量的用户,你在合同中承诺什么并不重要:你的系统的所有可观察的行为都将被某些人所依赖。

谷歌工程师Hyrum Wright提出的Hyrum定律在当你考虑如何度量服务可靠性时尤为重要。你的用户可能期望某些边缘的功能以你从未想到的方式保持可靠。这一切都与你和你的服务用户所达成的隐式协议有关。你可能没有意识到你的用户实际上需要你做什么,所以当你了解了更多关于用户行为的信息时,如果你的可靠性度量需要改变,也不要惊讶。

2.2.3 一个可靠性的案例

作为一个例子,让我们考虑一个大型数字媒体流服务的可靠性要求。这项服务有许多电影、纪录片、电视节目和其他类型的内容供人们观看。你现在可能已经订阅了一个或多个这样的服务。

是什么能够让这项服务对你和用户来说可靠?你需要什么?你期望什么?这个服务和使用它的人之间有什么样的隐式协议或显式协议呢?

你可能首先想到的事情是:“当我打开一部电影时,它会播放吗?”这是一个很好的起点,绝对是服务可靠性的一部分。数字流媒体服务需要能够流式传输,否则显然不可靠。

但这项服务不仅仅需要能够流式传输到你的设备上。例如,它还需要及时地传输。不追求完美的一个很好的例子就是当你开始一个新的流媒体电影或电视节目时,你期望的缓冲时间是多少。大多数人在开始观看时都会有几秒的缓冲时间。内容需要“加载”这一概念是用户已经习惯的,因此,如果刚开始需要加载一段时间用户是可以接受的。只是不能持续太长时间,否则人们会认为服务不再可靠,从而可能会转向另一个服务。另一方面,如果偶尔花“太长时间”,你可能不会失去任何用户,只要不是每次都花那么长时间。

虽然人们习惯于开始时的缓冲时间,但他们不希望在观看过程中由于缓冲而中断播放。所以,虽然在某个时间点上有一定的缓冲时间可以认为服务是可靠的,但是不能认为在其他时间点上进行缓冲服务还是可靠的。

然而,视频流在一段合理的时间内启动并且在播放中不停止缓冲是远远不够的。你还需要确保播放的视频流是正确的。如果用户选择了电影Anchorman,你最好不要送一集Seinfeld。这不仅适用于视频流的开始方式,而且即使剧集选择按钮是无缝的,你也无法将它置于中间。

此外,你需要你的视频流具有一定的质量保证。对大多数人来说,流媒体服务不一定要一直保持100%的完美,但其他人会为更高分辨率而付费。因此,为了可靠,服务需要为某些人提供足够好的视频质量,而为其他人提供一般好的视频质量。

看到屏幕上的图像很好,但大多数人也需要音频。音频不仅需要呈现,还需要与视频同步。如果音频比视频慢一两秒,那么对于有些人来说可能就看不下去了。此外,音频应该跟电影是匹配的,语言也应该是正确的,并且有一个适中的音量和质量。

其他用户可能根本不需要音频,但在这种情况下,他们可能需要语言正确、字体大小可读的字幕同步到视频。

当你搜索一部电影时,相关的结果应该会出现。当你向队列中添加一些内容时,它应该留在队列中。选择电影时,预览文本应与所选的电影匹配。如果你在《迷失》第三季第八集,下一个开始播放的应该还是《迷失》,而不是《疯狂的麦克斯:狂怒之路》第三季第九集。或者,用户可以选择一个设置来决定电视节目的下一集是否应该自动开始播放。如果这个设置存在,就应该尊重它,否则你的服务在某种程度上就是不可靠的。

如果服务有适合儿童的登录选项,可用的选项应该是适合儿童的。

服务可以收取服务订阅者应该收取的费用,并且应该在适当的时候收取该费用。他们所选择的订阅包也应该保持不变,并且在没有警告的情况下不会对其进行更改。另一方面,如果他们真的选择升级或降级订阅服务,服务应该做出相应的改变。

对于一个复杂的视频流服务,要想对用户来说是可靠的,我几乎没有触及一些事情的表面。例如,我们没有考虑用户的流媒体设备或互联网连接的质量。但希望这可以成为一个很好的例子,说明你需要如何设身处地地为用户着想,以确保你在衡量他们真正关心的事情。有这么多的事情在起作用,也能清楚地说明为什么假设其中的每一个服务都会一直或同时可靠是不现实的。