Tinder 系统架构

本文涉及的产品
Elasticsearch Serverless通用抵扣包,测试体验金 200元
简介: Tinder 系统架构

Tinder 是全球最大的约会平台之一,发明了左划/右划的用户体验,是国内陌陌、探探等大量模仿者的鼻祖。本文介绍了 Tinder 的基本架构,可以帮助我们理解类似应用背后的技术。原文:Tinder System Architecture[1]


当朋友们都在和女朋友约会,而你还是单身狗的时候,会不会想知道基于位置的约会搜索应用程序能不能帮你解决孤独的问题?这篇文章会解释约会应用程序的设计,但阅读文章并不会自动为你带来约会,你仍然需要努力去理解妹子们。下面让我们来看看这类应用的架构吧。


你知道有多少个约会软件呢?Tinder, bumble, happn,等等。作为系统架构师,我更感兴趣的是系统的构建而不是约会机会本身。当然,我也希望有更多的约会机会。


基础功能需求


  1. 多种登录方式,如 Facebook, Instagram,谷歌,电话号码等,允许使用 Facebook ID, Instagram ID,和其他方式注册。
  2. 每个用户都必须有自己的用户资料,包括年龄、距离、共同的朋友、共同的兴趣和目标描述。
  3. 地理位置检测用户的当前位置。
  4. 用户应该能够查看基于地理区域的推荐。
  5. 支持通过过滤(包括年龄、性别、距离等)进行搜索。
  6. “划动”(Tinder 独创)可以用来表示用户对目标的态度。右划表示喜欢某人,左划表示拒绝某人。
  7. 匹配:双方用户都向右滑动即可开始聊天。
  8. 聊天:与另一个用户的私人消息。
  9. 推送通知:当用户收到新消息时,通知用户喜欢或匹配或聊天。


额外功能需求


  1. 超级喜欢:向上滑动某人,对方的名字会在列表里显示一个蓝色的星星,这个功能可以提醒用户收到“超级喜欢”,并且能够看到一个蓝色的横幅显示在名字底部。付费版本每天可以提供 5 个“超级喜欢”,但免费版本每天只会提供 1 个“超级喜欢”。
  2. 升级(Boost):允许我们跳过队列直接出现在用户列表顶部,这意味着我们的配置文件将在地理区域的顶部停留半小时。
  3. 无限回退:回退上次的“划动“以纠正错误。
  4. 环球护照:在你到达目的地之前,就为即将到来的旅行找到一个匹配的目标。
  5. 无限右划和喜欢。
  6. 隐藏烦人的广告。
  7. 隐藏距离。
  8. 隐藏年龄。
  9. 控制用户偏好:对于免费版本,系统将根据 ELO 分数和活跃时间来显示其他用户的资料,所有这些都将由 Tinder 算法计算出来,以评估用户的相对吸引力。
  10. 可以选择是否希望系统将你的资料显示出来。
  11. 置顶图片:有效期 24 小时的推荐,并能够看到关键字。
  12. 智能照片:可以根据大多数用户对你照片的反应或喜欢选择最好的照片显示,并可以根据机器学习算法修改照片。
  13. 用户可以拉黑其他用户,但不能解除拉黑。
  14. 个人安全针对所有 LGBTQ+特定用户的资料,所有被检测到的 LGBTQ 的用户资料不会在禁止区域内被推送。
  15. 已读回执。
  16. 喜欢你:其他用户喜欢你并想和你聊天,只有当你是付费会员时才会启用。
  17. Noonlight 时间线:从 Noonlight 应用程序发起紧急帮助请求,并分享约会或会议的详细信息。
  18. 照片验证:显示档案照片是否真实,如果是真的,会得到一个蓝色的图标。
  19. 安全中心:提供最新的安全更新。
  20. 超级升级(Super Boost):跳过队列,提升 100 倍以上的潜在匹配率。
  21. 视频聊天:面对面的视频聊天。
  22. 极受欢迎(Hot takes):每晚 6 点开始至午夜结束,通过回答 6 个问题,可以匹配上同样回答了这 6 个问题的人。在聊天的时候看不到对方的个人资料,而且聊天有时间限制。
  23. 在个人信息里添加视频。
  24. 探索部分:看看他们能认识多远的新朋友。
  25. “你确定吗”:阻止应用中的滥用和骚扰。在人工智能的帮助下,应用识别并标记不恰当的信息。
  26. 留言:允许发送个性化留言给 5 位超级喜欢的人。
  27. 更喜欢(Priority like):显示出你想约会的对象。
  28. 兴趣(Vibe):通过回答一系列的某个类型的问题,找到志同道合的人。
  29. 身份验证:为用户提供隐私友好的身份验证方式。
  30. Tinder U:供大学生与校园内的人联系。此外,用户还可以在不同校园的用户上划动。
  31. 工作模式:呈现一个假的项目管理工具,可以开始划动。


