java分布式通信系统(J2EE分布式服务器架构)

一、序言

近几个月一直从事一个分布式异步通信系统,今天就整理并blog一下.

这是一个全国性的通信平台,对性能,海量数据,容错性以及扩展性有非常高的要求,所以在系统的架构上就不能简单的采用集中式.简单的总结一下就是:

1.数据分布式存储

2.请求分布式调度

3.多结点分布式部署

4.双重备份,热切换

系统的核心无非就是网络架构,分布式算子和通信,要求如下:

分布式算子:

1.对于任意输入,输出均匀分布

2.输出结果数可控

通信:

1.高并发量

2.多线程

分布式算子我们选择的是sun公司的hash函数,通信用的则是cindy socket通信.网络架构以及具体的描述会在后面的blog中逐步给出.

二、网络架构

整个系统的架构如图所示,包括四层,每一层可以由若干结点来对数据和请求分流:

1.接口服务器(Interface Server):

1).对外提供访问接口并接受请求,考虑到HTTP的广泛性,一般内置一个http服务器进程

2).监控各dispatcher server的工作状态

3).转发请求到其中的一个最优dispatcher中,这里的最优性判断以各dispatcher server的工作状态为依据,当然在这一层上不心请求的具体内容可以简单地采用轮询或随机算法.

2.消息分发服务器(Dispatcher Server):

1).接受来自于接口服务器的请求

2).解析请求,提取特征参数(一般是类似于用户帐号之类的东西,一个帐号下的数据会被分布到同一个结点上),然后对该参数执行hash函数,计算出目标数据所在的App Server,然后将请求转发给该App Server.

3).事实上,在实际的项目中的处理比上面的介绍要更复杂一些,但伸缩性大大加强了.

3.应用服务器(App Server):

1).执行业务逻辑,等同于集中式系统中的应用服务器,已经不存在分布式的特征了.所处理的数据就是自己数据库中的数据,与网络上的其他结点无关.

2).被划分为多个逻辑组(group),同一个组中的服务器负载均衡

3).考虑到数据库的双重备份,热切换和负载均衡,才用了多数据库单读多写策略.对于读,监控各数据库工作状态,选择一个最优数据库来提供数据;对于写,同时写所有的数据库,因此必须保证操作的事务性.

4.数据库服务器(DB Server):

1).提供数据访问,没什么好说的,对于非事务性数据库需要在App Server层提供辅助措施;

5.结点之间的通信

1).数据(请求,响应,异常)以网络格式异步并发传输

三、分布式算法

接口服务器(Interface Server)和消息分发服务器(Dispatcher Server)在分发请求的策略上有所不同.

辅助函数和变量:

  public String[] getTargetServerIps();//目标服务器的ip,如193.243.15.45:8080

public int[] getTargetServerIds();//目标服务器ID,与上述服务器ip一一对应,可以自由配置

public boolean isServerWorking(index);//判断目标服务器的状态

int currentTargetServerIndex=0;//当前的目标服务器在targetServerIds中的index

接口服务器(Interface Server)采用轮询算法:

public String getTargetServerIp(){//获取该次请求所要分发的目标服务器

String[] targetServerIps=getTargetServerIps();

int[] targetServerIds=getTargetServerIds();

int index=currentTargetServerIndex;

boolean isWorking=false;

while(!isWorking){

        index=targetServerIds.length()%(currentTargetServerIndex+1);

   isWorking=isServerWorking(index);

if(!isWorking&&index==currentTargetServerIndex){//无任何目标服务器可用

return "0:0";

}

      }

currentTargetServerIndex=index;

return targetServerIps[index];

}

消息分发服务器(Dispatcher Server)分发请求采用的hash算法

// hash algrithm from JDK‘s String,来自于jdk的hash算法

public int hash(byte[] bs) {

int hash = 0;

for (int i = 0; i < bs.length; i++) {

hash = 31 * hash + bs[i];

}

return hash;

}

