坚信科学,分享技术

>>>尝试更加利于阅读的2014版科学院,以后都在新版上写。

Tag Archives: thrift

disruptor thrift server连接参数与rps数值影响记录

基础环境 rmbp 8G MEM Intel(R) Core(TM) i7-3615QM CPU @ 2.30GHz 四核 八线程 oracle jdk 1.7.0_45 原理 如上图,是类似tomcat的nio实现过程,不过将queue换成了高性能的disruptor,可能会得到更好的性能。可调整参数为numAcceptors,numSelectors,numWorkersPerSelector三个值。 测试的代码位置在 https://github.com/54chen/disruptor_thrift_server 项目中的BenchmarkTest同时启动一个server,同时对其进行压测。 AbstractDisruptorTest.Service类中实现了server的逻辑,里面实际上是一个加减乘除的简单方法,故意加了300ms的sleep以尽可能模拟真实的消费时间。 BenchmarkTest类中实现了client的压力逻辑,固定了200个线程同时死循环地进行访问,同时进行计数统计rps。 调整记录 1.A(cceptors):4 S(electors):2 W(orkersPerSelector):2 处理接入的线程数:4 处理调用逻辑的线程数:2 推荐是cpu的核数以上 每个处理逻辑上的worker数量:2 结果: Rate: 16 req/s Rate: 12 req/s Rate: 12 req/s …

Continue reading

Posted in java | Tagged , | 2 Comments

Cassandra的thrift用法学习手记

__English Version__The notes about the usage of Thrift in Cassandra Cassandra在client访问server cluster的时候使用了thrift,在cluster node间的通讯,依旧是自己实现的二进制协议。 先决条件 thrift 0.9.1 mac libthrift-0.9.1 Cassandra 2.0.3 本文所涉及的代码:https://github.com/54chen/cassandra-thrift 看代码 thrift的定义:server的逻辑实现代码叫做Processor,创建的等待socket代码里叫做Transport,最后启动的进程叫做Server,大致就会有要启动一个thrift server,需要有一个socket(Transport)和一堆逻辑(Processor)。 这里有一篇2011年写的thrift入门手记:http://www.54chen.com/java-ee/thrift-quick-start.html 示例代码中以TNonBlockingServer来举例。TNonBlockingServer是采用libevent lib实现的一种thrift内置的server类型,理论上是最快的一种。 CustomTNonBlockingServer Cassandra并没有默认使用这种类型的server,默认的是基于TServerTransport连接完成的CustomTThreadPoolServer(自行实现了连接池)。 以示例代码为例: Cassa

Continue reading

Posted in java | Tagged , | 1 Comment

resin+thrift压力测试报告

基础条件 位置 参数 server resin 4 1 rose+1 thrift java version "1.6.0_29" Ubuntu 10.04 LTS 双核cpu 8G mem client macbook pro ab server代码 1.用thrift创建了一个方法,内部只有几行代码: logger.info("in call"); try { Thread.sleep(1000); } catch (InterruptedException e) { logger.info("sleep error"); } 2.使用的paoding-rose调用这个thrift方法。 第一波,thrift 10 …

Continue reading

Posted in 架构研究 | Tagged , , | 3 Comments

thrift快速入门实例

Thrift是Facebook的核心框架之一,使不同的开发语言开发的系统可以通过该框架实现彼此的通信,类似于webservice,但是Thrift提供了近乎变态的效率和开发的方便性,是webservice所不能比拟的。给分布式开发带来了极大的方便。但是这柄利器也有一些不完美。 安装thrift 1、./configure --with-boost=/usr/include 2、make 3、make install 定义接口文件 vim chen.thrift      #!/usr/local/bin/thrift --gen java   namespace java com.chen   service Hello{           i32 hello()   }   生成代码 thrift --gen java chen.thrift    要使用1.6的jdk 实现server代码: /**   * @author 54chen(陈臻) [chenzhen@xiaomi.com czhttp@gmail.com]  &n

Continue reading

Posted in java | Tagged | 1 Comment

thrift最佳实践:版本与兼容

十分苦逼的api提供过程。一次提供,终身负责制。 "API design is like sex: Make one mistake and support it for the rest of your life." - @joshbloch Structs: 在许多系统里面,被称做message. 协议随着岁月而演变,如果一个已经存在的消息类型不再满足需求,但是你仍然想使用原来使用thrift文件生成的代码,比如你想在现在的消息类型上增加一个额外的字段。 不用担心人,不搞坏原来的任何代码而更新消息类型,是非常简单的,只需要时刻记录以下的规则: 1.不要修改现存的任何已经存在字段的数字标签 2.任何新增的字段应该是optional的,这就意味着,所有新定义产生的代码都能解析新老的格式,因为一定会有任何一个标上required的元素。你应该设置可能的默认值给这个元素,让新代码与老数据也能正常协作。与此类似,新数据也能被老代码解析,老的实现解析时会忽略新的字段。尽管如此,未知的字段不能被丢弃,并且如果消息被延迟序列化,未知的字段也会被一起序列化,因此当消息到达新代码的时候,新字段依旧可用。 3.当你更新的消息类型里不再包括相关的标签数字时,非required字段可以删除。(把这个废字段改名,比如说加个前缀OBSOLETE_ ,可以防止未来维护.thrift文件人误用原来的数字,这做法可能更好。) 4.修改默认值基本上是OK的,但是你记得这个默认值永远不会“串线”。比如,如果程序收到一个在某个字段没有值的消息,程序会看那个

Continue reading

Posted in 资料文档 | Tagged , | Leave a comment