设计一个网络应用程序,面向多用户的CS程序。
要求:
1.有多台服务器用户登录的时候根据各服务器的运行状况选择更佳的登录的服务器
2.假如A服务器上的用户发送了一条信息,其它服务器上的用户也能同时看到(即时通讯)
3.假如A服务器崩掉A服务器上的用户自动转向其它的多台服务器上服务端采用mina开发,但不知道怎样设计这个程序。哪位大虾有比较详细的解决方案没有,如果有每个步骤能详细点吗,有方案贴图更好?

解决方案 »

  1.   

    涉及网络通信的程序,都是比较复杂的,尤其是CS架构的,本身即时通信的框架就没听说几个。
    大致想了一下。
    首先,要弄清楚,通信的内容是什么?(文本消息、文件还是语音媒体数据)
        如果是文件,尽量不要用服务器来中转,没什么必要。
        如果是语音媒体,也尽量不中转。非要中转,那么,架设不同网络提供商之间的中转服务器即可。
        如果是文本信息,根据需求,中转不中转都可以。即使中转,一般文本信息的内容也不会持久化到数据库。
    其次,客户端程序,要求具备一些特殊的能力。
        比如,客户端要有一个监听端口,用于接收信息。
              通过监听端口对外(服务器)发送数据。(TCP打孔的时候,要用到该功能)
              多个服务器,负载能力的探测比较功能。(楼主的需求1)
    第三,楼主的需求,最简单的办法,可以使用集群来实现。这样开发简单。小用户量的情况下,足够用了。
        我大致提出了一个解决方案:
          服务器,分为三类服务器。(主服务器,从属服务器和数据库服务器)
          1.主服务器,一般不连接数据库,主要有三大功能:从属服务器缓存的数据微调、对从属服务器的监控以及客户端负载均衡的辅助实现。 必要时,可采用双机热备。
          2.从属服务器,主要有四个功能:缓存在线用户关系及套接字、TCP打孔(如果所有信息都由服务器转发,该功能可省略)、消息传输和主服务器的探测回馈(回馈包括负载状况、线程状况,缓存状况,用户量)。
            所有从属服务器都连接同一个数据库服务器,保证所有从属服务器的数据来源是唯一的,以数据库的数据为准。
            从服务器应用服务启动时,向主服务器进行注册。
            从服务器有用户发生异常状况时,更新数据库并通知给主服务器,由主服务器通知其他从服务器,从服务器对缓存数据进行微调。
            客户端登陆之前,先去主服务器获取最佳从属服务器的套接字,然后,再连接从属服务器。通信期间如果从属服务器发生故障,无法通信,则再次访问主服务器获得最佳从属服务器的套接字进行通信。注意,登陆验证,不由主服务器完成,由从服务器完成。
          3.数据库服务器,基本上只用于数据的持久化。
            必要时,使用双机热备。另外,可能有些需要注意的地方,如下:
        1.衡量服务器的负载状况,可以考虑通过 缓存使用量,持有用户量,CPU使用率来综合衡量,当然,简单点,就用持有用户量即可。
        2.需求2的实现。用户使用监听端口进行登陆请求,这样,从属服务器可以获得客户端程序的套接字(IP地址和Port),并更新数据库,通知主服务器微调各从属服务器缓存中在线用户信息。这样数据库中就会保存当前在线用户的套接字,其他从属服务器,可以通过数据库中获得该套接字,向客户端发送信息。
        3.缓存微调,只调整当前从属服务器的在线用户关系,如果新登陆的用户(或异常用户)不在该关系中,则不做缓存处理。
        4.对在线用户关系的解释。
            从属服务器持有经过它认证登陆的用户。那么,与这个用户相关的用户,就可以缓存到从属服务器中,比如,该用户的好友,群友什么的。这个要根据实际情况来调整。内存较少或者想扩大持有用户数的情况下,可以只缓存用户关系中,在线状态的那部分,不在线的不缓存。
        5.数据库的建表和操作。
            建表时要注意,尽量避免后期出现联合查询的情况,以及,合理创建索引加快查询速度。
            操作时要注意,大数据的检索当中,尽量能够避免排序操作。比如,20w用户按时间排序取前10个这样查询,是非常耗时的,这个操作,尽量能够通过从属服务器上的缓存来进行。
        6.缓存的实现。
            目前没有什么较好的办法,主要还是采用Map和List结合实现。
            数据的维护和管理要到位,否则会内存溢出。