public int getTargetServerGroupIndexByHash(String hashParam) throws BtirException {//返回根据hash计算出的目标服务器群组

byte[] hashinfo=hashParam.getBytes("utf-8");

int frameCount=2://由hash值的后两位进行分段的数目 ,即hash结果数,目标服务器群组的数量

   int step = 100 / frameCount;

int hash = Math.abs(hash(hashParam) % 100);

for(int i=0, beg=0, end=step; i<frameCount; i++) {

if(beg <= hash && hash < end )

return 2*i;

beg = end;

end += step;

}

return 2*(frameCount-1); //如果设置得好,应该不会走到这里

}

public String getTargetServerIpInGriuo(int groupIndex){//根据轮询算法,计算服务器群组中的最优服务器

String[] targetServerIps=getTargetServerIps();//组内的轮询算法,代码略

int[] targetServerIds=getTargetServerIds();

      int index=getTargetServerIndexInGroup(groupIndex);//轮询算法代码略

return targetServerIps[index];

 }

四、通信节点设计模型

通信是请求响应的方式,这对于接口服务器,消息分发服务器和应用服务器来说都是一直的,所以三者可以采用一致的模型来描述.

包括两个部分:client和server.这里描述一下二者的结构和网络通信.

client构造并发送请求,在异步系统里可以将构造和发送解偶,如图

RequestBuilder生成Request

将Request投入到Request队列(RequestQueue)中

独立线程RequestScanner扫描Request队列并调用RequestSender发送请求.

针对不同类型的请求可以构造不同的队列和不同的sender,队列中Request的优先级策略可以根据需要来定制.

server接收请求并处理,如图

server接收请求并处理,如图

RequestAccepter接收请求并放入Request队列

独立线程扫描队列并将调用RequestHandler进行处理

RequestHandler处理完毕后返回Response.

client与server之间的通信:

通信协议和技术有很多,如web service,EJB,jms,单这里采用基于java NIO的socket,因为其异步性和高并发量.

采用socket的两个基本标准是:

1.服务器上的线程数可控,切忌与请求数线性增长

2.将处理请求和接收请求分开,否则会降低吞吐率和并法量

时间: 2024-11-03 09:59:04

java分布式通信系统(J2EE分布式服务器架构)的相关文章

Springmvc+mybatis+shiro+Dubbo+ZooKeeper+Redis+KafKa j2ee分布式架构

摘要: 以Spring Framework为核心容器,Spring MVC为模型视图控制器,MyBatis为数据访问层, Apache Shiro为权限授权层,Ehcahe对常用数据进行缓存,Activit为工作流引擎等. 框架简介--主要定位于互联网企业架构,已内置企业信息化系统的基础功能和高效的代码生成工具,包括:系统权限组件.数据权限组件.数据字典组件.核心工具 组件.视图操作组件.工作流组件组件.代码生成等.采用分层设计.双重验证.提交数据安全编码.密码加密.访问验证.数据权限验证.平台

高性能服务器架构思路(五)——分布式缓存

版权声明:本文由韩伟原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/167 来源:腾云阁 https://www.qcloud.com/community 在分布式程序架构中,如果我们需要整个体系有更高的稳定性,能够对进程容灾或者动态扩容提供支持,那么最难解决的问题,就是每个进程中的内存状态.因为进程一旦毁灭,内存中的状态会消失,这就很难不影响提供的服务.所以我们需要一种方法,让进程的内存状态,不太影响整体服务,甚至最好

java精品高级架构课,RocketMQ中间件,Mysql分布式集群,服务架构,运维架构视频教程

