JStorm 源码解析:基础线程模型

在具体开始分析 storm 集群的启动和运行机制之前,我们先来看一下基础的线程模型,在整个 storm 的实现中有很多地方用到它,所以将其单独拎出来先分析说明一下,后面看到相应的类就大致知道其内在的运行过程啦。 在 storm 的实现中,有很多实现了 RunnableCallback 类的子类,这些类实例化之后都被传递给了 AsyncLoopThread 对象,示例如下: 12345678910111213141516171819public class MyRunnableCallback extends RunnableCallback { private static AtomicInteger count = new AtomicInteger(); @O...

阅读全文

JStorm 源码解析:拓扑任务的资源分配过程

上一篇我们分析了 topology 构建和提交过程在客户端的逻辑,并最终通过 submitTopology 方法向 storm 集群的 nimbus 节点提交任务。Nimbus 以 Thrift RPC 服务的方式运行,相应 thrift 接口方法实现位于 ServiceHandler 类中,下面我们从 ServiceHandler#submitTopology 方法切入,分析 nimbus 节点之于客户端提交任务的资源分配过程,该方法包装了 ServiceHandler#submitTopologyWithOpts 方法。 Storm 集群的任务提交主要分为三种类型:新任务提交、热部署,以及灰度发布。ServiceHandler#submitTopologyWithOpts 方法统一...

阅读全文

JStorm 源码解析:拓扑的构建和提交过程

我们按照 storm 规范开发的 spout 和 bolt 需要使用 TopologyBuilder 构建成有向无环图(拓扑),并指定消息的分组方式,然后提交给 storm 集群执行,本篇我们将分析 topology 的构建和提交过程。前面分析 storm 的编程接口时曾介绍过 StormTopology 这个 thrift 类,topology 在构建完成之后会封装成一个 StormTopology 对象,并通过 RPC 方法提交给 storm 集群的 nimbus 节点。 一. 拓扑的构建过程拓扑结构在 storm 集群中以 StormTopology 对象的形式表示,这是一个 thrift 类,其定义如下: 12345struct StormTopology { 1:...

阅读全文

JStorm 源码解析:编程接口

Storm topology 是由 spout 和 bolt 构建的有向无环图,其中 spout 是图的起始节点,用于发送数据,而 bolt 是图的中间节点和末端节点,用于对数据进行处理。下面我们先用一个简单的 wordcount 示例来回忆一下 storm 的基本使用,然后对示例中涉及到的 storm 编程接口从源码层面分析其内在实现。 一. 简单示例:Word Count本节中我们将实现一个 wordcount 程序,其中 spout 用于发送句子,bolt 负责对句子进行切分、单词统计,以及最终打印等工作。 实现 Spout实现一个 spout 最常见的方式是继承 BaseRichSpout 抽象类,我们的句子发送 spout 实现如下: 12345678910111213141...

阅读全文

JStorm 源码解析:整体架构

Storm 是一个基于 ZK 协调的分布式任务实时调度系统,属于流式(实时)计算引擎的一类。在目前的大数据和人工智能背景下流式计算是公司大部分业务的刚性需求,能够实现在百十毫秒内完成对用户行为的计算并执行具体的策略,例如依据用户的行为对其实施风控等。 当下市面上已有很多流式计算引擎产品,但是 storm 的出现基本上统一了这一领域,不过近几年也出现了一些新的产品可以撼动 storm 的地位,比如 flink、spark streaming 等。不可否认的是,现阶段还是有很多公司的业务运行在 storm 集群上,这样一个毫秒级延迟的分布式实时计算引擎还是有很多地方值得我们一起去探寻其设计与实现原理。 JStorm 架构设计JStorm 是在 storm 的基础上基于 java 语言重写而...

阅读全文

那些年,面试被虐过的红黑树

面试官:小桂子是吧,看你简历上写着精通 java 编程,想必对 java 已经掌握的很好了吧? 小桂子:系呀系呀,一直都用 java 写 bug 呢~ 面试官:那你说说 jdk1.7 之前 HashMap 的底层实现原理呗,另外为什么在高并发场景下可能造成较高的 CPU 占用? 小桂子:这个。。。好像是红黑树? 面试官:哦?你说的是 jdk1.8 之后的设计,既然你提到了,那就聊聊红黑树这个数据结构吧,这里是白纸和笔,手写一棵吧! 小桂子:哎呀,哎呀哎呀,老师,突然肚子好疼,我要去一下厕所,一会儿就回来~~~ 面试处处是套路呀。。。不知道你是否有和小桂子一样尴尬的面试经历呢,如果有的话欢迎到评论区留言,说出你的故事~ 接下来我们进入正题,开始探究面试官为难小桂子的红黑树。说到红黑...

阅读全文

OAuth 2.0 开放授权那些事儿

OAuth 2.0 协议是一种三方授权协议,目前大部分的第三方登录与开放授权都是基于该协议的标准或改进实现。OAuth 1.0 版本于 2007 年发布,2.0 版本则在 2011 年发布,其中 2.0 版本取消了所有 token 的加密过程,并简化了授权流程,但因强制使用 HTTPS 协议,被认为安全性高于之前的版本。 项目地址:https://github.com/plotor/oauth4j 一. 小场景带你感受 OAuth 2.0 的交互过程为了让你对 OAuth 2.0 协议有一个整体上的感知,这里先设置一个小场景对协议的交互过程进行模拟。话说阿冰在花果山上有几亩果园,种了各种各样的水果,有苹果、荔枝、西瓜等等,并由管理员老王进行看管。 夏天到了,果园里的的水果涨势喜人...

阅读全文

Dubbo 之于 SPI 扩展机制的实现分析

SPI (Service Provider Interfaces) 是 jdk1.5 引入的一种服务扩展内置机制,在面向接口编程的范畴下,SPI 能够基于配置的方式声明实际应用的具体扩展接口实现。之前在写接口限流器时曾遇到过这样一个场景,针对服务端的限流策略一般需要从多个维度进行控制,比如具体接口、IP、用户、设备,以及调用方等等,假设限流器接口 org.zhenchao.spi.ApiRateLimiter 定义为: 123public interface RateLimiter { boolean reject();} 针对该接口在各个维度的实现类包含如下: 123456org.zhenchao.spi.RateLimiter+- org.zhencha...

阅读全文

Reactor:事件驱动的高性能响应模式

Node.js 这几年火的不要不要的,借助 js 天生的事件驱动机制和 V8 高性能引擎,让编写高并发的 web 应用门槛降低了许多,当然这背后还要得益于 Douglas C. Schmidt 在 1995 年提出的基于事件驱动的 Reactor 模式,让本身只支持单线程执行的 js 能够胜任如今高并发环境下的服务端应用。 不过作为一名服务端开发人员,我对 js 的使用程度并不高,所以也一直没有机会去切身体会 Node.js 的魅力(更换编程语言这件事可不是伤筋动骨 100 天就能好的),好在 Reactor 只是一个设计模式,是与具体语言和平台无关的,前段时间将负责的项目中的一个比较新的服务引入了 Vert.x 组件进行改造,也算是与 Reactor 模式有了一次亲密接触。Vert....

阅读全文

接口限流器中的常用算法及其应用场景

小编所在的部门作为公司的基础服务部门,支撑着上层业务的正常运行,当有业务举办活动、遭遇攻击,或者是写土了代码,都会或多或少给我们的服务带来流量上的冲击。我们通常说缓存、降级,以及限流技术是高并发服务的三大利器,为保证集团其它业务不受影响,限流往往是服务端接口的必要特性之一,用于对抗大规模恶意请求,保护有限的计算和存储资源。 一. 常用接口限流算法关于接口限流有很多成熟的算法可供使用,包括:计数器、漏桶,以及令牌桶等,这些算法都为实际项目中的限流器设计提供了理论支撑。 1.1 计数器算法计数器应该是最简单、最容易想到的限流策略,毕竟限流的本质就是限制一个接口在某个维度上单位时间的响应次数。我们可以设置一个计数器对某一时间段内的请求进行计数,当请求量超过某个事先设定的阈值时则触发饱和策略,...

阅读全文

Powered by hexo & Theme by hiero   Copyright © 2015-2018 浙ICP备 16010916  号,指 · 间 All Rights Reserved.