第一次用 ruby 开发客户端的 api,总感觉复用性不高,性能也不好。如何能达到比较好的效果?求经验!
#5 楼 @lytsingsun 先说几点个人建议吧: 1、返回 json 数据,最好外面包一层校验,能让客户端快速知道,这数据合不合法、是否有错; 2、代码复用方面,主要看你项目的实际情况; 3、最好是能给客户端进行充分的沟通,怎么让双方都正规还方便; 4、性能方面,不外乎负载均衡、上缓存、数据库读写分离、代码优化; 。。。
以下是个人的一点 IOS GAME SERVER 开发经验,欢迎指正(以下客户端简称为 C 端,服务端简称为 S 端):
1、controller 级参数 validate。参数是否不可缺失,合法性,合理性,结合自己维护的一套错误信息编号,返回给 C 端。这里之所以没有采用 model 层的 validate,个人的看法是,在 model 层的操作之前会有很多逻辑需要处理,关联较多,validate 越早越好,一层层过滤不合法的请求。
2、C 端大多是导步的,就是发了这个请求之后,他就一边玩儿去了,并没有守在这里等这个请求返回结果。所以你返回给 C 端的 JSON 里面,有必要指出这个 JSON 对应的是哪个请求。 这里我采用的是
render :json => { action_name => ... }
这种方式,当然,如果有更好的方式,可以@我。
如果用这种方式,那就需要注意
(1)、所有 action_name 保持唯一 (2)、routes 里 post、get 后面的'xxx'需要与 action_name 保持一致。
3、所有敏感数据自己维护一套常量,特别是可变数字,尽量不要通过参数的形式传递。我做 server 端的过程中,从来不信任 C 端发过来的可变数字。可能这是病吧,总担心如果有人模拟请求,会带来意外的灾难。另外如果实在逼不得已,需要采用参数里面的可变数字,那做减法之前,别忘了事先.abs 一下,许多无聊的人,会试探你的请求,然后模拟,如果你减法不做 abs,so,那个被减的对象遇到一个负数的参数的时候,他就变成加法了,越减越多。
4、如果有许多 C 端和 S 端都会用到许多常量,那请认真构思一下你的常量系统。以哪种类型作为常量的载体,常量如何载入 S 端,C 端如何动态增量更新 S 端已有常量数据。
5、如果你的 C 端是游戏产品,那么你还有必要考虑一下 S 端数据的虚拟化、实体化的问题。 如:一个角色可能会有许许多多,几十上百件装备,如果这些装备都处于未使用也未被强化提升的等级,如:1 级,那么我认为,这几十上百件装备对于 S 端来讲,都是不存在的。我们只需要给这个角色的装备库里存上几十上百个装备类型,如:101001,201001 等,用来代表这个角色拥有这些装备类型的最低等级的装备。
其他就暂时没有想到了。欢迎指正,补充。