非功能性需求


  1. 系统必须是高可靠的。
  2. 系统必须是高可用的。
  3. 高可扩展。
  4. 低延时。
  5. 非实时。
  6. 因为元数据不能保存在单一系统中,因此搜索引擎应该能够支持数据分片。
  7. 全文搜索:搜索个人的完整简介。
  8. 结构化数据:XML/JSON

规模估计


  1. 1 亿以上的下载量
  2. 5000 多万用户
  3. 30 多种语言支持
  4. 200 多亿的配对
  5. 每天刷 18 亿次(左划,右划,超级喜欢)
  6. 5000 万以上会员

image.png



系统组件设计


1. 用户档案创建者服务,媒体文件服务器,地理分片索引和用户信息数据库


image.png

  • 用户完成个人信息的创建
  • 在同步进程内将用户媒体(如照片)推送到文件服务器
  • 以键值对的形式将包含位置的用户个人信息保存到 Amazon DynamoDB 中
  • 将个人信息发送到基于地理位置分片的队列
  • 异步进程从队列中读取用户信息,并通过谷歌的 S2 库将信息传递给 Geo-Sharding 索引器,它可以将用户的位置映射到地理分片,并将用户添加到与该分片关联的索引中,有助于推荐用户给其他人。[2]
  • 通过在 Amazon DynamoDB 或 Riak 中使用键值对来存储用户信息


2. 谷歌的 S2 库


  • 使用四叉树(Quad-Trees)将球体(sphere)分层分解成“细胞(cells)”。


3. 获取用户推荐


image.png

  • 当用户想要看到另一个用户时,激活推荐引擎,请求被发送到推荐引擎,并转发到地理位置分片索引器(Geo-Sharded Indexer)。
  • 索引器确定用户的位置和半径,并查询映射到相同分片的所有地理分片索引,将相同分片中的所有用户的列表提供给推荐引擎,最后推荐引擎基于算法对列表进行过滤。


4. 推荐引擎算法


  • 用逻辑回归计算概率,这样系统就可以对每个用户的推荐进行排序

image.png

  • 主动使用:因为 Tinder 的目的是帮助人们约会,因此会检测一个人是否积极使用应用程序。
  • 收集标签:当一个人使用 Facebook、Instagram 等网站的 OAuth 登录时,Tinder 可以收集很多有意义的信息,比如位置、年龄、距离、性别偏好、访问地点、喜欢、不喜欢等等。
  • 用户分组(Group Userbase):用户从 Tinder 中随机获得一些分数,并落在某个分数桶中,这种分组有助于匹配人群。
  • 挑剔/不良行为:用户右划太多,导致推荐引擎无法检测到正确的偏好,也不会向该用户显示任何推荐。
  • 回复:一个人在匹配后回复的意愿程度。
  • 分级权重(Progressive taxation):如果一个人得到太多匹配,Tinder 将以正常的比率将该用户的资料显示给其他用户,而如果某人没有得到太多匹配,Tinder 将主动推荐给其他用户。
  • 用户资料:年龄、性别、种族、地点、职业等。
  • 用户在 Tinder 上的历史数据:左划,右划,历史地理位置,每日使用时间。
  • 用户偏好:喜欢、不喜欢、偏好。
  • 用户照片:面部特征、头发颜色、体型。


