通常我们使用nginx来做http的负载,今天我通过试验发现,nginx默认是支持AMF协议的.不得不赞一个!
通常我们在flash客户端中负载的话是修改remoting service的gateway地址,比如有2个服务,部署于game1.xxx.com 和 game2.xxx.com 那么flash中AS的网关调用写法就是调用 http://game1.xxx.com/gateway.aspx 或者 http://game2.xxx.com/gateway.aspx
这样做,负载就很麻烦,域名改来改去的,还得在服务器aspx中自己写负载逻辑.那么如果用nginx集中进行负载的话,就好办了.我直接上nginx.conf
server {
listen 80;
server_name center.xxx.com;
location / {
if ($query_string = "id=game2") {
proxy_pass http://game2.xxx.com;
}
if ($query_string = "id=game") {
proxy_pass http://game.xxx.com;
}
}
嘿嘿.这样一来,flash AS就简单了 直接改成
http://center.xxx.com/gateway.aspx?id=game2
http://center.xxx.com/gateway.aspx?id=game
这样nginx后端的2台应用服务器就被隐藏了,同时负载由nginx的upstream控制,相当轻松.!
PS:linux版本的nginx比windows版本的nginx性能和速度快很多的.windows上负载的话,不推荐这个方案了,推荐用porttunnel做端口映射.
另外,我解释下marcomedia AMF协议,这个协议,本质上,我们从HTTP协议的角度去分析,会发现它就是一个POST数据,通常情况下POST可以POST文件,也就可以传输二进制流数据,那么AMF实际上就是MM自己搞的一套对象封送协议,类似webservice的SOAP,但是不兼容.原理是相同的,也即是序列化之后的对象封送,所以MM才给这个机制取了个名字叫做 flash remoting , 也就是这个道理.OOP的必然发展产物.因此,nginx针对post负载就行了.那么另一方面,性能略低于GET方式提交数据的方式,主要因为有个反序列化的过程.但是安全性,自由性,数据容错性相对GET高的多.