/chestnut

Ju Yi Ge Li Zi

Primary LanguageJava

比赛题目

实现类似 facebook 中的 like 功能,需要:

  • 可以对一个对象(一条feed、文章、或者url)进行 like 操作,禁止 like 两次,第二次 like 返回错误码
  • 有 isLike 接口,返回参数指定的对象有没有被当前用户 like 过
  • 需要看到一个对象的 like 计数
  • 可以看到一个对象的 like 用户列表(类似 QQ 空间);
  • 上述列表加分项:Like优先显示我的好友列表(social list)。
  • 数据量:每天新增的 like 对象数为 1 千万,每秒 like 计数器查询量为 30 万次 / 秒。

数据量

  • 用户数量级1000万,好友数量级1000,正态分布
  • 3月3日提供测试数据集(纯文本格式),需要参赛人员自行导入到自己数据库
  • 3月4日提供比赛数据集(纯文本格式),需要测评前由参赛人员自行导入到自己数据库

技术选型:

  • 建议用关系数据库持久化,关系数据库可自行部署在主机上
  • 技术栈及编程语言不限制
  • 一共3台机器,如果使用云数据库RDS则比赛时候只能使用2台机
  • 部署方式不限
  • 分布式或单体应用不限

评选方法

  • 选手需要完成规定的 HTTP API
  • 评委使用统一的压测工具进行压测(自动适配 HTTP Keep-Alive)
  • 压测单台机器的 API,不能使用 Load balance 聚合多台机的 API 来作为比赛成绩,也就是说主要业务逻辑应在压测的机器完成,但是缓存、存储或者调用的微服务可以部署在其他服务器
  • 选手需要一定程度证明架构的线性扩展能力,比如压测3台服务器,应该可以得到压测1台x3的结果。
  • 选取 QPS 最高的前 5 人进入决赛,通过评委对架构打分决出最终成绩

奖励

性能挑战赛设置一二三等奖各一名。

评分标准

  • 性能分数 60 + 架构设计 40
  • 取所有评委平均分

评分展示环节

  1. 有架构设计文档或者方便评委理解的展示材料;
  2. RESTful 接口,压测数据;
  3. 最好有优缺点分析,说明权衡点;

接口及返回数据格式定义

server_ip/pcc?action=like|is_like|count|list&oid=xxx&uid=xxx 返回结果

action=like

{ "oid":1, "uid":1, "like_list":[{"1":"nickname"},{"2","Jerry"}]} like_list 返回当前对象的赞用户uid列表,只返回前 20 个用户即可1

action=is_like

{ "oid":1, "uid":2, "is_like":1 }

action=count

{ "oid":1, "count":1024 }

action=list&cursor=xxx&page_size=xxx&is_friend=1|0

page_size: 返回的列表长度[uint8] is_friend: 是否仅返回只是好友的uid列表 cursor: 起始位置[uint64],取上次返回结果的next_cursor { "oid":1, "like_list":[{"1":"nickname"},{"2","Jerry"}], "next_cursor":1234 }

错误码

业务层面出现错误,实现者也需要返回HTTP 200,在返回结果body里面输出error code error code 由实现方自行定义 如 { "error_code":501, "error_message":"object already been liked.", "oid":1, "uid":1 }

测试数据集格式定义

用户数据格式

uid为uint64 uid,nickname 1,Tom 2,Jerry

用户好友数据格式

uid, friend_id为uint64,只存在双向好友关系 uid,friend_id 1,2

对象Like列表数据格式

oid, uid为uint64 oid,like_uids 101:[1,2]

其他须知

  • like action,返回的列表中,只返回最近 20 个
  • 虚机的配置统一用 8 核 16G,通道机选择一个低配主机
  • 虚机副本策略统一选择同数据中心单副本
  • 压力测试是在内网压测,所以只要暴露内网端口就行,不需要负载均衡器,只需要一台 api 服务,只压一台
  • 主机系统盘默认20G 如果需要更多空间请自行挂载硬盘 https://docs.qingcloud.com/faq/index.html#id11
  • uid 等 int 默认都是 int64
  • 如果想在本地直接操作 vpc 内网机器,可以开启 vpn 然后接入 https://docs.qingcloud.com/guide/vpn.html
  • 下载软件包速度不理想,可以调高公网IP带宽或者使用国内镜像