对过去项目的总结--高并发处理篇

      高并发是指对单一应用的并发访问量非常大。基于此,现在的应用往往采取集群形式部署,并将web(jsp,action和服务接口)和服务(provider)分开架设在不同服务器上。并且provider不是均匀部署的,即每台服务器上的provider实际上是不一致的。
      注意:后文所指的应用均是指provider,在我们传统的mvc架构中即是业务逻辑层,对应的web层则是jsp和action层
      应用层的架设应是这样的结构。一个高并发的应用在后台会有多个集群服务器,用于部署应用。
     在应用启动时,每个provider会去向注册中心(register)主动注册。每个provider去注册的register是可以不一样的,从而每个register上的数据并不是一致的。register里有个类似于map的数据结构去记录provider和地址(url)的键值匹配。该数据结构的key值往往是protocol:url@user@password?service的形式。
      来自于client的访问,会带有register的地址,从而被路由到具体的register。由register通过命名查找路由到具体的应用服务器。需要注意的是在这一步,一个provider会对应多个应用服务器的地址,所以这时候第一步是查找到一个服务器地址List,然后通过负载均衡路由到具体的服务器。也就是负载均衡的过程。
      一.对于分布式应用,ha(高可访问性)是需要考虑重要要素:
      1.客户端会有守护线程对每个server做定时的心跳测试,如果服务器宕掉了就从注册中心下线。切上备用服务器。
      2.client对应用的调用如果失败,也会将该服务器从注册中心下线。
      二.对于调用失败的服务,会视规则做failover,failback或者其他操作。以failover举例,failover即在对应用server的调用失败后会重新做loadbalancer获取可用的server,反复数次。其他的规则不一一举例。
     
       在实现细节上:
       1.底层通过nio socket或者http等协议进行远程调用(即client对server的调用,即rpc)。远程调用的传输数据需包括provider即参数等业务数据,我们可称之为invocation或者request。可将这个过程类比于通常的jsp对servlet调用,jsp的表单数据以及消息头都被存放在request里传给servlet。假设我们的通信数据是invocation,则invocation必然是一个流化的数据。在传输的时候将其通过socket或者http甚至webservice(通信数据为xml报文)将其传输,之后服务端会将返回结果存在invocation的某个字段里返回,这样就完成了一个远程调用。
      2.在通信上层,我们在应用初始化的时候将服务注册给注册中心。而在client的初始化过程中,我们最终返回给client的是一个interface的proxy。而在获得这个interface的proxy后并调用具体方法进行业务后,proxy会去承载实际的Loadbalancer,路由到远程服务器上实际要调用的服务,并取得返回值,即实现细节1中的功能。

       当然这里讲得比较笼统,实际上具体的实现细节比这复杂很多。但总的架构体系差不都就是这样了。

     

猜你喜欢

转载自szwandcj.iteye.com/blog/1821455