微信附近的人

系统设计题:

设计一个系统,实现“附近的人”这一功能

附近的人在微信的功能里大家都比较常用,如果按照我的理解,可以分为距离近和兴趣点近这两种附近的人的类型。关于用户兴趣计算得到附近的人,因为涉及到用户画像,推荐系统中的内容,这里暂且仅仅以空间距离进行附近的人作为衡量标准。

 

1 给出功能设计

     用户的上下线

  1. 在用户表中新增字段” status” 和” last_time”。 ” status”用来标注用户当前的状态:” last_time” 用来记录用户最后操作的时间
  2. 在登录时更新用户” status”为上线 ,” last_time”为当前时间。并推送用户信息给前端。
  3. 在登出时更新用户” status”为下线 。并推送用户信息给前端,比如清理用户session信息。
  4. 当用户手动修改当前用户的状态为“离开“或“忙碌“时,后端修改用户状态,并将修改结果推送给前端,用户维护当前在线用户列表。
  5. 编写定时任务扫描“status“ 为上线的用户,比较用户的“last_time“于当前时间的时间差,当时间差大于30 分钟(session失效时间),设置用户“status“为离线状态。并将该用户状态推送给前端。
  6. 在前端做一个用户信息统一封装,各个地方显示的用户状态信息都从该方法中获取。该方法在用户登录系统后,向后端发送请求,拉取当前系统在线用户的状态。然后通过后端的websocket 推送信息来维护当前在线用户的列表。(当有新用户上线则向列表中添加该用户,有用户登出,则将用户从该列表剔除。)

2 怎么计算附近的人

计算附近的人需要依赖于GPS定位功能,可以想象在一篇区域,比如深圳市区,我们可以按照尺度规则将地图划分为一个个的方形区域(其实划分为圆形更加合理,但是为了保证对所有范围的有效性,势必会造成区域的重叠),在区域划分的尺度上为每一块区域设定一个编码,这就像一个索引一样,举一个例子:

         张三住在深圳市东城区顺义街32号;

         李四住在深圳市西城区长平区65号;

为了计算着两个人的距离,我们会以一定的编码规则,比如第一位为市区、第二位为区域、第三位为街道;计算距离的时候我们先算大位值之间的差异,然后在扩展到小位置。

所以在划分地图时,我们可以用ASDFGHJ这样的编码表示一块区域,显然A代表划分的范围里包括后续序列所有以A开头的内容。那么在计算两个人的距离的时候,我们就将两个坐标点限制在了一块区域,比如ASDFGHJ这块比较精细的区域当中,如果用户发现在这区域里附近的人人数比较少,可以选择扩大范围,那么完全可以将ASDFGHJ变成ASDFGH,然后重新统计其中的人,然后按照距离进行排序,最后将列表返回给用户。

3 后台架构图

微信附近的人_第1张图片

前台交互的时序图

微信附近的人_第2张图片

 

5 数据在服务器上的存储结构(支持增删改查)

关于服务器的数据存储结构主要有三种:

  1. 直连式存储:结构简单,直接附加存储是指将存储设备通过SCSI接口直接连接到一台服务器上使用。
  2. 存储区域网络:是一种专门为存储建立的独立于TCP/IP网络之外的专用网络。
  3. 网络接入存储:设备直接连接到TCP/IP网络上,网络服务器通过TCP/IP网络存取管理数据。

关系型数据库: Server(服务器) -> Database(数据库) ->Table(表) -> Row(行) -> Column(列)

数据增删改查的访问,无论是关系型数据库还是NoSql的非关系型数据库,都得以支持。

6 数据在1台服务器存不下的时候,如何扩展到多台,给出扩展方案,并分析其优缺点。

如果单纯的是数据在服务器存不下的情况,可以考虑挂载更多的磁盘。

但是如果考虑到单台服务器的访问压力的情况,需要使用负载均衡的技术。负载均衡可以考虑的办法有:

  1. DNS负载均衡 最早的负载均衡技术是通过DNS来实现的,在DNS中为多个地址配置同一个名字,因而查询这个名字的客户机将得到其中一个地址,从而使得不同的客户访问不同的服务器,达到负载均衡的目的。
  2. 代理服务器负载均衡 使用代理服务器,可以将请求转发给内部的服务器,使用这种加速模式显然可以提升静态网页的访问速度。
  3. NAT负载均衡 NAT(Network Address Translation 网络地址转换)简单地说就是将一个IP地址转换为另一个IP地址。
  4. 反向代理负载均衡 普通代理方式是代理内部网络用户访问internet上服务器的连接请求,客户端必须指定代理服务器,并将本来要直接发送到internet上服务器的连接请求发送给代理服务器处理。

 

优点是能明显的降低单台服务器的访问压力,支持高并发量用户的访问,缩短访问时延,提高用户对产品的体验满意度。缺点是有更多的问题需要解决,例如成本变大,要考虑数据一致性的问题,服务器间进程通信。

 

  1. 如何提高系统的容灾性。
    1. 对系统当中的数据做好备份,及进行数据持续性保护。
    2. 考虑业务连续性的保障。系统出现意外故障,能有快速接管业务并持续进行对外服务的能力。
    3. 抗自然灾害特性。做好异地容灾。
    4. 数据的安全性。容灾备份系统能完全的备份所有现在支撑服务的系统数据。

 

你可能感兴趣的:(软件项目管理)