一、需求分析
1.功能性需求
- 拥有一个账户
- 能够上传照片
- 通过一些特定指标来获得附近的人资料,例如地理位置、性别、年龄等
- 通过左滑或右滑的方式来筛选
- 推荐过的用户不会再次被推荐
- 当用户匹配时用户之间可以交流
- 分析/监控
- 可以进行视频/语音聊天
2.非功能性需求
容错率,高可用性,最小化读/写延迟,可扩展性,数据一致性(consistency),重复性(dualility),代价最小
二、API接口
登录API,返回user_token
登出API
更新个人资料,update_profile(user_token, prof_info)
上传照片,upload_picture(user_token, image)
改变搜索偏好,updateSearchPreference(user_token, preference)
获取其他用户资料,getProfile(user_token, count)
评估匹配程度,rateProfile(user_token, profileRating)
三、high level design
系统的整体设计如上图,用户通过网络连接到服务器,之后是用户注册服务,与之同时出现的是短信服务(验证码),注册完成后进入个人资料服务,可以对个人资料进行修改,上传照片等,之后是推荐服务用来获得推荐用户,之后使用左滑右滑服务来判断是否喜欢。最后是聊天服务,在聊天服务和左右滑服务需要系统来推送通知。
四、细节描述——如何存储用户图片
存储用户图片有以下几种方式:
- 和用户信息存储在数据库里:容易实现,灵活的增删改查,缺点是可扩展性差,图片难以存储在数据库中,读写开销很大
- 存储在同一个表里
- 存储在不同表里,使用用户ID作为键
- 存储在文件系统里:无需再数据库中存放大的文件,只需存储文件路径,缺点是增删改查无法仅通过数据库实现,当文件过多时读写速度变慢
- 存储在对象存储服务中:可扩展性好