`
ahua186186
  • 浏览: 561986 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

GAEA-58客户端同步模型

 
阅读更多
1.核心思路:

(1)动态代理就不用说啦,本质就是通过字节码增强技术来代理对象的行为。

(2)通过在客户端对每个请求都保存一个计数为1的CountDownLatch对象实现同步模型。

2.细节:
客户端的每个请求1个SessionID,每个SessionID持有一个WindowData对象,每个WindowData持有一个AutoResetEvent对象,每个AutoResetEvent持有一个记数为1的CountDownLatch对象。

3.其他思考:

在动态代理的时候 ,作者设计时抽象啦一层:MethodCaller层,这层的各个环节大概有:

1.第一步当然是init: 初始化ServiceProxy,本质就是初始化SocketChannel的一些参数。

2.SocketChannel.open()。。。并保存进对象池,注册CountDownLatch到会话中,  启动接收数据工作线程。

3. 发送数据。。

思考:参考mybatis的mapper接口的同步模型。

4.对比s-hsf同步模型:

相对来说,HSF实现比较简单,hsf是每个请求持有一个InvokeFuture(封装一个信号量),通过invokeFuture.getResult(timeout, TimeUnit.MILLISECONDS);等待超时实现,既可以异步也可以同步,灵活。



5. GAEA-58客户端同步模型核心代码

Server类:

关键代码: socket.registerRec(p.getSessionID());//注册一个windowData对象到当前会话中。


 public Protocol request(Protocol p) throws Exception, Throwable {
        if (state == ServerState.Dead) {
        	logger.warn("This proxy server is unavailable.state:" + state + "+host:" + address);
        	throw new Exception("This proxy server is unavailable.state:" + state + "+host:" + address);
        }
        
        increaseCU();
        CSocket socket = null;
        try {
            try {
            	socket = this.scoketpool.getSocket();
                byte[] data = p.toBytes(socket.isRights(),socket.getDESKey());
                socket.registerRec(p.getSessionID());
                socket.send(data);  
            } catch (Throwable ex) {
                logger.error("Server get socket Exception", ex);
                throw ex;
            }finally {
            	if(socket != null){
            		socket.dispose();
            	}
            }
            byte[] buffer = socket.receive(p.getSessionID(), currUserCount);
            Protocol result = Protocol.fromBytes(buffer,socket.isRights(),socket.getDESKey());
            if (this.state == ServerState.Testing) {
                relive();
            }
            return result;
        } catch (IOException ex) {
            logger.error("io exception", ex);
            if (socket == null || !socket.connecting()) {
                if (!test()) {
                    markAsDead();
                }
            }
            throw ex;
        } catch (Throwable ex) {
            logger.error("request other Exception", ex);
            throw ex;
        } finally {
            if (state == state.Testing) {
                markAsDead();
            }
            if (socket != null) {
                socket.unregisterRec(p.getSessionID());
            }
            decreaseCU();
        }
    }



CSocket类接收到数据时释放计数器:

关键代码:
WindowData wd = WaitWindows.get(pSessionId);
                            if (wd != null) {
                            wd.setData(pak);
                            wd.getEvent().set();
                            }



    protected void frameHandle() throws Exception {
        if (handling) {
            return;
        }
        synchronized (receiveLockHelper) {
            handling = true;
            try {
                if (waitDestroy && isIdle()) {
                    logger.info("Shrinking the connection:" + this.toString());
                    dispose(true);
                    return;
                }
                receiveBuffer.clear();
                try {
                	int re = channel.read(receiveBuffer);
                	if (re < 0) {
                		this.closeAndDisponse();
                		logger.error("server is close.this socket will close.");
                		return;
                	}
                } catch (IOException ex) {
                    _connecting = false;
                    throw ex;
                } catch (NotYetConnectedException e) {
                    _connecting = false;
                    throw e;
                }
                receiveBuffer.flip();
                if (receiveBuffer.remaining() == 0) {
                    return;
                }
                
                while (receiveBuffer.remaining() > 0) {
                    byte b = receiveBuffer.get();
                    receiveData.write(b);
                    if (b == ProtocolConst.P_END_TAG[index]) {
                        index++;
                        if (index == ProtocolConst.P_END_TAG.length) {
                            byte[] pak = receiveData.toByteArray(0, receiveData.size() - ProtocolConst.P_END_TAG.length);
                            int pSessionId = ByteConverter.bytesToIntLittleEndian(pak, SFPStruct.Version + SFPStruct.TotalLen);
                            WindowData wd = WaitWindows.get(pSessionId);
                            if (wd != null) {
                            	wd.setData(pak);
                            	wd.getEvent().set();
                            }
                            index = 0;
                            receiveData.reset();
                            continue;
                        }
                    } else if (index != 0) {
                    	if(b == ProtocolConst.P_END_TAG[0]) {
                    		index = 1;
                    	} else {
                    		index = 0;
                    	}
                    }
                }
            } catch(Exception ex){
            	index = 0;
            	throw ex;
            }finally {
                handling = false;
            }
        }
    }

分享到:
评论

相关推荐

    PyPI 官网下载 | gaea-0.1.15.tar.gz

    《PyPI官网下载:gaea-0.1.15.tar.gz——深入解析Python库的构建与发布》 PyPI(Python Package Index)是Python世界中的一个核心组成部分,它是Python开发者发布自己创建的软件包的地方,让全球的Python用户能够...

    Gaea - Object Database Viewer-开源

    标题 "Gaea - 对象数据库查看器 - 开源" 提供了关于软件的基本信息,它是一个用于查看和修改对象数据库的工具,而且是基于开源许可证的。这意味着任何人都可以访问其源代码,对其进行自定义,改进并共享。接下来,让...

    Python库 | gaea-1.6.6.tar.gz

    资源分类:Python库 所属语言:Python 资源全名:gaea-1.6.6.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    Python库 | gaea-0.1.22.tar.gz

    资源分类:Python库 所属语言:Python 资源全名:gaea-0.1.22.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    Gaea 服务通讯框架

    在58code-Gaea-4c84011这个压缩包中,包含了Gaea框架的源代码和其他相关资源,这对于开发者深入理解Gaea的内部机制、进行二次开发或者调试优化提供了极大的便利。通过阅读和学习这些源码,我们可以了解到Gaea是如何...

    gaea:Gaea是一个基于Gin的Web框架,参考gin https

    文档安装安装脚手架通过脚手架可一键创建Gaea模板的api项目生成框架此处以“ myproject”为项目名称$ rigger new api myproject正克隆到 ' /winshare/go/src/myproject ' ...myprojec项目已创建完成, 使用: cd /...

    灰度图生成地形导出obj模型

    直接raw格式灰度图生成地形,先创建地形,属性设置栏,导入灰度图,Terrain-Export To Obj ,选择保存位置即可导出,灰度图片png加贴图创建地形,导出obj格式,运行状态下点击界面按钮等待即可保存

    gaea 和JDBC z整合

    在IT行业中,GAEA(Global Application Environment)是一个用于构建分布式应用服务框架的开源项目,而JDBC(Java Database Connectivity)是Java中用于访问数据库的标准规范。当我们谈论“gaea 和 JDBC 整合”时,...

    GAEA词库释义.zip

    此文件中包含有GAEA软件各个功能的释义,有助于你更好、更方便、更快捷地学习并掌握GAEA软件各个功能点。

    Gaea:Gaea是一个mysql代理,由小米b2c-dev团队开发

    简介Gaea是小米中国区电商研发部研发的基于MySQL协议的数据库中间件,目前在小米商城大陆和海外得到广泛使用,包括订单,社区,活动等多项业务。Gaea支持分库分表,sql路由,读写分离等基本特性,更多详细功能可以...

    gaea

    gaea利用Django的模型-视图-控制器(MVC)架构,将业务逻辑、数据处理和用户界面分离,从而提高了代码的可维护性。 其次,gaea支持多种教育资源的上传和管理,包括PDF文档、视频、音频、图片等。这为教师提供了丰富...

    gaea:自动生成工具,基于md数据字典生成SQL语句,后台管理系统页面等

    生成api项目gaea [项目类型] create -n apiserver //创建基础的 api 项目➜ gaea api create -n ./apiserver//创建带登录和菜单组件的api项目(常用)➜ gaea api create -login " http://192.168.5.93:6688|B128F...

    Gaea决策引擎产品白皮书_专家系统_

    近年来,企业中商业规则频繁变动已成为一种趋势,并且这种规则变动的原因多半来自于非开发人员,或者说是业务人员。面对复杂的企业级项目开发及其随着外界环境条件的变化而变化的业务规则,譬如银行、保险领域,业务...

    Gaea:vs.net的套接字,基于iocp(也许),例如diocp

    如果你对这部分代码感兴趣,可以从压缩包文件"**Gaea-master**"中解压获取源码,进一步研究其具体实现细节,包括如何创建和管理Socket对象,如何设置和使用IOCP,以及如何处理客户端的请求和响应。这将有助于你深入...

    《58同城架构演进与优化二三事》沈剑

    - **自研系统**:开发了专门的图片存储系统,以及一套完整的开发框架(包括Web框架Argo和服务框架Gaea),大大降低了站点和服务的开发成本。 #### 四、更大流量挑战及解决方案 - **面临的新挑战**:如何应对更高的...

    服务通讯框架Gaea.zip

    Gaea是服务通讯框架(Service Communication Framework)支持跨平台具有高并发、高性能、高可靠性,并提供异步、多协议、事件驱动的中间层服务框架。 标签:Gaea

    02.GAEA基础介绍 · 语雀.mhtml

    02.GAEA基础介绍 · 语雀.mhtml

    anji-plus-AJ-Captcha-Images-master.zip

    《滑动验证码技术详解——基于Java与Maven的实现》 滑动验证码作为一种常见的安全验证手段,被广泛应用于各类Web应用中,旨在防止自动化程序(如机器人)进行恶意操作。在"anji-plus-AJ-Captcha-Images-master.zip...

    Gaea:盖亚发动机

    此外,Gaea还支持导入和导出多种格式的文件,包括常见的3D模型格式如OBJ、FBX,以及GIS数据格式如DEM,使得与其他软件的集成变得轻松简单。 在使用Gaea时,用户可以通过一系列内置的工具进行地形雕刻。这些工具包括...

    HR.zip_GAEA HR_hr(java)_人力资源_招聘 java ssh_档案

    Struts则专注于MVC(模型-视图-控制器)架构,处理用户请求与业务逻辑;Hibernate作为持久层框架,实现了对象关系映射,简化了数据库操作。 1. **系统模块**:在HRMS中,系统模块通常包括用户管理、权限控制、日志...

Global site tag (gtag.js) - Google Analytics