Lua
5 篇又溢出了
海外上线了,首日无事故,总算平平安安。最近抓了个黑产,发现又是熟悉的溢出, 和旧文如出一辙 ,真是尴尬 这次遭殃的是交易行,也是利用相乘后,一个巨大的数量变成一个小的消耗,刚刚好可以负担得起,于是他就上架了庞大数量的虚拟货币(153722867280914*120000),一直卖一直拿钱 …… 同样的,检查的地方也只是不让负数通过,没有留意到上限,哎,十分尴尬 问了下其他项目,似乎也没有通用校验的,有点囧 rz 先写个通用校验函数吧
海外上线了,首日无事故,总算平平安安。最近抓了个黑产,发现又是熟悉的溢出, 和旧文如出一辙 ,真是尴尬 这次遭殃的是交易行,也是利用相乘后,一个巨大的数量变成一个小的消耗,刚刚好可以负担得起,于是他就上架了庞大数量的虚拟货币(153722867280914*120000),一直卖一直拿钱 …… 同样的,检查的地方也只是不让负数通过,没有留意到上限,哎,十分尴尬 问了下其他项目,似乎也没有通用校验的,有点囧 rz 先写个通用校验函数吧
项目上线啦
历时 3 年半,项目终于上线啦,打开 tig 翻到仓库的开头,看看提交历史,还是有点感慨的,实在没想到要花这么久。简单聊点线上问题吧 这次上线最刺激的是,开服前半小时,发现昨晚压测的服务器崩掉了,原因是聊天服务内存太大导致 OOM。于是用 memlimit 紧急止血,出问题的方法挂到模块上方便后续线上热更,然后打包,重启,紧赶慢赶在开服前几分钟搞完,提前开服错峰。真的非常非常刺激,当然,线上也没有出现这个问题,我们压测的例子相对比较极端,一大堆人每 30 秒集体跳场景,注册场景聊天的地方又做了锁 …
历时 3 年半,项目终于上线啦,打开 tig 翻到仓库的开头,看看提交历史,还是有点感慨的,实在没想到要花这么久。简单聊点线上问题吧 这次上线最刺激的是,开服前半小时,发现昨晚压测的服务器崩掉了,原因是聊天服务内存太大导致 OOM。于是用 memlimit 紧急止血,出问题的方法挂到模块上方便后续线上热更,然后打包,重启,紧赶慢赶在开服前几分钟搞完,提前开服错峰。真的非常非常刺激,当然,线上也没有出现这个问题,我们压测的例子相对比较极端,一大堆人每 30 秒集体跳场景,注册场景聊天的地方又做了锁 …
代码扫描
最近犯了一个很蠢的错,Code Review 的时候觉得非常丢人,决心不再犯第二次了,同样的错误不再犯第二次,才能不断进步XD 于是写了个小工具来检查。但是实际跑起来,才发现 Lua 这里设计得不太好,留下了一个合法但很容易犯错的坑 具体错误非常简单,就是 for _,item in ipairs(seq) 写成了 for item in ipairs(seq)。而且由于 seq 里的值某些情况下会包含 1,2,3... 的序列,所以还不容易发现异常。花了一点时间写了个扫描器,主要还是调一个正则 …
最近犯了一个很蠢的错,Code Review 的时候觉得非常丢人,决心不再犯第二次了,同样的错误不再犯第二次,才能不断进步XD 于是写了个小工具来检查。但是实际跑起来,才发现 Lua 这里设计得不太好,留下了一个合法但很容易犯错的坑 具体错误非常简单,就是 for _,item in ipairs(seq) 写成了 for item in ipairs(seq)。而且由于 seq 里的值某些情况下会包含 1,2,3... 的序列,所以还不容易发现异常。花了一点时间写了个扫描器,主要还是调一个正则 …
Lua54 兼容性
最近在搞迁移,准备将项目依赖的 Lua 5.3 迁移到 5.4 上面去,先翻译一下手册的第八章,强迫自己读完, 原文地址 这里我们列出了从 Lua 5.3 迁移到 Lua 5.4 可能会遇到的兼容性问题 你可以通过设置参数重新编译 Lua(详情参考 luaconf.h),来避免其中的一些兼容性问题。但是,所有兼容选项都会在未来被移除掉。当这些选项被移除时,兼容性问题就会暴露出来。所以,当你有机会的时候,你应该尝试用没打开任何兼容选项的 Lua,来测试你的代码。这样会让迁移到新版本 Lua 的过程 …
最近在搞迁移,准备将项目依赖的 Lua 5.3 迁移到 5.4 上面去,先翻译一下手册的第八章,强迫自己读完, 原文地址 这里我们列出了从 Lua 5.3 迁移到 Lua 5.4 可能会遇到的兼容性问题 你可以通过设置参数重新编译 Lua(详情参考 luaconf.h),来避免其中的一些兼容性问题。但是,所有兼容选项都会在未来被移除掉。当这些选项被移除时,兼容性问题就会暴露出来。所以,当你有机会的时候,你应该尝试用没打开任何兼容选项的 Lua,来测试你的代码。这样会让迁移到新版本 Lua 的过程 …
skynet 中隐藏的单点服务 : Harbor
昨晚和同事一起看 skynet 的代码,对于 skynet 实现的按名字发送消息比较好奇,走读了一下代码,特意写篇文章记录一下 Skynet 服务间通信,比较常用的是 skynet.send,该接口在 skynet/lualib/skynet.lua 中,实现则是 skynet.core 模块的 send 方法。skynet.core 是 skynet 提供给 lua 的一个 so,代码在 skynet/lualib-src/lua-skynet.c,它用了一个巧妙的注册办法 …
昨晚和同事一起看 skynet 的代码,对于 skynet 实现的按名字发送消息比较好奇,走读了一下代码,特意写篇文章记录一下 Skynet 服务间通信,比较常用的是 skynet.send,该接口在 skynet/lualib/skynet.lua 中,实现则是 skynet.core 模块的 send 方法。skynet.core 是 skynet 提供给 lua 的一个 so,代码在 skynet/lualib-src/lua-skynet.c,它用了一个巧妙的注册办法 …