5. Elastic Search 集群和地理分片索引


  • 通过搜索索引来实现快速的搜索响应


image.png

网络异常,图片无法展示
|

  • 通过标准差来平衡地理分片配置与用户数量
  • Kafka 异步处理用户位置索引数据,Elastic Search 获取消息并将其发送到单元映射器(cell mapper),并告诉 Elastic Search 信息正在使用 ES API 写入特定的分片。用户信息会保存在 Elastic Search,并用于左/右划动。


image.png



6. 划动和匹配


image.png

  • 当用户在进行左划/右划时,将会触发系统的一系列动作。划动捕捉器将处理划动操作,并将左划操作放入流数据库(如 Amazon S3)进行数据分析。右划操作被放在一个单独的流中,由匹配器读取。匹配将从流中收集“喜欢”消息,并检查“喜欢”缓存中是否存在相同的对应消息。当两个用户都匹配时,一个匹配通知会通过服务器推送机制(比如 websockets)发送给两个用户。如果只有一个用户喜欢其他用户,所以“喜欢”消息将首先保存在“喜欢”缓存中。
  • 在 Amazon DynamoDB 中将创建一个键值对用于存储用户的匹配信息(用户喜欢对方),用于此数据存储的散列键可以是两个喜欢对方的用户的唯一标识符的复合键。


image.png

7. 用户位置变更


image.png

  • 一旦用户切换了位置,我们希望确保给用户的推荐来自附近的位置,因此用户位置将被更新到新的位置,以便更新后的位置被用于获取推荐。此外,映射到用户新位置的索引也将被异步更新。
  • 用户位置 50km 范围内被用于为用户匹配附近的人

API


  • updateProfile(userToken, userProfile)
  • uploadPicture(userToken, imagePath, imageInfo)
  • updateSearchPreference(userToken, searchPreference)
  • getProfiles(userToken, count)
  • rateProfile(userToken, profileRating) (call once the user like the user profile)

系统架构概要设计


image.png

参考文献


References:

[1] Tinder System Architecture: https://medium.com/interviewnoodle/tinder-system-architecture-2012902cb415

[2] Geosharded Recommendations Part 1: Sharding Approach: https://medium.com/tinder-engineering/geosharded-recommendations-part-1-sharding-approach-d5d54e0ec77a

[3] Auto Scaling groups: https://docs.aws.amazon.com/autoscaling/ec2/userguide/AutoScalingGroup.html

