Skip to content

苏州 DAYU 51 区 - 游戏服务端 一轮面试

1 游戏中付费改名系统的步骤

  1. 在设置中添加“改名”按钮
    1. 权限验证:如有等级或时间限制(新手期不能改名),需提前验证
  2. 费用验证
    1. 检查用户的货币余额
      1. 不足:提示充值,中止流程
      2. 足够:进一步
  3. 输入新名称
    1. 名称规则校验
      1. 长度限制,例如2-12字符
      2. 非法字符过滤,例如空格、逗号
      3. 敏感词检测,调用敏感字库过滤违规内容
        1. 防欺诈规则等,例如“管理员”、“GM_”等内容
        2. 其他敏感词
  4. 名称唯一性检查
    1. 查询数据库检查名称是否存在
    2. 已存在,返回输入步骤。(若游戏分服,则按服务器检查唯一性)
    3. 名称可用:下一步
  5. 扣除费用
    1. 原子化操作:使用事务保证扣除货币与改名操作,避免数据不一致
    2. 记录消费日志:保存扣款记录,用于对账或退款
  6. 更新名称
    1. 数据库更新:将用户字段修改为新值
    2. 缓存刷新/数据同步:更新缓存中的用户信息,例如(排行榜、好友、工会名单)等。
  7. 日志与通知
    1. 操作日志:记录旧名称、新名称、时间、消耗货币等
    2. 用户反馈:提示“改名成功”,并显示新名称
    3. 系统通知:通过邮件或消息推送确认用户操作
  8. 附加功能设计
    1. 冷却时间:设置改名间隔(如7天),防止滥用。(更名对服务器资源消耗比较大)
    2. 客户端校验名称时的防抖、延迟、异步等。
    3. 改名费用的递增

游戏付费更名题反思:

题目简单,当题目简单时,要注意实现时的细节和完整性。本次面试作答时省略了字符校验和日志输出问题。

应当作答但未能作答的内容:[扣费的合理性、字符校验、日志打印、更名后的缓存刷新]

考察:候选人临场思考的全面与逻辑性。


TCP/IP和OSI

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开发、中间件、高并发处理等)?

您认为这个岗位的理想候选人需要具备哪些核心能力?

如何