苏州 DAYU 51 区 - 游戏服务端 一轮面试
1 游戏中付费改名系统的步骤
- 在设置中添加“改名”按钮
- 权限验证:如有等级或时间限制(新手期不能改名),需提前验证
- 费用验证
- 检查用户的货币余额
- 不足:提示充值,中止流程
- 足够:进一步
- 检查用户的货币余额
- 输入新名称
- 名称规则校验
- 长度限制,例如2-12字符
- 非法字符过滤,例如空格、逗号
- 敏感词检测,调用敏感字库过滤违规内容
- 防欺诈规则等,例如“管理员”、“GM_”等内容
- 其他敏感词
- 名称规则校验
- 名称唯一性检查
- 查询数据库检查名称是否存在
- 已存在,返回输入步骤。(若游戏分服,则按服务器检查唯一性)
- 名称可用:下一步
- 扣除费用
- 原子化操作:使用事务保证扣除货币与改名操作,避免数据不一致
- 记录消费日志:保存扣款记录,用于对账或退款
- 更新名称
- 数据库更新:将用户字段修改为新值
- 缓存刷新/数据同步:更新缓存中的用户信息,例如(排行榜、好友、工会名单)等。
- 日志与通知
- 操作日志:记录旧名称、新名称、时间、消耗货币等
- 用户反馈:提示“改名成功”,并显示新名称
- 系统通知:通过邮件或消息推送确认用户操作
- 附加功能设计
- 冷却时间:设置改名间隔(如7天),防止滥用。(更名对服务器资源消耗比较大)
- 客户端校验名称时的防抖、延迟、异步等。
- 改名费用的递增
游戏付费更名题反思:
题目简单,当题目简单时,要注意实现时的细节和完整性。本次面试作答时省略了字符校验和日志输出问题。
应当作答但未能作答的内容:[扣费的合理性、字符校验、日志打印、更名后的缓存刷新]
考察:候选人临场思考的全面与逻辑性。
2 TCP
3 HTTP
小结:HTTP & TCP
层次关系:TCP 位于传输层,而 HTTP 位于应用层。HTTP 依赖于 TCP 提供的可靠传输服务来实现数据的传输。当客户端发送 HTTP 请求时,实际上是将 HTTP 数据封装在 TCP 数据包中进行传输;服务器接收到 TCP 数据包后,再从中解析出 HTTP 数据进行处理。
工作流程:客户端和服务器之间首先通过三次握手建立 TCP 连接,然后客户端通过该连接发送 HTTP 请求,服务器接收到请求后进行处理,并通过个相同的 TCP 连接返回 HTTP 响应,最后四次挥手关闭 TCP 连接(除非使用持久连接)。
4 WebSocket
小结:HTTP & WebSocket
联系
- 都基于TCP协议:HTTP和WebSocket都是建立在 TCP 之上的应用层协议,都依赖TCP提供的可靠数据传输服务。
- WebSocket握手基于HTTP:在建立WebSocket连接之前,客户端和服务器需要进行一次握手过程,这个握手过程是通过HTTP请求和响应来完成的。客户端发送一个带有特定头部信息的HTTP请求,服务器收到请求后,检查请求是否有效,决定是否同意升级。如果服务器同意,则返回一个带有状态码
101 Switching Protocols
的响应,表示协议从HTTP升级到WebSocket。协议升级完成后,通信方式就从HTTP切换为WebSocket,建立起了双向、持久的通信通道。 - 共享同一个端口:WebSocket和HTTP通常共享同一个端口,默认情况下,HTTP使用80端口进行非加密通信,HTTPS使用443端口进行加密通信,而WebSocket也可以通过80端口(非加密,
ws://
)或443端口(加密,wss://
)进行通信。这使得在同一个服务器上可以同时支持HTTP和WebSocket服务,方便用户通过同一个通信接口进行访问。 - 都可以在网络中传输数据:HTTP和WebSocket的主要功能都是在客户端和服务器之间传输数据,虽然它们的数据传输方式和应用场景有所不同,但都可以用于在网络中传递各种类型的数据,如文本、图像、音频、视频等。
区别
- 通信模式:HTTP使用请求-响应模式,客户端发送请求,服务器处理后返回响应,每次交互完成后,连接通常会关闭。WebSocket支持全双工通信,一旦连接建立,客户端和服务器可以双向持续传输数据,直到连接被关闭。
- 连接状态:HTTP协议是无状态的,即服务器不保存任何关于客户端的信息,每个请求都是独立的,不与之前或之后的请求相关联。WebSocket协议则通过建立持久连接,使得服务器可以持续跟踪和与客户端进行通信。
- 数据传输:HTTP数据在每个请求和响应中进行传输,通常附带大量的头部信息,通信的开销较大。WebSocket数据通过较小的帧(frames)传输,减少了通信开销,数据可以是文本或二进制格式。
- 效率:HTTP每次通信都有额外的连接开销,延迟相对较高。WebSocket建立连接后保持长时间不关闭,通信效率较高,适合需要频繁交互的应用。
- 使用场景:HTTP适用于单次请求-响应的场景,例如网页浏览、API调用等。WebSocket适合需要实时性的双向通信,如在线游戏、聊天、股票行情推送和权限即时控制等。
5 代码题
/**
* 获取一个数最近且更大的二次幂整数
* @param {number} num
* @example
* input:3 => output: 4
* input:4 => output: 4
* input:5 => output: 8
*/
function solution1(num) {
if(num < 1) return 1;
num--; // 先 -1 ,防止num本身就是2的幂被提升到更大的幂
num |= num >> 1; // 将最高位的1扩散到相邻低位
num |= num >> 2;
num |= num >> 4;
num |= num >> 8;
num |= num >> 16;
num |= num >> 32;
return num + 1;
}
function solution2(num) {
if (num < 1) return 1;
return Math.pow(2, Math.ceil(Math.log2(num)));
}
function solution3(num) {
let power = 1;
while (power < num) {
power *= 2;
}
return power;
}
6 联合主键的情况下,按主键的单个字段搜索
联合主键和普通的复合索引无太大差别,也遵循最左匹配原则。
如果是按照主键的第一个字段进行搜索,则不需要添加索引;如果是第二个字段,则需要添加索引提高查询效率。
7 如何判断两个时间戳在同一天
return a / (24*60*60*1000) == b / (24*60*60*1000);
8 反问
如果加入团队,您希望我在前3个月重点解决什么问题?
如果有幸加入,需要提前做哪些准备?
如果有幸加入,下一轮面试比较看重什么能力?
当前团队负责的核心业务场景是什么?Node.js在其中承担的主要职责(如API开发、中间件、高并发处理等)?
您认为这个岗位的理想候选人需要具备哪些核心能力?
如何