14套java精品高级架构课,缓存架构,深入Jvm虚拟机,全文检索Elasticsearch,Dubbo分布式Restful 服务,并发原理编程,SpringBoot,SpringCloud,RocketMQ中间件,Mysql分布式集群,服务架构,运 维架构视频教程 14套精品课程介绍: 1.14套精 品是最新整理的课程,都是当下最火的技术,最火的课程,也是全网课程的精品: 2.14套资 源包含:全套完整高清视频.完整源码.配套文档: 3.知识也 是需要投资的,有投入才会有产出(保证投入产出比是

高并发,分布式,高性能,系统架构项目实战

15套java架构师.集群.高可用.高可扩展.高性能.高并发.性能优化.Spring boot.Redis.ActiveMQ.Nginx.Mycat.Netty.Jvm大型分布式项目实战视频教程 视频课程内容包含: 高级Java架构师包含:Spring boot.Spring  cloud.Dubbo.Redis.ActiveMQ.Nginx.Mycat.Spring.MongoDB.ZeroMQ.Git.Nosql.Jvm.Mecached.Netty.Nio.Mina.性能调优.高并发.to

使用ZooKeeper实现Java跨JVM的分布式锁(优化构思)

说明:这篇文章是基于 使用ZooKeeper实现Java跨JVM的分布式锁 的,没有阅读的朋友请先阅读前面的文章后在阅读本文. 上一篇文章中介绍了如何使用分布式锁,并且对原来的公平锁进行了扩展,实现了非公平锁,已经能够满足大部分跨进程(JVM)锁的需求了. 问题:我们都知道在单个JVM内部实现锁的机制很方便,Java也提供了很丰富的API可以实现,例如Synchronized关键字, ReentrantLock等等,但是在集群环境中,都是多个JVM协同工作,当需要一些全局锁时就要用到上面介绍的分

我不是九爷 带你了解 Hadoop分布式文件系统设计要点与架构

Hadoop分布式文件系统设计要点与架构 Hadoop简介:一个分布式系统基础架构,由Apache基金会开发.用户可以在不了解分布式底层细节的情况下,开发分布式程序.充分利用集群的威力高速运算和存储.Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS.HDFS有着高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上.而且它提供高传输率(high throughput)来访问应用程序的数据,适合那些有着超大数据集(lar

J2EE分布式框架之开发环境部署(下)

本篇继续为大家讲解J2EE分布式框架的开发环境部署: Eclipse中配置maven安装目录和Setting文件加载的本地库目录 11.导入Maven项目 File>Import>Existing Maven Projects>下一步 选择你本地的maven项目(请选中jeesz-project根目录),点击确定 加载出来所有项目后,点击finish完成 提醒:这个导入的过程要一段时间,因为我本地连接网络,所以会从远程中央库下载项目所需要的所有的jar包,请大家耐心等候. 如果你使用了本

分布式缓存系统 Memcached 整体架构

分布式缓存系统 Memcached整体架构 Memcached经验分享[架构方向] Memcached 及 Redis 架构分析和比较

基于分布式Http长连接框架--架构模型

我画了个简单的架构图来帮助说明: 其实为发布订阅架构模式. 生产者和消费者我们统一可理解为客户端,消息中间件可认为是服务端. 生产者和消费者做为客户端要跟服务端交互,则先通过代理订阅服务端,订阅成功后即可跟服务端互通互联,此刻的连接通道为长连接. 长连接的优势在于会将消息主动通知到客户端,避免客户端去做大量的轮询工作而造成资源浪费,而且对于移动应用来说,可较大程度上节省GPRS流量. 当连接建立好后,生产者可随时发送消息,如果在发消息过程当中,服务端由于各种原因不能连接,则消息的发送会回放重试,

(二)互联网分布式企业 微服务云架构

第一篇文章简单给大家介绍了Spring Cloud架构,我这边结合了当前大部分企业的通用需求,包括技术的选型比较严格.苛刻,不仅要用业界最流行的技术,还要和国际接轨,在未来的5~10年内不能out.作为公司的架构师,也要有一种放眼世界的眼光,不仅要给公司做好的技术选型,而且还要快速响应企业的业务需求,能够为企业快速定制化业务.以下是我为公司规划的大型互联网分布式企业微服务云架构: 欢迎大家和我一同来搭建大型互联网分布式企业微服务云架构,我会把搭建架构的详细步骤记录下来,作为以后大家学习参考的资料