李智慧 · 高并发架构实战课
李智慧
同程艺龙交通首席架构师,前 Intel & 阿里架构师,《大型网站技术架构》作者
23286 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 26 讲
李智慧 · 高并发架构实战课
15
15
1.0x
00:00/00:00
登录|注册

09 | 交友系统设计:哪种地理空间邻近算法更快?

存储空间需求
带宽负载
TPS(每秒事务处理量)
GeoHash算法
动态网格算法(四叉树)
地理网格邻近算法
SQL邻近算法
距离计算公式:半正矢公式
地理位置获取
邻近算法微服务
推荐微服务
聊天微服务
配对微服务
图片微服务
用户微服务
性能指标估计:
核心算法的掌握对架构师的意义
架构与算法的重要性
网格大小:约25km²
编码长度:13bit经度,12bit纬度
存储方式:Hash表
使用GeoHash算法
GeoHash算法:编码和Hash存储
动态网格算法:适应不同用户密度
地理网格邻近算法:减少中间数据量
SQL邻近算法:简单但效率低
空间邻近算法:
邻近位置算法:
关键微服务:
系统架构:微服务架构
功能:匹配邻近的、互相感兴趣的好友
用户规模:预估超过10亿
目标用户:全球中青年单身男女
应用名称:Liao
主题:基于地理位置服务(LBS)的交友应用设计
作者:李智慧
思考题
小结
Liao的最终算法选择
算法分析
详细设计
概要设计
需求分析
介绍
交友系统设计:地理空间邻近算法

该思维导图由 AI 生成,仅供参考

你好,我是李智慧。
交友与婚恋是人们最基本的需求之一。随着互联网时代的不断发展,移动社交软件已经成为了人们生活中必不可少的一部分。然而,熟人社交并不能完全满足年轻人的社交与情感需求,于是陌生人交友平台悄然兴起。
我们决定开发一款基于地理位置服务(LBS)的应用,为用户匹配邻近的、互相感兴趣的好友,应用名称为“Liao”。
Liao 面临的技术挑战包括:面对海量的用户,如何为其快速找到邻近的人,可以选择的地理空间邻近算法有哪些?Liao 如何在这些算法中选择出最合适的那个?

需求分析

