软件工程师总是着迷于荒唐古怪的事。我们看起来似乎很理性,但在面对技术选型时,总是陷入抓狂——从 Hacker News 到各种博客,像一只飞蛾一样,j2直播,来回折腾,最后精疲力尽,无助地飞向一团亮光,跪倒在它的前面——那就是我们一直在寻找的东西。 真正理性的人不是这样做决定的。不过工程师一贯如此,比如决定是否使用 MapReduce。Joe Hellerstein 在他的大学数据库教程视频中说道: 世界上只有差不多 5 个公司需要运行这么大规模的作业。至于其他公司……他们使用了所有的 IO 来实现不必要的容错。在 2000 年代,人们狂热地追随着 Google:“我们要做 Google 做过的每一件事,因为我们也运行着世界上最大的互联网数据服务。” 超出实际需求的容错没有什么问题,但我们却为此付出了的惨重的代价:不仅增加了 IO,还有可能让原先成熟的系统——包含了事务、索引和查询优化器——变得破碎不堪。这是一个多么严重的历史倒退!有多少个 Hadoop 用户是有意识地做出这种决定的?有多少人知道他们的决定到底是不是一个明智之举? MapReduce 已经成为一个众矢之的,那些盲目崇拜者也意识到事情不对劲。但这种情况却普遍存在:虽然你使用了大公司的技术,但你的情况却与他们大不一样,而且你的决定并没有经过深思熟虑,你只是习以为常地认为,模仿巨头公司就一定也能给你带来同样的财富。 是的,这又是一篇劝大家“不要盲目崇拜”的文章。不过这次我列出了一长串有用的清单,或许能够帮助你们做出更好的决定。 很酷的技术?UNPHAT 如果你还在使用 Google 搜索新技术来重建你的软件架构,那么我建议你不要再这么做了。相反,你可以考虑应用 UNPHAT 原则。 在彻底了解(Understand)你的问题之前,不要急着去寻找解决方案。你的目标应该是在问题领域内“解决”问题,而不是在方案领域内解决问题。 列出(eNumerate)多种方案,不要只把眼睛盯在你最喜欢的方案上。 了解候选方案的产生背景(Historical context)。 比较优点(Advantages)和缺点,扬长避短。 思考(Think)!冷静地思考候选方案是否适合用于解决你的问题。要出现怎样异常的情况才会让你改变注意?例如,数据要少到什么程度才会让你打消使用 Hadoop 的念头? 你不是 Amazon UNPHAT 原则十分直截了当。最近我与一个公司有过一次对话,这个公司打算在一个读密集的系统里使用 Cassandra,他们的数据是在夜间加载到系统里的。 他们阅读了 Dynamo 的相关论文,并且知道 Cassandra 是最接近 Dynamo 的一个产品。我们知道,这些分布式数据库优先保证写可用性(Amazon 是不会让“添加到购物车”这种操作出现失败的)。为了达到这个目的,他们在一致性以及几乎所有在传统 RDBMS 中出现过的特性上做出了妥协。但这家公司其实没有必要优先考虑写可用性,因为他们每天只有一次写入操作,只是数据量比较大。 他们之所以考虑使用 Cassandra,是因为 PostgreSQL 查询需要耗费几分钟的时间。他们认为是硬件的问题,经过排查,我们发现数据表里有 5000 万条数据,每条数据最多 80 个字节。如果从 SSD 上整块地读取所有数据大概需要 5 秒钟,这个不算快,但比起实际的查询,它要快上两个数量级。 我真的很想多问他们几个问题(了解问题!),在问题变得愈加严重时,我为他们准备了 5 个方案(列出多个候选方案!),不过很显然,Cassandra 对于他们来说完全是一个错误的方案。他们只需要耐心地做一些调优,比如对部分数据重新建模,或许可以考虑使用(当然也有可能没有)其他技术……但一定不是这种写高可用的键值存储系统,Amazon 当初创建 Cassandra 是用来解决他们的购物车问题的! 你不是 LinkedIn 我发现一个学生创办的小公司居然在他们的系统里使用 Kafka,这让我感到很惊讶。因为据我所知,他们每天只有很少的事务需要处理——最好的情况下,一天最多只有几百个。这样的吞吐量几乎可以直接记在记事本上。 Kafka 被设计用于处理 LinkedIn 内部的吞吐量,那可是一个天文数字。即使是在几年前,这个数字已经达到了每天数万亿,在高峰时段每秒钟需要处理 1000 万个消息。不过 Kafka 也可以用于处理低吞吐量的负载,或许再低 10 个数量级? 或许工程师们在做决定时确实是基于他们的预期需求,并且也很了解 Kafka 的适用场景。但我猜测他们是抵挡不住社区对 Kafka 的追捧,并没有仔细想过 Kafka 是否适合他们。要知道,那可是 10 个数量级的差距! 再一次,你不是 Amazon (责任编辑:本港台直播) |