封仲淹:如何优雅地使用Disruptor

个人简介 封仲淹(纪君祥),阿里巴巴中间件平台技术部高级技术专家, 花名纪君祥, 阿里巴巴 JStorm 核心作者之一,Apache Storm PMC,流式计算权威人士之一,从事分布式计算,分布式存储多年,目前专注于实时计算和流式计算。曾就职于 EMC、VIA。

QCon是由InfoQ主办的全球顶级技术盛会,每年在伦敦、北京、东京、纽约、圣保罗、上海、旧金山召开。自2007年3月份首次举办以来,已经有超万名高级技术人员参加过QCon大会。QCon内容源于实践并面向社区,演讲嘉宾依据热点话题,面向5年以上的技术团队负责人、架构师、工程总监、高级开发人员分享技术创新和最佳实践。

   

1. 各位InfoQ的网友,大家好。现在我们是在QCon2016北京现场,做客我们专访间的是阿里巴巴的封仲淹,花名纪君祥。第一个问题是这样的,能不能详细聊一下JStorm底层的并发框架Disruptor,我们知道国内有很多公司都在用它,但是目前的应用案例非常少,你能补充一下社区方面的进展或者是内容吗?

封仲淹:Disruptor是谷歌后来开源的分布式高性能的队列,这个队列是非常赞的队列,它的性能非常高。我们做过性能测试,它比BlockingQueue、ConcurrentQueue要快一个数量级,它的核心原理是对cache有高速的亲和性,在内存有很好的防止GC。还有一个更重要的特性,它在锁这块控制的非常细。像BlockingQueue、ConcurrentQueue它们在头尾上有一个锁,这个锁的粒度远远高于Disruptor,Disruptor彻底利用了CPU里面的指令级的锁,所以它在锁这块非常的高效,这就是为什么Disruptor的性能比BlockingQueue、ConcurrentQueue高一个数量级的核心的原理。在社区上我知道很多人已经开始使用Disruptor queue,它已经发展到三了,是非常不错的。但是Disruptor我们在二的时候出现过一个问题,它会有一个CPU空转的问题。当时我们自己写了一段代码绕过去,但是这段代码其实可以contribute到社区让他们去改进。至于为什么当初选Disruptor,最重要的原因是storm用了Disruptor,我们也就跟进了。但是我们做了一些自己的分析跟性能测试,Disruptor确实是非常赞的高并发队列。

   

2. 目前Disruptor是否比较成熟,你是否推荐大家使用呢?

封仲淹:我个人的观点,就看你对性能的要求有多高。如果你要达到极致的性能,对延迟要求非常低,而且对高并发要求性能非常高的时候,你肯定要选择Disruptor。但是从易用性上来讲,Disruptor使用起来并没有传统的queue使用上更方便。你在百万级别并发的时候,我推荐大家使用Java的ConcurrentQueue跟BlockingQueue。但是如果你需要更低的延迟的话,我推荐用Disruptor。

   

3. 目前Disruptor社区发展怎么样?

封仲淹:社区发展的很好,坦白来讲Disruptor社区我也不是非常熟悉,因为这块我主要站在使用者的角度,并不是开发者的角度。

   

4. 你能不能简单举一个例子,说明一下Disruptor它的使用场景,以及它的优势,比如说某些典型的业务场景。

封仲淹:像我们JStorm的流水线这是一个典型的场景。如果站在更高的角度和业务场景,比如说像风控或者是交易系统这种要求延迟非常低的环境里面,肯定是需要Disruptor的。回到核心的本质,就是说你要高性能以及低延迟的情况下,你还是选择Disruptor。

   

5. 它的优势就在于性能特别高。

封仲淹:对,它就是为了高性能所做的一款。

   

6. 您刚才提到锁的问题,这是不是Disruptor架构设计中的一个亮点。之所以它能这么快就是因为这个吗

封仲淹:对,最大的原因就是这个。

   

7. 你们在具体应用的时候有没有遇到哪些坑,除了你刚才讲到的易用性不大好以外,能不能谈一些你们的使用经验。

封仲淹:当时我们踩过一个坑,当Disruptorqueue满的时候,它会不停的Put,导致它的CPU消耗非常高,CPU不停的空转。

   

8. 这是二的时候。

封仲淹:对,二的时候,最新版的是OK了,但是老版还有这个问题。

   

9. 除了这个之外,还有别的吗?

封仲淹:除了这个之外没有别的,最新版和多队列消费都还不错的。

   

10. 你有哪些使用的建议给其他人吗?

封仲淹:我对Disruptor的建议,其实它就是一个队列,用起来我们觉得也挺简单的,不是很复杂,可能我们用的比较熟。

   

11. 您刚才提到易用性方面不是很好,您能说一说吗?

封仲淹:易用性方面确实不如普通的ConcurrentQueue,消费的方式跟原来的ConcurrentQueue、BlockingQueue还是有区别的。ConcurrentQueue就是一个put一个get,这种思想就是队列头插或者是队列尾插,get的话要么从队列头get,要么从队列尾get。但是它不是这样的,push是一样的,但是你在消费的时候,它的消费的API稍微复杂一点,不如BlockingQueue、ConcurrentQueue这么简单直接。

   

12. 就是在整个架构的健壮性方面storm还是比较好的。

封仲淹:因为它比较老,而且已经比较成熟了。

InfoQ:谢谢您,我的采访就这些。

   

13. 那关于JStorm您还有什么要跟大家介绍的吗?

封仲淹:如果大家使用Storm的话,我觉得大家可以用JStorm试一下,JStorm它在整个监控稳定性,以及性能上都是远远超过Storm的。而且我们国内社区做的还不错,基本上现在来说,京东每个月会给我们contribute一个patch,携程每个月也会给我们contribute至少一个issue或者一个patch。整个社区每天的提问至少会超过一百多条,还是非常活跃的。Storm还是整个业界在流式计算这块非常稳定的,因为它比较老,现在新的架构像spark streaming,samza,flink,这些新的架构是非常出色的,但是暂时来讲storm可能还是适合很多场景的。

你可能感兴趣的:(封仲淹:如何优雅地使用Disruptor)