Liao 的客户端是一个移动 App,用户打开 App 后,上传、编辑自己的基本信息,然后系统(推荐算法)根据其地理位置和个人信息,为其推荐位置邻近的用户。用户在手机上查看对方的照片和资料,如果感兴趣,希望进一步联系,就向右滑动照片;如果不感兴趣,就向左滑动照片。
如果两个人都向右滑动了对方,就表示他们互相感兴趣。系统就通知他们配对成功,并为他们开启聊天功能,可以更进一步了解对方,决定是否建立更深入的关系。
Liao 的功能用例图如下。
用户规模分析
Liao 的目标用户是全球范围内的中青年单身男女,预估目标用户超过 10 亿,系统按 10 亿用户进行设计。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文详细介绍了一款基于地理位置服务的交友应用“Liao”系统设计,重点讨论了邻近位置算法的选择。首先分析了Liao面临的技术挑战和用户规模,然后详细设计了系统架构和关键微服务。文章提出了动态网格和GeoHash算法作为更常用的邻近算法,并对它们的优缺点进行了分析。最终,Liao选择了使用Hash表存储的GeoHash算法,以满足邻近交友的应用场景。文章强调了算法在软件编程中的重要性,指出架构和算法是一个复杂系统的一体两面,对于架构师来说,掌握关键算法同样至关重要。文章提出了一个思考题,即忽略了常规的性能指标,鼓励读者分享对设计文档的评审意见。整体而言,本文通过对交友系统设计的技术挑战和解决方案的详细阐述,为读者提供了对地理空间邻近算法选择的思路和方法,对于开发类似应用的技术人员具有一定的参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《李智慧 · 高并发架构实战课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(12)

  • 最新
  • 精选
  • 易企秀-郭彦超
    事实上用户是会自主行走的 ,当用户地理空间发生移动时,如何更新数据呢

    作者回复: 用户打开App的时候,更新数据:删除旧的位置hash key的用户,添加到新的位置hash key。所以应用还需要记录键值对:用户->位置。

    2022-03-07
    9
  • 👽
    目标用户10亿 预估日活10%=1亿,月活20%=2亿 TPS:每个用户,没天滑动10个目标用户。1亿*10=10亿。 互相发送消息20条。1亿*2*20=40亿。 TPS=50亿/86400 假设同时在线用户,预估5%=500万 带宽:由于文字占用的带宽极小,个人认为,可忽略不计。主要占用带宽的资源为图片资源。 平均每个用户,发送5张图片表情包。其中2张新增,3张服务器保存。一张表情包100kb。 假设同时护发图片的用户10%=50万。带宽=50万*2*100kb。 如果应用允许互相发送视频,音频,文件,则另外计算。 存储:基于上面的预估结果。图片等静态资源需要在服务器保存7天,日活1亿*每个用户每天2张新增图片。7天图片存储=1亿*2*100k*7 并且同时,允许每个用户收藏100个静态资源(预估平均使用率10%)。但是需要考虑资源的重复性,假设70%为重复资源。收藏资源存储=10亿*10%*30%*100k。 由于是社交平台,平均每个用户除了头像外,存在1-9张高质量照片。该照片素质为应用卖点,所以不做过度压缩。预计一张图片1mb。平均使用3张高质量图片资源。用月活 20亿*3*1mb。补充:这个图片的上传和访问也需要放在带宽的计算上面。 这些估算肯定不严谨,只是单纯列一下估算的思路。

    作者回复: 赞,思路很清晰

    2022-03-07
    6
  • peter
    请教老师几个问题啊: Q1:网关可以是最外层吗? 本文中的架构图,请求直接到网关,网关在最外层,这可以吗? 微服务开发,现在一般用springcloud,其网关是spring gateway,可以让请求直接到spring gateway吗?(有的说最好不要让spring gateway在最外面,其前面最好加一个nginx)。 Q2:每个微服务用自己独立的DB吗? 本文中的架构图,有几个微服务共用了一个DB。但有的说“微服务之间相互独立,DB也相互独立,即一个微服务用一个DB”。请问,具体该怎么做? Q3:算法微服务用redis吗? 文中的算法微服务需要用redis的geo函数,那么,算法微服务是怎么实现的? 是采用“java代码 + redis”吗?(即创建一个java微服务,运行在一台机器上,同时在这台机器上部署redis) Q4:网格内距离计算用什么? 最好缩小到一个网格内的时候,用户数大约500,此时计算距离是用半正矢公式公式吗? Q5:纬度为负值,怎么纬度的第一个bit为1? “经、纬度 <43.60411, -5.59041> 的二进制编码过程”,纬度是-5.5,是一个负值,第一次计算,平均值是0,-5.5小于0啊,怎么算出来是1?

    作者回复: 1 网关前应该有负载均衡,文中简化省略了。spring+nginx是正确用法 2 微服务可以共用db,db独立的主要考虑是为了降低负载压力。 3 java和redis不会在一个机器上,微服务架构下尤其不会。PS:文中算法用redis,但是并没有用redis的geo函数。 4 是的 5 -5.5是经度longitude,是0。文中经、纬度的叫法是人们习惯叫法;二元组<43.60411, -5.59041> 写法,纬度在前,经度在后,是经纬度的习惯写法。

    2022-03-07
    2
  • 赵常权
    geohash 维度第7 9 10 行 43.60411大于纬度平均值 为什么是0呢

    作者回复: 这里纬度应该是42.60411,感谢提醒,我修正一下

    2022-03-10
    3
    1
  • Geek_474df8
    5位geohash,应该是4.9km*4.9km

    作者回复: 确实,正负误差应该✖️2,感谢提醒,我修改一下

    2022-04-18
  • zhaobk
    老师好,请问,postgresql 有个gis插件,是否可以考虑用于计算查找临近的好友?

    作者回复: 不了解这个插件,感谢提示。不过数据库上的操作负载压力必然是满足不了我们这个场景需求的,太笨重了。

    2022-03-11
    3
  • 逐风
    geoHash有办法对临近的用户进行距离排序吗

    作者回复: Z阶曲线本身就是一个排序

    2022-03-09
    2
  • qc
    10亿用户这个规模下,我们应该采用什么存储方案记录用户之间的好友关系呢?

    作者回复: 暴力一点的话,在用户表里,好友用一个字段就可以记录了,关注好友有上限,一般2000个,好友id用整型,字段最大长度8k。

    2022-03-09
    3
  • 静心
    GeoHash的算法确实很巧妙,但如果按这样存储,如何按不同的距离过滤用户呢?要生成不同网格大小的GeoHash码吗?感觉应该有更好的方法。

    作者回复: 用GeoHash码的长度控制网格大小,网格大小是固定的。

    2022-03-08
  • zhengyu.nie
    之前做附近地址推荐用的是google s2算法,比geohash好一些,geohash有局限性
    2022-10-26归属地:浙江
    1
收起评论
显示
设置
留言
12
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部