admin 管理员组

文章数量: 1087581

登录排队服务器QueueServer

最近得到了一个某趣Plus公司面试的机会,面试过程应该属于他们认可能接收的程度,工作经验也对口

面试完之后,他们说公司是有个惯例,出一个编程题,然后要求自己回去完成把代码发给他们

题目如下:

在面试后请候选人用GoLang完成编程作业: * 问题描述:新游戏在开服后往往会有瞬时大量用户登录涌入的高峰流量,对服务器产生压力。* 解决方案:开发开服排队系统,对到达服务器的大量用户进行队列缓冲,名为QueueService,根据服务器压力情况,逐步让队列中的用户拿到登录服务器的令牌(token),代表该用户请求可以被处理了,从而缓解登录高峰,排队中用户要能够“实时”知道自己在队伍中的位置变更。* 开发要求:线下,无时间限制
* 交付:* 服务器QueueService:要求使用GoLang编写, 使用channel, 使用tcp长连接通信. 要求按照工业级代码标准开发, 比如高并发下吞吐瓶颈是否合理, 各种边界处理是否完备, 在系统发生错误时进程是否健壮* 客户端:对QueueService发起请求, 并对队列进行实时监控。要求使用GoLang编写, 使用tcp长连接通信* 文档:说明怎样部署和运行, 如何进行压测, 最好有完整压测数据(QPS, RTT, CPU, Mem等)

我花费了三天的时间,完成了这个项目,这中间还一度失眠没睡好
发给他们后一直没反馈,我主动问了才给了反馈

面试官反馈是觉得golang你不是很熟悉,参考的go代码库选的不对,整体行文没有做到分层和结构化, 同时tcp连接用的别人写的库,题目里我们是强调自己管理tcp连接的。

看到这个结果对我还是有点受打击和气愤的

  • golang不熟悉:之前工作中主要是用C++,但对golang深入学习过(源代码层),用golang只写过小项目,面试的时候我透露了这一点,目前这个小项目上能体现出好不好,我也不好判断
  • 代码库选的不对:这个… 我无法接受,选用的gnet开源库是经过测试验证的,接口易使用易理解,且内置了ants协程池,官方甚至还附带了使用gnet作为底层网络服务的公司(腾讯、小米、百度、360)
  • 整体行文没有做到分层和结构化:这个就抽象了,怎么说都有理,项目中功能基本都封装成模块了(msg,sequence,queue,conn,client),相互耦合度的并不高,不知道这样一个小的项目还能做出什么高度的分层和结构化
  • 那个tcp连接要求自己管理:在题目要求中,我是真心的没找到这么一条

辛苦了两天多,就用这几句没有所以然的话打发了,挺操蛋的,这也是我气愤的地方

当然工作都是双向选择的,人家不选择你也没有必要灰心,小小的总结下:人在江湖飘,岂能不挨刀,万事顺其道,所以不要太计较,今日记录到此,此事翻篇

这里就把项目原封不动的上传下,以便以后自己重新评估下
代码中没有加入过多的概念,尽量保持足够的简洁高效,但使用了一些已封装的goroute池子的概念,并以此封装了一个sequence来顺序执行,保证数据多协程安全访问

代码下载地址

CSDN下载地址
github下载地址

本文标签: 登录排队服务器QueueServer