Skip to content

Blog

[置顶] 随记

后续将自己记录在朋友圈、空间等平台上的经历记录在自己的网站上。

苏州 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适合需要实时性的双向通信,如在线游戏、聊天、股票行情推送和权限即时控制等。

4 代码题

/**
 * 获取一个数最近且更大的二次幂整数
 * @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;
}

5 联合主键的情况下,按主键的单个字段搜索

联合主键和普通的复合索引无太大差别,也遵循最左匹配原则

如果是按照主键的第一个字段进行搜索,则不需要添加索引;如果是第二个字段,则需要添加索引提高查询效率。

6 如何判断两个时间戳在同一天

return a / (24*60*60*1000L) == b / (24*60*60*1000L);

Blog support just landed

Hey there! You're looking at our new blog, built with the brand new [built-in blog plugin]. With this plugin, you can easily build a blog alongside your documentation or standalone.

Proper support for blogging, as requested by many users over the past few years, was something that was desperately missing from Material for MkDocs' feature set. While everybody agreed that blogging support was a blind spot, it was not obvious whether MkDocs could be extended in a way to allow for blogging as we know it from [Jekyll] and friends. The [built-in blog plugin] proves that it is, after all, possible to build a blogging engine on top of MkDocs, in order to create a technical blog alongside your documentation, or as the main thing.