本篇主要讲述在进行FCS开发过程中如何使用多个视频服务器来做集群服务和负载均衡处理。 在FCS的应用过程中,带宽消耗是一个很严重也是很现实的问题,好的解决方法就使用多个服务器进行负载均衡,也就是说使用服务器集群技术。 有三种服务器集群的方案: 1 使用专门的主服务器来连接多个子服务器
 2 每台服务器既可以作为主服务器也可以充当子服务器
 3 每台服务器都作为主服务器

那么到底哪种方式最好呢?这取决与你所做的应用,每种方式都可以满足各自不同的需要。 根据FCS应用程序的架构和流媒体的特性,为了最低限度的减少数据丢失以及数据同步问题,第三种方案不失为一种好的方案。 举个例子,假如你有个应用程序同时有1000在线用户需要连接FCS服务,而你每台服务器的带宽仅仅能够满足500个用户的需求,或许你会说为什么不用单独一台服务器来作负载均衡控制,答案很简单:多余。况且让我们设想一下,如果哪天这台服务器想要休息一下,那么你的应用会怎么样? 因此,为了安全起见,使用多个主服务器的方式最适合,至少不会发生上面所说的问题。 集群方式确定了,那么在开发过程中如何使用呢? 也有两种方式,取决你所做的应用: 1、在不同服务器之间同步 2、不同服务器之间不进行同步(严格的说不能说是集群技术) 其实两种方式的差异不用说也知道,但如果只是想减轻带宽负荷,并不想在多个服务器之间保持数据一致就可以采用第二种方式。 关于第一种方式,Jake Hilton给出了比较好的解决方式,在此也不多说,简单说明下。原理就是在进行服务器连接、发布和设置操作的时候循环对每个在线的服务器进行操作。 例如:
- //serverArray 是连接服务器数组
for(var i in serverArray){ this['nc'+i] = new NetConnection(); this['nc'+i].connect(serverArrayIn[i]); this['nc'+i].onStatus = function(objIn){ _self.ncStatus(objIn) }; liveServers.push(i);
-
-
-
-
-
- }
在onStatus方法中会检查在线服务器,调用pingBack方法得到liveServers的值。 在应用程序的Main.asc文件中添加如下代码:
- Client.prototype.serverPing=function(srvId){
'serverId':srvId,'serverName':application.hostname }; Client.prototype.setSoObject=function(soName){ setUpSharedObject(soName); Client.prototype.getSoValue=function(soName,propName){ soName).getProperty(propName); Client.prototype.setSoValue=function(){ //soName,propName,propVal eval(arguments[0]).setProperty(arguments[1],arguments[2]); setUpSharedObject (soName) { this[soName]){ trace('setting up shared object '+soName); this[soName]=SharedObject.get(soName,true);
- return {
- }
-
-
- }
-
- return eval(
- }
-
-
- }
- function
- if(!
-
-
- }
- }
把Main.asc文件放到你的FCS应用程序目录下面后重启应用。
客户端测试代码示例:
- import com.sitename.MultiConnection
= new MultiConnection(); mc.connect(['rtmp://server1.com/test','rtmp://server2.com/test']); mc.onStatus = function(objIn){ trace(objIn.code); objIn.code == 'NetConnection.Setup.Success'){ mc.sharedObjectSetup ('info_so',true); mc.setNetStreams(); myMic = Microphone.get(); mc.attachAudio(myMic); mc.nsStatus=function(objIn){ trace(objIn.code); mc.publish ('webCastName','live'); mc.info_so_sync = function(){ trace('so synced');
- mc
-
-
-
- if(
-
-
-
-
-
-
- }
-
- }
- }
-
-
- }
代码连接多个服务器,并且在每个服务器上创建共享对象info_so,并且通过info_so_sync 方法来同步。
下载 完整的类和示例程序
第二种方法就更简单了,把实现思路说明一下。 在客户端判断不同的聊天室或者不同的用户ID,转向不同的FCS服务器。服务器端代码不需要任何修改,客户端只需做一个引导程序~
|