LinkedIn 如何提升资料库读取规模,同时降低成本

2024年3月31日

💎 加入 E+ 成長計畫 與超過 500+ 位軟體工程師一同在社群中成長,並且獲得更多的軟體工程學習資源

LinkedIn 是全球最大的职涯社群网站,在尖峰时期每秒钟要处理将近五百万个使用者的页面请求。在《Upscaling LinkedIn's Profile Datastore While Reducing Costs》一文当中,LinkedIn 的工程团队分享了他们如何导入 Couchbase 资料库作为快取层,有效提升响应速度,以及降低成本。

初期 - Espresso 资料库

在引入到 Couchbase 之前,LinkedIn 的使用者页面是纯透过开源的 Espresso 资料库来做储存。该资料库的规模化很简单,就是增加新的节点 (增加更多硬体)。但是随着使用者人数提高,LinkedIn 团队发现纯增加节点的方式不堪负荷,需要投入大量资源改造,才可能持续扩张。因此决定找新的解决方案。

引入 Couchbase

对于 LinkedIn 这种社群网站的应用,在系统设计上有个关键点,就是读 (read) 的比例会远大于写 (write),比例上是 99 比 1,因此 LinkedIn 团队选中 Couchbase 作为快取 (cache) 层,来处理大量的读的请求,这样当大量读的请求进来时,不用一直增加 Espresso 的节点。

设计快取三个重点

在设计快取的解决方案时,LinkedIn 团队考量三个重点:

  • 第一个是韧性 (resilience),意即当快取出问题时不会影响到系统中的其他元件
  • 第二个是快取资料要随时可用,LinkedIn 团队的作法是把使用者页面的资料快取在每个资料中心 (因为资料量不大,所以这可行)
  • 第三则是要避免资料分歧,LinkedIn 团队的作法是透过在有资料被更新时,去比较时间戳记,选最新的那个去更新到所有同键的快取

Espresso 与 Couchbase 混合快取

虽说引入 Couchbase,LinkedIn 团队没有只用 Couchbase 作为单独快取,而是采用 Espresso 与 Couchbase 混合快取的策略。从架构上来看 (下图),当使用者页面的服务发送请求后,会先被判断要索取的资料是可被快取的,然后判断 Espresso 路由器有没有快取,以及快取是否太旧,假如没有或太旧,就去 Couchbase 拿。如果 Couchbase 没有该资料的快取,才去储存节点拿该资料。

image
圖片來源:Upscaling LinkedIn's Profile Datastore While Reducing Costs

当有写的请求 (使用者页面的资料被更新时),会确保快取有跟资料库的资料是一致的。LinkedIn 团队实作了快取更新机制,是采用最终一致性 (eventual consistency) 来更新。如前面有提到,当有多个写入,会用时间戳记的方式来比较,借此确保所有快取都是更新到最新的更动。

透过整合 Couchbase 作为快取,LinkedIn 的使用者页面团队,最终能够更有效处理更大量的读的请求,加快响应速度超过 60%,同时每年降低将近 10% 的运算成本。

🧵 如果你想收到最即時的內容更新,可以在 FacebookInstagram 上追蹤我們