记今天域名和GWF的问题

2015年8月31日晚上8点整,GM反馈有海外玩家无法登陆游戏了。

最终排查后的结果:

域名被GWF给墙了 -.-!!

客户端中只使用了域名取一个配置文件,配置文件中存有各个服务器的真实IP之类的数据。

这个域名无法访问后,直接导致客户端在第一步直接卡掉进不去。

暂时的临时解决方法是使用dns智能解析,将海外用户dns解析至一台海外服务器上,暂时避免掉这个问题,但不保证100%解决所有海外用户的问题,因为dns智能解析也会误判一些用户。

这里想了一下以后的对策:

1、客户端首先应该使用ip进行获得,ip比域名少了解析的一步,要快。

2、如果IP读取失败,则使用域名再进行访问,这样可以避免掉如果IP出现问题后,玩家无法正常玩游戏。

3、如果有条件,在第一步时可以准备两个IP,基本一个IP备用。最多2个IP一个域名基本上能100%的解决掉所有问题。

后记:2015.09.02 突然想起来:可以直接使用一个主IP,一个备用IP,还有域名,三个连接同时去访问,最早返回的并且成功的数据取过来用。这样也可以实现起来更简单一些,而且比上面串行的被动等超时,要好很多。唯一需要确认的是:手机是否支持同时发出多条http请求。

springloaded开发过程中节省大量时间

之前开发中如果要修改代码,不需要重启直接生效,需要在eclipse中的debug模式下。

但是依旧受到很多限制,不能增加/删除/修改方法和属性等。

今天上spring.io,又看到了springloaded,感觉这东西经过一年应该很完善了,试了一下,惊为神器啊。

如下图:springloaded包放在工程中。

然后配置环境:

在debug环境加,方法可以随意添加,新添加的方法中设置断点也不会出问题,和原来增加一个方法就要重启一遍相比,太强大了。

记一次redis数据修复

运维同学一不小心将redis数据清空了。

redis中大部分数据都不重要,只有一个排行榜数据,需要按排行榜名次发放奖励。

记下这次修复的方案:

grep 限时 moon30001-gold_2015-08-21.log | awk -F ' ' '{print $3}' | awk -F '(' '{print $1}' | sort | uniq -c | sort -n | awk -F ' ' '{print $1*20,$2}'

从log中取出所有分数及角色id.

redis-cli -p 7000 EVAL "local a=redis.call('zscore','shenJiang.score.20150821','506027'); if not a  then return redis.call('zadd','shenJiang.score.20150821','201440149466188','506027') end;return a" 0

使用lua脚本恢复排行榜数据。

关于游戏的登陆

今天有一个玩家提到,每次游戏断线后,再进入都需要重新输入帐号名和密码。非常麻烦。

这里我想到了一个关于玩家体验的问题:

玩家希望是的流畅的玩游戏,包含在开始游戏时,可以快速的进入。

断线后能不退游戏最好。如果实在不行,要走登陆流程,至少也要避免掉玩家输入帐号名和密码。

 

 

如何检测apk的签名是否正确

apk渠道众多,有的渠道会对签名进行二次签名。

这里就可能出现一个隐患,打出来的包可能因为不小心使用了错误的签名,会导致提交时被渠道打回。

针对这种情况我们可以在每次出包后,使用keytool查看一下签名指纹,指纹相同,签名也一定会相同。

可以做成工具来进行自动检查。

nginx根据ip进行转发

今天有这样一个需求:

http://xxxx/yyy

如果请求来自于某个特殊ip,则访问:

http://xxxx/yyyy_test

之前想的是nginx中的proxy很easy就可以实现,判断一下来源,进行转发。

类似于:

location /yyyy/ {
                if ( $remote_addr ~* "1.2.3.4" ){
                        proxy_pass http://127.0.0.1/yyyy_test;
                        break;
                }
        }

结果发现 yyyy_test uri的变动无法应用至 if 代码段:

nginx: [emerg] "proxy_pass" cannot have URI part in location given by regular expression, or inside named location, or inside "if" statement, or inside "limit_except" block in /opt/nginx/conf/nginx.conf:125

最终修改为如下:

另开一个81端口的server进行跳转一下

        location /moonsrc/ {
                if ( $remote_addr ~* "1.2.3.4" ){
                        proxy_pass http://127.0.0.1:81;
                        break;
                }
                if ( $http_x_forwarded_for ~* "1.2.3.4" ){
                        proxy_pass http://127.0.0.1:81;
                        break;
                }
        }
    }

    server {
        listen       81;
        server_name  abc.com;

        location / {
            root   html;
            index  index.html index.htm index.php;
                autoindex on;
        }

        location /yyyy/ {
                proxy_pass http://127.0.0.1:81/yyyy_test/;
        }

    }

ios上 “已购买此 App 内购买项目 此项目将免费恢复” 解决方案

参考文章:

http://www.cnblogs.com/meteoric_cry/p/4598304.html

原因应该是:订单因为各种原因,没有记录finishTransaction,导致的无法继续进行支付。

正确的解决方案应该是:

检测未处理订单,进行处理。

unity中使用seventzip老是出现OutOfMemoryException

项目组内有一台打包机,老是出错。

经常出现 OutOfMemoryExceptoin,百思不得其解。

今天再仔细推敲了代码后,发现原来的字典长度写的是 dictionary = 1 << 23;

修改为如下图后,没有再次出现过OutOfMemoryException。

linux 计算某一列数字的总和

awk ‘{print $1}’ | awk ‘{sum+=$1}END{print sum}’

批量操作redis中的 key

批量操作redis中的 keys的方法:

1.统计个数:

redis中名称含有OMP_OFFLINE的key的个数;

redis-cli keys “*OMP_OFFLINE*” | wc -l

2.批量删除

批量删除 0号数据库中名称含有OMP_OFFLINE的key:
redis-cli -n 0 keys “*OMP_OFFLINE*” | xargs redis-cli -n 0 del