相关实践学习
以电商场景为例搭建AI语义搜索应用
本实验旨在通过阿里云Elasticsearch结合阿里云搜索开发工作台AI模型服务,构建一个高效、精准的语义搜索系统,模拟电商场景,深入理解AI搜索技术原理并掌握其实现过程。
ElasticSearch 最新快速入门教程
本课程由千锋教育提供。全文搜索的需求非常大。而开源的解决办法Elasricsearch(Elastic)就是一个非常好的工具。目前是全文搜索引擎的首选。本系列教程由浅入深讲解了在CentOS7系统下如何搭建ElasticSearch,如何使用Kibana实现各种方式的搜索并详细分析了搜索的原理,最后讲解了在Java应用中如何集成ElasticSearch并实现搜索。  
目录
相关文章
|
人工智能 安全 Linux
云+AI时代下,Alibaba Cloud Linux 进一步演进思考
用好开源、做深开源、自研创新,打造全方位安全可信的服务器操作系统。
|
9月前
|
运维 自然语言处理 Linux
os-copilot安装和使用体验测评
OS Copilot是阿里云基于大模型构建的Linux系统智能助手,支持自然语言问答、命令执行和系统运维调优。本文介绍其产品优势、功能及使用方法,并分享个人开发者在云服务器资源管理中的实际应用体验。通过-t/-f/管道功能,OS Copilot简化了复杂任务处理,但仍需增强某些命令的执行能力,特别是在数据库安装部署方面。文中详细描述了安装步骤、环境配置及常见问题解决方法,帮助用户更好地利用OS Copilot提高工作效率。
|
9月前
|
人工智能 数据挖掘
低代码 + AI 落地实践,让业务效率翻倍,解锁未来生产力!
2025年春节,DeepSeek引发AI讨论热潮,推动“数字化”到“数智化”的革新。低代码+AI组合降低了技术门槛,加速企业智能化升级。文中通过食品加工业原料溯源、家电售后管理、发票识别打印三个案例,展示其在效率提升和市场竞争力中的作用,并介绍钉钉宜搭举办的“低代码+AI”视频创作大赛,邀请读者参与探索更多实际应用。
1031 9
|
11月前
|
SQL 缓存 关系型数据库
MySQL Limit实现原理
本文深入解析了MySQL中`LIMIT`子句的实现原理及其在分页、性能优化等场景下的应用技巧。文章详细介绍了`LIMIT`的基本语法、MySQL内部处理流程,以及如何通过索引优化、覆盖索引等策略提升分页查询的性能,并提供了实践建议。
819 3
|
存储 人工智能 安全
阿里云oss简介和如何对接使用
阿里云对象存储服务(Alibaba Cloud Object Storage Service,简称OSS)是阿里云提供的一种安全、稳定、高效的对象存储服务。它支持多元数据存储、持久化存储和共享访问,并且具有无限的扩展性和备份恢复能力。阿里云OSS适用于各类场景,如云计算、大数据分析、人工智能等,并且具备高可用性、高可扩展性和低成本等优势。
15287 2
|
Kubernetes 架构师 算法
阿里面试:全国14亿人,统计出重名最多的前100个姓名
文章介绍了如何解决“从全国14亿人的数据中统计出重名人数最多的前100位姓名”的面试题,详细分析了多种数据结构的优缺点,最终推荐使用前缀树(Trie)+小顶堆的组合。文章还提供了具体的Java代码实现,并讨论了在内存受限情况下的解决方案,强调了TOP N问题的典型解题思路。最后,鼓励读者通过系统化学习《尼恩Java面试宝典》提升面试技巧。
阿里面试:全国14亿人,统计出重名最多的前100个姓名
|
物联网 5G UED
深入解析载波聚合及其对无线通信性能的提升
深入解析载波聚合及其对无线通信性能的提升
1411 1
|
存储 关系型数据库 MySQL
MySQL中的Redo Log、Undo Log和Binlog:深入解析
【10月更文挑战第21天】在数据库管理系统中,日志是保障数据一致性和完整性的关键机制。MySQL作为一种广泛使用的关系型数据库管理系统,提供了多种日志类型来满足不同的需求。本文将详细介绍MySQL中的Redo Log、Undo Log和Binlog,从背景、业务场景、功能、底层实现原理、使用措施等方面进行详细分析,并通过Java代码示例展示如何与这些日志进行交互。
1093 0
|
前端开发 JavaScript 数据库
从前端到后端:构建高效数据驱动应用的全栈策略
在构建现代应用程序时,前端与后端的高效协作至关重要。本篇文章深入探讨了如何将前端技术与后端架构相结合,以构建强大的数据驱动应用。我们将分析常见技术栈,包括React与Node.js的集成、Python与Django的应用,以及如何利用数据库优化数据处理。通过具体的示例和最佳实践,读者将能掌握如何在全栈开发中实现高效的数据交互与应用性能优化。
|
缓存 NoSQL 数据库
关于高并发下缓存失效的问题(本地锁 && 分布式锁 && Redission 详解)
关于高并发下缓存失效的问题(本地锁 && 分布式锁 && Redission 详解)
429 0