`

[转载] 用norbert来写高并发分布式服务框架

阅读更多

 用norbert来写高并发分布式服务框架

本来计划将sensei的相关源码系列搞完,但最近一段时间由于工作需求先调研了几种分布式的服务框架,做了简要的对比测试。根据我们自己的实际需要选取了norbert来做我们后台提供分布式服务的框架。因此,先整理一篇关于norbert框架的博文,也给自己留下个印记,以便以后来查阅。

Norbert简介
      “Norbert is a library that provides easy cluster management and workload distribution. With Norbert, you can quickly distribute a simple client/server architecture to create a highly scalable architecture capable of handling heavy traffic. ”
      这个是官方的描述,没有比这个更精准的了,norbert是一个提供分布式集群服务的开发框架,具备集群管理功能,对开发简单的通信架构,易扩展能承受高吞吐量的框架。
     其中集群管理的功能利用了zookeeper来进行node状态的感知,通讯采用了nio的netty server,序列化采用的是protobuf。整体而言来做分布式的服务,应该是非常合适的。linkedin在他们的架构里面都用到了这个框架。其实现是scala来写的,但我们使用java版的调用。
     下面是我给team同事做的一次介绍性的ppt,比较简单,从使用层面来讲的,仅供参考。

 

三种框架的对比
     在进行技术选型的时候,我们主要考察了hessian,thrift,norbert:
1. hessian是相对最成熟,最可靠的方式,在很多工程里面都用到,在异构java应用间的调用也还比较高效,已经有一些关于它的序列化测试。 但由于是http的协议,在连接数上受制于resin或者其他web服务器的链接数。
2. thrift  facebook开源的一个rpc的框架,主要特点是跨语言,现在贡献给了apache,市场上使用较多,在多语言开发的场景下很适合。走socket协议,没有集成zookeeper的管理,需要自己实现连接池之类。
3. norbert linkedin开源的框架,支持集群管理(zookeeper),走socket协议,protobuf的序列化支持。scala语言开发,不支持其他多语言,成熟度相对较低。
     测试环境: 输入为一片文章,服务进行分词和统计词数,并且返回。
    测试结果显示,在thread设置100,300,500,1000 并发进行压力测的时候,norbert与hessian相差无几;而当thread上1k的时候,hessian受限于resin的连接数抛出链接的异常。 thrift由另一同事进行同样的业务测试,测试结果与norbert稍逊,同样能撑1000以上的thread。
     在选型的时候,我们的目标是能够撑住新鲜事的服务,搜索更新的服务。并发链接数可能很大,因此更倾向于socket协议的norbert和thrift,而进行开发过程中,暂无支持其他语言的需求,但如果能支持集群服务,则开发更加简单。
      因此,打算采用norbert。

对Norbert的简易封装
     目的:让其他开发同事只关注于业务的实现,而将服务调用的开发流程更加简化。默认支持一致性hash的负责均衡。
     首先,对于一致性hash的使用,参考了xmemcahed客户端的KETAMA_HASH和redis客户端的MurmurHash。并且根据两种包装了一下,测试了两种在节点增减的情况下的负载性能和效率:
     测试环境: 在原本的固定节点数  n=2,5,10,50  ,并且分别增加一个节点,减少一个节点,导致miss的比率。
   50,51,49
  Ketamahash:
 Total Same percent in added case : 97.728035%
Total Same percent in reduced case : 97.91693%
 used time:  ---   815  miliseconds!
  murmurhash: 
 Total Same percent in added case : 97.97288%
Total Same percent in reduced case : 98.00935%
 used time:  ---   664  miliseconds!
 
 10,11,9
  Ketamahash:
 Total Same percent in added case : 91.03272%
Total Same percent in reduced case : 90.187935%
 used time:  ---   762  miliseconds!
  murmurhash: 
 Total Same percent in added case : 90.67101%
Total Same percent in reduced case : 90.65535%
 used time:  ---   596  miliseconds
 
 5,6,4
 Ketamahash:
 Total Same percent in added case : 83.67601%
Total Same percent in reduced case : 79.67246%
 used time:  ---   753  miliseconds!
 murmurhash:
 Total Same percent in added case : 82.390625%
Total Same percent in reduced case : 78.72605%
 used time:  ---   581  miliseconds!
 
 2.3.1
  Ketamahash
 Total Same percent in added case : 70.222466%
Total Same percent in reduced case : 50.81403%
 used time:  ---   723  miliseconds!
murmurhash:
 Total Same percent in added case : 68.841545%
Total Same percent in reduced case : 50.361725%
 used time:  ---   542  miliseconds!
    结论:

Ketamahash 和 murmurhash 在节点少的情况下,Ketamahash的增减节点的均衡性能稍高,
                         在节点多的情况下,MurmurHash 均衡性能高。
 总体而言,差异也不大,在1个百分点以内,执行hash的效率上,MurmurHash 计算比Ketamahash 快。
 建议,在少节点的情况下,直接使用Ketamahash的loadbalaceFactory。
封装后的server端代码:
        PropertiesConfiguration serverConf = new PropertiesConfiguration();
        try {
            serverConf.load(new File("D:\\workspace\\rpc\\resources", "server.properties"));
        } catch (ConfigurationException e) {
            e.printStackTrace();
        }
        final JingweiServer server = new JingweiServer(serverConf);
        HelloService hservice = new HelloServiceImpl();
        HelloServiceMessageHandler hmessageHandle = new HelloServiceMessageHandler(
                hservice);
        server.registerHandler(Person.getDefaultInstance(),
                RetStr.getDefaultInstance(), hmessageHandle);
        Runtime.getRuntime().addShutdownHook(new Thread() {
            public void run() {
                server.shutdown();
            }
        });
        server.start(true);
 仅需要初始化配置,提供服务的实现,以及注册,便可以启动服务。

客户端代码:
        LoadBalancerFactory factory = new MurmurHashLoadBalancerFactory();
        JingweiClient client = new JingweiClient(
                "D:\\workspace\\rpc\\resources", factory);
        client.registerRequest(Person.getDefaultInstance(),
                RetStr.getDefaultInstance());
        Person.Builder builder = Person.newBuilder();
        builder.setEmail("johnnychenjun@163.com");
        builder.setName("alex");
        RetStr ret = (RetStr) client.handleMessage(builder.build(), "alex");
        System.out.println("Ret String:" + ret.getVal());
        client.shutdown();
同样也是通过配置文件的读入,提供loadbalance的factory,注册消息,即可进行服务的调用了。
分享到:
评论

相关推荐

    norbert 高并发分布式服务例子 examples (二)

    在这个例子中,它定义了norbert框架及其依赖库,如protobuf(协议缓冲区)和其他支持高并发服务的组件。通过阅读和理解这个文件,开发者可以知道如何将norbert集成到自己的项目中,并管理相关的依赖关系。 接下来,...

    Norbert Dentressangle公司深冷自动化物流系统.rar

    Norbert Dentressangle公司作为全球领先的物流服务提供商,以其在深冷环境下的物流解决方案而闻名。 【描述】: Norbert Dentressangle公司的深冷自动化物流系统展示了如何结合先进的自动化技术与严格的低温管理,...

    Norbert Dentressangle公司深冷自动化物流系统.pdf

    Norbert Dentressangle公司深冷自动化物流系统.pdf

    norbert, Zookeeper是一个集群管理器和网络层.zip

    norbert, Zookeeper是一个集群管理器和网络层 什么是 NorbertNorbert是一个提供易于集群... 在 Scala 中实现了 to,to并使用了协议缓冲区来使传输更容易构建集群知识应用程序。 提供了一个 Java API,并且支持可以插入

    Kodilla_Project_Norbert_Lizun:Kodilla Project Norbert Lizun

    【Kodilla_Project_Norbert_Lizun:Kodilla Project Norbert Lizun】是一个以Java编程语言为基础的项目,由Norbert Lizun创建或参与。这个项目可能是一个教学资源或者是一个实际应用的实例,旨在帮助学习者或者...

    Ficner_Norbert_repo_obiektowe

    诺伯特·菲克纳(Norbert Ficner)是一位专注于对象导向编程的开发者,他的"Ficner_Norbert_repo_obiektowe"项目显然与Java编程语言紧密相关。在这个项目中,我们可以推测诺伯特分享了他的代码库,用于教育、示范或...

    Cybernetics,HumanuseofhumanbeingsNorbertWiener1989

    诺伯特·维纳的《人类的人类使用》是20世纪最具影响力的著作之一,该书首次出版于1950年,它奠定了控制论这一科学领域的基础。控制论是一门研究动物和机器中控制和通信过程的通用科学,这一学科的提出,标志着信息和...

    Norbert Dentressangle仓库采用得逻辑(Psion Teklogix)RFID方案

    Norbert Dentressangle仓库采用了由Psion Teklogix提供的RFID(无线频率识别)方案,以提高其运输和物流服务的效率。这个创新方案旨在解决仓库管理中的自动化定位问题,尤其是在处理散装库存时。传统的仓库操作中,...

    Ambient.Networks.Jun.2007 英文版,超清晰,非扫描

    此外,Ambient Networks还探索了如何利用分布式计算和人工智能技术来优化网络性能。 **4. 编辑背景介绍** - **Norbert Niebert**:Ericsson GmbH的研究员,专注于无线通信系统的创新研究。 - **Andreas Schieder**...

    CS模式的集群的JAVAAPInorbert.zip

    norbert是一个方便做CS模式的集群的JAVA API,norbert封装了zookeeper和netty,使用了协议栈缓存,基于SCALA开发 示例代码: public class NorbertClient { public static void main(String[] args) { Cluster...

    Executing SOA (执行SOA)2008

    《Executing SOA: A Practical Guide for the Service-Oriented Architect》是Norbert Bieberstein、Robert G. Laird、Dr. Keith Jones与Tilak Mitra四位资深SOA实践者共同编著的一本深入探讨服务导向架构(SOA)...

    信息安全_数据安全_spo2-t08-the_future_of_trust_in_.pdf

    Norbert Pohlmann以及Adam Ross等业界专家,他们共同讨论了信任服务的全球化市场趋势,以及在身份验证、加密和工业互联网等领域的应用。 首先,安全分析是确保信息安全的关键环节。通过对网络行为的监测和分析,...

    诺伯特

    1. 版本控制:诺伯特项目使用了Git进行版本管理,这是一种分布式版本控制系统,能够追踪代码的历史变更,便于团队协作和代码回溯。 2. 开源文化:由于有“master”分支的提及,很可能诺伯特是一个遵循开放源代码...

    信息科学与知识管理.pptx

    总的来说,信息科学与知识管理是推动现代社会服务创新和发展的重要驱动力,它们结合计算机科学和技术,构建了处理和利用信息的复杂系统,从而提高了服务效率和客户满意度,促进了社会经济的进步。

    Wiener-Scalart.rar_operation_scalart wiener_wiener

    Wiener过滤是一种在信号处理和图像处理领域广泛应用的去噪技术,由Norbert Wiener于1942年提出。这种滤波器是基于最小化预测误差平方和的原理,目的是在保留信号重要特征的同时去除噪声。在"Wiener-Scalart.rar"这个...

    VMworld 2009 – AP04:SAP Production Systems virtualized on EMC Information Infrastructure

    这一演讲由EMC EMEA区域SAP实践总监Joakim Zetterblad和ADDON的虚拟化中心总监Norbert Günther共同主持。以下是对该演讲内容的详细解释和扩展: **业务驱动因素** - 复杂的SAP景观:传统架构通常包括客户端-服务器...

    战略与企业家综合概述(英文版).doc

    首先,作者通过引用Norbert Wiener的比喻,强调了环境(阳台)与个体(罗密欧)在任何历史叙事中的不可或缺性。Wiener认为,科学和发明的历史往往过于强调环境因素,而忽视了个人的角色。同样,战略管理研究往往过于...

    2017现代数字信号处理第6章课件

    Kalman)提出的一种算法,它是一种递归滤波器,可以在每个时刻使用先前的估计和新的观测数据来更新系统状态的估计值。 课件中的§6.1引言部分,阐述了一般滤波技术和维纳滤波技术的区别和应用场景。维纳滤波在假定...

    卡尔曼 kalman 经典论文

    在卡尔曼的工作之前,诺伯特·维纳(Norbert Wiener)在20世纪40年代初就提出了著名的维纳-霍普夫积分方程,并给出了当统计量是平稳且谱密度为有理函数时该方程的解法。这一工作极大地推动了随机信号处理的发展。...

Global site tag (gtag.js) - Google Analytics