This is why I can’t have conversations using Twitter

Salvatore Sanfilippo

为什么我没法在 Twitter 上正常对话

原文由 Salvatore Sanfilippo 发布,订阅该博客

昨天 Stripe 的工程师写了一份详细的报告,解释了他们在使用 Redis 时遇到的问题,这一点非常值得肯定。在 Hacker News 的讨论串里,我解释说,由于我们现在已经有了无盘复制(http://antirez.com/news/81),对于拥有主从副本集的用户来说,持久化已经不再是必选项。这改变了设计的约束条件:既然现在可以实现无盘的副本同步,就值得以更安全的方式,更好地去支持像 Stripe(之前?)那样关闭持久化的副本集的用例。这项工作目前仍在进行中。

在同一篇文章里,Stripe 的工程师还说,他们打算在出现 Redis 问题的那个场景下改用 PostgreSQL,这确实是一个非常优秀的数据库,很多时候如果你能接受 SQL 数据模型并且使用基于磁盘的数据库,用它会比 Redis 更好——Redis 本就是为那些确实需要每秒处理大量复杂操作的场景而设计的。Stripe 的工程师还说,他们测量了 99 分位延迟,发现 PostgreSQL 比 Redis 表现更好,于是 @aphyr 在一条推文中写道:

“注意,同步的 Postgres 跨可用区复制,其 99 分位延迟比异步的 Redis 还要低”

而我回复道:

“看看平均延迟或许有助于更好地理解到底发生了什么,因为我认为 99 分位很容易受到 Redis 在 EC2 上运行时出现的延迟尖峰的影响。”

我的意思是,如果你同时有平均值,就可以判断 99 分位是不是被那些很多时候可以解决的延迟尖峰给拉高了。通常情况就是这么简单:如果平均值很低,但 99 分位很差,那很可能并不是因为 Redis 本身运行缓慢——比如执行的操作非常耗时或会阻塞——而是一小部分请求由于 EC2 上常见的问题而变慢了:比如某些实例上的 fork 耗时、远程磁盘 I/O 等等。这些问题很可能是可以解决的,比如就存在没有 fork 延迟问题的实例类型。

可在将近一半的 Twitter 技术圈人看来,我这句话却是在鼓吹应该用平均延迟来取代 99 分位作为正确的指标:

“平均值是衡量延迟最烂的指标。我见过的所有延迟分布都不是钟形曲线,用平均值毫无意义。”
“你显然没搞懂背后的数学原理,也不明白尾延迟在分布式系统中为什么重要。我觉得我们没什么好谈的了。”
“确实,问题在于平均值在有离群值存在时不具备鲁棒性”

呃,谁说平均值是个好指标了?我提出它是为了判断是否存在大的离群值。所以在一场本该是正常交流的讨论中,10 分钟后我发现我的 Twitter 时间线完全被说我是个白痴的人刷屏了,说我把平均值捧为世界上衡量延迟的“新标准”。一旦有了最初的几次转发,就会吸引来更多的人。甚至一位知名的其他 NoSQL 数据库的构建者也抽空在 Twitter 上给我上了一课:我回复说,我明明写的是,如果同时有 99 分位和平均值,你就能更清楚地看到曲线的全貌,从而判断问题是不是出在 Redis 在 EC2 上的尖峰上,但神奇的是,原推被删掉了,于是我的推文现在就显得更加脱离上下文了。我的三条推文是:

  1. “我的意思是,就算在互联网的噪音里我也不确定这还有没有用,平均值有助于理解为什么(……)”
  2. “99 分位很差。如果平均值很好但 99 分位很差,你可以怀疑是有少数几个非常糟糕的样本”
  3. “这对 Redis 很有用,因为通过适当的配置,有时你可以大幅改善那些延迟很差的样本。”

猜怎么着?甚至还有人把第 2 条推文单独截了出来,它原本是“理解为什么 99 分位很差”(差是指,数值不好看)的后半句,却被断章取义地解读成了:“99 分位很差”。

曾几何时,人们会在 Usenet 上争论好几天,但至少大多数时候,都是一方观点对另一方观点,有足够的文字和上下文来维持正常的讨论条件。而现在这不过是仇恨和工程学入门规则的叠加放大。99 分位延迟才是正确的指标,平均值是很差的指标?那就确保你即使在谈平均值有意义的上下文里也绝不要提它,否则你就会收到一万条糟糕的回复。

那该怎么办呢?好在我个人不太受这些影响,但也很清楚,因为我把 Twitter 当作工作来用,用来告知大家 Redis 的动态,这已经不是一个可行的职业环境了。举个例子,延迟:我非常在意延迟,这么多年来为此做了很多努力来改进它(包括无盘复制)。我们也有监控来搞清楚是否存在延迟尖峰以及原因,Redis 可以通过监控不同的执行路径,为你提供一份人类可读的内部运行报告。做了这么多工作之后,你得到的却是被转发上百万次的错误信息,这毫无帮助。大多数人不会去追踪推文来自己形成判断,现实在此时已被改写:我说平均值很好,却不明白应该去看长尾。下次我再谈延迟时,在很多人眼里,我就会是那个对它一知半解的人,所以谁还能知道我在说什么、我在做什么呢?

与此同时,Twitter 就像是面向人的 RSS,它对于让很多人了解我热爱的事情——也就是用心开发我的开源项目——极其有用。所以我在思考怎样的安排才是可行的。也许我可以多写博客,多使用 Redis 邮件列表,而只把 Twitter 当作发链接的地方,让感兴趣的人去阅读,让感兴趣的人去争论、进行真正有用的讨论。

关于 Redis,我还有很多事情要做,既要为那些用得很顺手的用户,也要为那些遇到问题的用户。我觉得我的时间最好还是花在写代码上,而不是在 Twitter 上进行这种算不上对话的对话。我喜欢争论,但这实在是一种徒劳。

本文章由 muse-spark-1.2-contributor 进行翻译

评论