妥善的处理重试请求

前言

  手机游戏项目中,由于用户在很多时间使用的是移动网络,和服务器连接不稳定在所难免。客户端发送给服务端的请求没接收到应答,也是经常碰到的情况。
  同样是没有接收到应答,是因为服务端未接收到请求,还是发送应答给客户端失败,客户端很难区分。对客户端来说,这两种情况几乎没有什么分别。
  这会带来一个问题:客户端在无法接收到应答的时候,是否发送重试请求?
  如果是因为服务端没收到请求造成的无应答,那么发送重试请求并没有什么问题。但如果是因为服务端发送应答给客户端失败造成的无应答,那么发送重试请求,会让服务端重复处理已处理过的请求。
  如果只是强化、升级这种请求,重复处理请求也许问题也不是太大。但如果是购买、消费这种请求,重复消费恐怕会引起玩家的重度不适,收到很多吐槽和投诉。

查看更多

评论

需要“局部变量化”全局函数么?

前言

  在很多的 Lua 语言相关的著作中都强调,在代码头部将代码里使用到的全局函数或者全局库局部变量化,将大大提升代码的执行效率。
  举个栗子,Roberto Ierusalimschy《Lua Programming Gems》 的第二章 Lua Performance Tips 提到:   

  除了一些明显的地方外,另有几处也可使用局部变量,可以助你挤出更多的性能。比如,如果在很长的循环里调用函数,可以先将这个函数赋值给一个局部变量。这个代码:

1
2
3
for i = 1, 1000000 do
local x = math.sin(i)
end

比如下代码慢 30%:

1
2
3
4
local sin = math.sin
for i = 1, 1000000 do
local x = sin(i)
end

查看更多

评论

巧设 Openresty 包含路径

路径的难题

  我在之前的一篇文章中提到,关于 OpenResty 中的文件包含路径,是个值得注意的问题。
  OpenResty 仅会将它自己的 lualib 目录加入 package.pathpackage.cpath,我们的项目目录需要自己处理。
  最初我曾经试过将 项目目录加入到 package.pathpackage.cpath 中,确实达到了目的。
  但在 nginx 上配置了第二个 server 并将它的目录也加入包含路径之后,由于 lua_code_cache 的存在,不同 server 间的相同相对路径的文件的缓存会互相冲突,导致 require 可能不能加载正确的文件。  

巧妙的方案

  其实解决方案来自 PHP 中 autoload 的启发,我使用了一些 nginx 配置和一个单独的函数用来加载项目中的文件。

查看更多

评论

关于 netstat 命令

使用 netstat

  netstat 命令是 linux 下一个非常有用的命令,顾名思义,其作用是查询当前的网络状态。

  以最常用的查询 TCP 连接状态为例,在 Shell 里运行以下命令:

1
netstat -an | awk '/tcp/ {print $6}' | sort | uniq -c

  你会看到当前所有 TCP 连接的状态计数:

屏幕快照

查看更多

评论

正直帝的传奇经历

  事情终于告一段落了,暮然回首,感觉还是很有必要写个日志,把我的光辉形象记录下来。

  我有一张中行的美元单标信用卡,绑定了支付宝的快捷支付,可以在淘宝消费,但一直不能用支付宝还款,我每月都测试下,期待能够有一天,可以用支付宝还款。
  2014年2月18日11点左右,我像往常一样,用支付宝向那张中行卡还款1元,过了半小时,还是和往常一样,支付宝告诉我还款失败了。

查看更多

评论

为宝宝在德国海淘奶粉

前言

  国内奶粉的质量让人感到担忧,初为奶爸的我,花了大量的时间,查询各种资料,只为了给宝宝淘到放心的口粮。其中艰辛不谈,将经验和大家分享一下,希望能够对奶爸奶妈有些帮助。

奶粉的选择

  这个问题见仁见智,欧洲和美国得品牌还是值得信赖的。在这些品牌里排除受新西兰事件影响的,再按知名度排列一下,各位奶爸奶妈心里多少也都有了个大概想法。
  结合众多网站奶爸奶妈的经验总结,以及各种亦真亦假的研究报告,我最终选择的是 爱他美Aptamil),德国的高端奶粉品牌,号称最接近母乳。

查看更多

评论

关于 OpenResty 的两三事

基础原理

  Nginx 采用的是 master-worker 模型,一个 master 进程管理多个 worker 进程,基本的事件处理都是放在 woker 中,master 负责一些全局初始化,以及对 worker 的管理。
  每个 woker 使用一个 LuaVM,当请求被分配到 woker 时,将在这个 LuaVM 里创建一个 coroutine。协程之间数据隔离,每个协程具有独立的全局变量 _G

关于 lua_code_cache

  关闭 lua_code_cache 时,require 的处理方式是每次都强制重新加载和解析,也就是说,你对代码的任何修改的效果,都将在上传后立即体现。

查看更多

评论

忆往昔

博维尔

  2005年,我加入了一家位于武汉光谷的小公司,这也是我就职的第一个正式的互联网公司。我们预备做一个门户网站,目标用户是一线城市的小区业主。以小区为基本单位,集合博客、二手交易、论坛、活动等各种功能。但很遗憾的是,公司由于资金问题在2006年解散了。
  在博维尔的一年,我学到了很多。还记得最高兴的一件事,是因为在几个同事中,工作完成的最快最好,奖励了我一个电风扇。想起来那时真是无忧无虑啊,只知道撸起袖子干活,啥都不用想。

查看更多

评论