`
ahuaxuan
  • 浏览: 638126 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

深入浅出jcr之16 该死的RMI,我们需要HTTP+简单RPC协议

阅读更多





        从这篇文章开始,ahuaxuan不再详细描述jackrabbit中的实现原理,而是把注意力放在jackrabbit中做的不好的地方,不敢说是批判,但是有些技术上的决策错误还是值得拿出来讨论讨论的。其中一个就是jackrabbit的客户端和jackrabbit server的通信方式--RMI。围绕这个问题我们可以展开一系列的讨论。

本文分为几个部分
1 为什么要抛弃RMI
2 为什么要选择基于HTTP的RPC协议
3 展望未来

RMI这个东西原理之前很多人搞不清楚,因为sun的RMI实现源码虽说开源了,但是却很难找到,很久之前,ahuaxuan经过一番折腾之后终于找到了它的源代码,翻了一下源代码也发现了一些问题,其中有一些概念上的定义和一般的场景相混淆,叫人很难理解那些配置的含义。但是这篇文章并不是想要批判sun的RMI的实现,如果有需要,ahuaxuan会写另外一篇文章来精要的描述一下sun的RMI的实现。

那么今天的主题是什么?是jackrabbit中RMI的使用方式。RMI可以作为有状态通信的手段。而jackrabbit中也是这样用的,这意味着什么呢?

当我们通过RMI拿到一个node时,然后遍历这个node的10个属性,会发生什么事情?
client会通过RMI发生11个remote call到jackrabbit中,虽然我们只拿了一个node,但是却发送了11个请求,如果我们拿10个node,需要上百次请求。这还只是一个线程发起的,如果客户端上多个线程同一个时间发起类似的请求,那么10个线程就会发生上千次操作。这个是他妈多夸张的事情啊。

在我的眼里,jcr其实和数据库的实现原理是类似的,在数据库操作中,我们也会遇到1+n的问题,我们要做的就是要避免这样的问题。我们需要的是争取在客户端指定需要返回的properties,然后一次返回,这样才能比较靠谱,客户端10个线程即使同时发生请求,那么也只会发生10次请求,和前面的1000次请求相比,减少了990次remote call,带来的性能提高是无可置疑的。

那么要实现这样的效果,我们还是需要选择一种通信方式,是RMI吗,不是?为什么不是,因为sun的RMI实现在客户端的connection pool和服务器端的thread pool都太简单了,不过本文不会详细介绍这个问题,我们跳过RMI,来选择其他的通信方式。

       不用RMI,那么要不就是自定义协议,理论上是没有任何问题的,自定义协议的好处的可控性较强,而且可以根据业务的特性有效的降低字节数。减少带宽的消耗。它的问题是什么呢?开发周期较长,那么我们是否可以使用现成的协议呢?

       当然没有问题,最便捷的方式就是使用http协议,在http协议之上构造自己简单的RPC协议,这个步骤很简单,虽然很简单,但是能不做最好不做,那么是否有现成的技术呢。有的,hessian.

       这里的hessian不只是hessian的序列化算法,也包括hessian包中rpc框架,当然它的框架有很大的一个缺点,那就是短连接,任何一个rpc请求返回之后 URLConnection就关闭了,新的RPC请求必须重新打开一个Connection,所以作为一个高并发的客户端,我们必须支持connection pool, 有现成的吗?? 有的,我们可以使用HTTPClient,呵呵,怎么做呢,稍微看一下代码,我们会发现我们只需要重新写一个InvocationHandler接口的实现就行了,怎么实现呢,直接参考HessianProxy就可以了。整体的实现较为简单,ahuaxuan不一一赘述。

       当然这个只是客户端的,服务器端需要重新封装一些接口,比如getNodesByIds(),可以通过Node的id集合批量的进行操作。接着服务器端的这些接口需要交给客户端,客户端利用动态代理技术创建这些接口的实现类,调用接口的方法的实现会生成RPC协议需要的参数,必然类名,方法名,参数,以及它们在binary中的位置,这样服务器拿到这个协议数据之后就可以寻找到对于的目标类,然后调用对应的方法(并传入客户端传来的参数),这一切都完美了。一切细节都被屏蔽了。客户端只需要拿到服务器端发布的接口就可以了,然后。。。。呵呵呵呵。


      虽然在改造的过程中会遇到一些小小的问题(包括hessian包的一些小bug),但是这些小小的绊脚石并不能阻碍我们前进的脚步。

      这样原来有状态的通信的方式改成了无状态的方式,而且HTTPClient的连接池配置更为丰富。更重要的是降低了很多很多很多的remote call. 性能提高也称为了必然。

      当然这个是最好的方式吗,当然不是,最终,我们的目的是直接基于TCP打造我们的RPC协议,而不是基于HTTP的RPC协议,毕竟HTTP会传输很多我们不需要的字节,直接使用mina或者netty是毕竟合适的选择。当然这些又是后话了。

也许你会问jackrabbit为什么没有这样做的,我相信它会的,它最终会这样做的。

to be continued

1
0
分享到:
评论
3 楼 yiyun_8 2012-10-11  
博主,你好,jackrabbit集群采用文件系统的方式进行存储应该怎么配置,我现在是把Workspace和Versioning中FileSystem配置到同一个目录下但是发现创建一级结点可以同步,而创建子结点就不能同步了。
2 楼 sunrao 2011-11-01  
好像不能这样处理,目前jackrabbit不支持
1 楼 pengjj2 2010-12-10  
博主,你好,想请教一下jackrabbit的一个问题。
比如,我的应用在A机器上,
      我想将 仓库 放在B机器上,采用文件系统的方式进行存储。
我在A机器上的应用应该如何访问操作B机器上的文件仓库?

相关推荐

    深入浅出 jackrabbit 1

    《深入浅出 Jackrabbit 1》 Jackrabbit 是一个开源的、实现了 Java Content Repository (JCR) API 的内容管理系统,它允许程序通过统一的方式访问、存储和管理各种数据,包括文本、图像、视频等多媒体信息。这篇...

    JCR的2.0版规范

    ### JCR 2.0版规范详解 #### 一、简介 JCR(Java Content Repository)2.0规范是一个用于管理非结构化数字资产及结构化或半结构化信息的标准框架。这一规范不仅适用于传统的内容管理系统,也适用于任何需要处理这类...

    jcr_in_action.pdf

    《JCR in Action》一书深入探讨了Java Content Repository(JCR)的各个方面,特别是Apache Jackrabbit作为其开源实现的应用。以下是对该书籍所涵盖的关键知识点的详细解析: ### JCR与Apache Jackrabbit JCR是一...

    JCR用户培训手册

    ### JCR用户培训手册知识点详解 #### 一、JCR简介 **JCR**(Journal Citation Reports)是由ISI(Institute for Scientific Information)每年出版的一份权威期刊引用报告。它通过对超过8000种期刊(其中包含了SCI...

    2022JCR最新发布-期刊影响力表-0628.xlsx

    JCR,即Journal Citation Reports(期刊引证报告),每年6月下旬由科睿唯安发布。 那么,到底什么是JCR,其中又包含哪些内容呢? 首先,是JCR的收录范围。 JCR创办之初,仅包含SCI期刊,后来陆续引入SSCI和AHCI...

    JCR 170 文档

    - JCR提供了多种实现案例,包括基于文件系统、WebDAV协议、关系型数据库以及XML的数据存储方式,展示了JCR的广泛适用性和灵活性。 ### 结论 JCR作为JSR 170的核心组成部分,为Java开发者提供了一个强大而灵活的...

    2011JCR分区表

    JCR分区表,助力科研,很有用的啊 ,Excel格式很有参考价值

    JCR2015影响因子+中科院分区

    JCR2015影响因子+中科院分区

    重磅!2022年JCR正式发布(附最新影响因子名单),前600

    2022年JCR正式发布(附最新影响因子名单) 重磅!2022年JCR正式发布(附最新影响因子名单,前600) 重磅!2022年JCR正式发布(附最新影响因子名单) 重磅!2022年JCR正式发布(附最新影响因子名单) 重磅!2022年JCR...

    JCR.rar_jackrabbit_jcr

    在IT行业中,JCR全称为Java Content Repository(Java内容存储库),它是一个标准,定义了如何在...这个压缩包中的资源,特别是`JCR.txt`文件,将帮助我们深入理解JCR和Jackrabbit的工作原理,并提升我们的开发技能。

    2022JCR最新发布 期刊影响因子 前600.xlsx

    JCR,即Journal Citation Reports(期刊引证报告),每年6月下旬由科睿唯安发布。 那么,到底什么是JCR,其中又包含哪些内容呢? 首先,是JCR的收录范围。 JCR创办之初,仅包含SCI期刊,后来陆续引入SSCI和AHCI...

    中科院JCR期刊查询

    按年度通过 刊名/简称/ISSN进行查询,需要联网。 数据来源为 “中科院文献情报中心期刊分区表开放平台” 查询结果示例: 期刊名称: IMAGE AND VISION COMPUTING +------+------------------+------+ | 序号 | 类别 ...

    2019JCR期刊分区.xlsx

    2019JCR期刊分区表,分区分为四种Q1、Q2、Q3、Q4,包含了大多数国外期刊,需要的自行下载查找

    Ei、SCI、JCR数据库检索.pdf

    Ei、SCI、JCR数据库检索 本文将详细介绍Ei、SCI、JCR三个主要的数据库检索系统,分别介绍它们的发展历程、收录范围、数据库特点和使用方法。 一、Ei(Engineering Index) Ei,即 Engineering Index,创办于1884...

    SCIE与JCR使用指南

    ### SCIE与JCR使用指南 #### 一、SCIE与JCR简介 - **SCIE**(Science Citation Index Expanded)是科学引文索引扩展版,是全球最重要的科学文献索引之一,由美国汤森路透集团维护,提供科技领域内高质量的学术资源...

    JCR期刊分区表 2007年

    ### JCR期刊分区表2007年解析 #### 一、引言 JCR(Journal Citation Reports)期刊分区表是科研领域内重要的参考工具之一,它基于期刊的影响因子和其他指标来评估学术期刊的质量和影响力。2007年的JCR期刊分区表...

    JCR-2.0.jar

    JCR-2.0.JARJCR-2.0.JARJCR-2.0.JARJCR-2.0.JARJCR-2.0.JARJCR-2.0.JARJCR-2.0.JARJCR-2.0.JARJCR-2.0.JARJCR-2.0.JARJCR-2.0.JARJCR-2.0.JARJCR-2.0.JAR

    abdera-jcr-1.0.jar

    标签:abdera-jcr-1.0.jar,abdera,jcr,1.0,jar包下载,依赖包

    jcr-oak-rpc:基于 apache Thrift for Jackrabbit Oak 的 RPC API

    Jackrabbit Oak Thrift RPC API 这个存储库是做什么用的? 基于JackRabbit Oak RPC API 的实现。 先决条件 JDK 8 Maven MongoDB(对于长耳兔) 安装 克隆存储库, git clone :ottogiron/jcr-oak-rpc.git CD 到 ...

    Maven Java使用JCR 操作CQ5节点

    自创手写。 满足以下条件即可参考: 1. maven的java工程,至少明白maven的机制 2. CQ5服务器,知道CQ5 3. 使用javax.jcr 以上为简单入门教程,复杂技能请自己修行。

Global site tag (gtag.js) - Google Analytics