重新思考 LinkedIn 的认证模块架构

  如果你是 LinkedIn 的用户,你一定知道它的认证系统。目前为止全球已经有数千万专业人员点击了“认证”按钮,通过他们的关系连接分享了超过100亿个技能认证。LinkedIn 上线认证系统的目的很简单——创造一种让其他人辨认人们的技能的方式。

  当很大一部分 LinkedIn 用户都使用认证功能的时候,我们意识到,想到达到产品的初衷,还有许多工作需要完成。我们注意到,一些认证相比其他要更具价值,所以我们准备打造一个更好的产品来帮助我们的会员理解利用认证能带给他们的潜在价值。

  实现一个为我们的用户提供更多价值的认证系统,需要多方面的调研、新的机器学习模型以及重新架构的能够服务和推荐新认证的后端系统。我们需要的不仅仅是更快的认证服务,还能让我们基于用户的关系和技能为他们提供更多的见解。我们相信,有了新的认证模块架构奠定的基础,我们最终将能够实现上述目标。

  当前的架构

  依据历史经验来说,LinkedIn 的认证体验主要依赖于两大支柱:其一是推荐认证,其二是认证服务。推荐认证流程在后端架构的体现是,产生一组推荐给我们的用户,引导关系网中的用户去帮助认证。这些推荐为用户提供了一个便捷途径来奖励他们同事的技能。

  认证系统的第二个支柱是,当用户看其他人的档案的时候,简单地允许他们认证他们关系网中的人,然后为这些认证服务。

  认证服务

  在 LinkedIn,我们使用微服务架构:大的功能(比如认证)会被封装到一个单独的服务中,然后只暴露出所有可以进行的操作。这样,就可以在保持后端兼容性的基础上让服务在内部进行演进。

  自该方案实施之后,认证产品只是依赖于一个简单的架构,即使用一个单独的 SQL 实例来服务所有的认证。为了在每秒数千请求(QPS)的情况下扩展到100亿认证,我们不得不极度优化数据库使用到的索引。

  例如,由于最常见的使用场景是基于一个给定用户进行认证服务,我们创建了一个结构化的索引,层级如下:

  Recipient Id (1) → Endorsed Item (2) → Endorser Id (3)

  利用这些索引,下面这些操作会变得非常简单:

  遍历用户“Joey”的所有认证:我们使用索引(1),然后遍历它的所有数据项。

  遍历用户“Joey”的所有“Java”技能的认证:我们使用索引(1)和(2)的组合,然后列出所有数据项。

  遍历用户“Yolanda”给予“Joey”的所有“Java”技能的认证(假设“Yolanda”是个推荐人):这次我们使用索引(1)、(2)和(3)的组合,然后遍历找到的数据项。

  当然,这种方法会有一些瓶颈。例如,如果我们想要找出“Jie”给出的所有认证,我们将不得不遍历一遍数据库中的100亿条数据。

  推荐认证

  有两条推荐认证流程:

  可认证技能:这个流程会预测一个用户可能拥有或想要发展的技能条目。

  推荐认证:这个流程会提供每个用户可以认证的(接受者,技能)元组列表。

  这两个流水线能够在离线状态下的 Hadoop 工作流中,利用机器学习和合并特征(例如相互关联、档案信息和历史认证)产生推荐。这些“认证技能”和“推荐认证”数据会被推送到两个不同的 Voldemort 存储中。认证服务将会对键值对存储进行在线查询,拉取可能的认证,然后将他们交付给用户。

  (点击放大图像)

物联网

  多年来,机器学习算法驱动的推荐系统一直在进行微调,以优化扩散和技能多样性。认证系统已经生成了许多用户参与,并已经驱动了 LinkedIn 的许多其他行动。迄今为止,认证的数量和参与此项功能的用户数见证了这个模型的成功。

  鉴于认证模块在许多国家已经非常成熟,我们认为现在是时候来重新设计我们的架构,打开为我们的用户提供更多相关内容的大门。我们走上了寻求重建认证模块的愿景。

  优化正确的目标指标

  使用我们的用户给出的认证数量来衡量认证系统的成功已然过时,我们希望定义一个新指标来更好地代表认证产品的目标。在本文中,我们将这个新指标称之为“高评分的认证”。