我们的登录服务描述如下: 首先游戏服把登录消息推送到redis,我这边使用node开启了一个服务不停的从redis拉取登录消息,然后调用MySQL操作做验证。验证通过后把登录消息广播出去。。做压测的时候发现性能不好,分析发现从redis中取数据很快,而MySQL的异步处理很慢,大量SQL处理阻塞。。MySQL连接池10个,确认操作完之后释放了链接。。。不知道大神们有什么好的解决问题的方法。说出来大家讨论讨论。。
来自酷炫的 CNodeMD
有没有那个兄弟能帮我分析下啊。。不胜感谢。。
来自酷炫的 CNodeMD
你既然是从redis取了,能不能取一批再查询?
@captainblue2013 现在就是改成了,取一批然后做操作。但是好像性能也没有什么提升。。真不知道怎么搞了。。
性能差到什么程度,是在哪个步骤出现瓶颈?消息广播是不是瓶颈?
先优化业务,逻辑,最后再考虑技术优化。。。。
@coordcn 单进程情况下,每条处理请求400多。看了下主要是mysql处理操作堆积。。导致消息广播变慢
@i5ting 狼叔。。业务逻辑已经做了优化了。。。现在就是考虑这种技术是不是不行。。还是什么请他原因。。求狼叔给提点建议啊。。
@weierbufan 先测试MySQL看看吧,混在一起是没法确定的瓶颈的
本来你这样做就奇奇怪怪的
@captainblue2013 上面老大决定的。。本来一次登录,现在多加了两次网络IO。。那您有没有更好的解决办法呢???在做登录服务这块
@weierbufan 登录这块不要和你的核心一起,抽出来,随便他慢慢登,登进来了再进你的主业务。
然后一门心思优化那个登录服务就行了
首先你要有压力测试的数据,
你的性能瓶颈明显是mysql 连接查询压力导致的;可以做mysql集群主从等;提高qps
缓存三部曲,
- 第一步 整个执行流程都用的不变的数据尽量取出来,放在内存变量中,只需要从 资源(缓存,或者数据库,文件)一次就可以了; node可以使用Buffer
- 第二步 缓存(redis,memcach)
- 第三步 数据库,文件,网络资源 (集群优化,数据库主从;)
或者是分布式多实例服务 多服务器等; mysql一般并发相应很少的;
另外一点。你从mysql取出验证的时候,也放在缓存一份,根据token做为key下一次验证不也就从缓存验证了吗;缓存记得都加上 expire延时时间设置; 延时多少根据自己需求来;这样能快不少吧