这两天看了下hangout的代码,虽然没有运行体验过,但是也算是学习了一点皮毛。

架构浅谈

Hangout可以说是java版的Logstash,我是没有测试过性能,不过据说是kafka这边性能要高出Logstash5倍。不知道真的假的,不过看代码,确实要比Logstash高效一点。

关于input,filter,output的关系

在Logstash里面,Input,filter,output是三个独立的部分,每个部分通过Buffer存储数据。

但是Hangout没有采用这种思想,每个Input是独立的input对象。每个input对象又由decoder、filter、output组成。事件由Input搜集产生,然后经由filter进行过滤解析,再交给output输出。

这样的关系,在组织结构上,使得filter、output与Input的关系变成了被包含的关系。

关于buffer

Logstash中input,filter,output之间都有一个Buffer用于暂存数据。所有的input数据会暂存到buffer里面,等待filter解析,filter解析后数据又会放入filter和output之间的Buffer,等待output去flush到目的地。

在Hangout中,则是直接取消掉了buffer这一概念,使得事件由Input直接经过filter,直接交给output。性能上肯定是更快速了一些;但是这样也存在问题,就是每个input的数据不是同一存放的,filter、output其实会在不同的input中初始化多次,这就意味着其实浪费了一些资源,很多资源被重复利用了。

代码学习

下面是今天抽空整理的hangout的类图,可以提供点基本的代码提示。由于以前没怎么使用过反射,这次正好通过看代码学习了一下。通过反射的方式,使得初始化这种模块化程度很高的代码,变得十分容易:

Iterator<Entry<String, Map>> inputIT = input.entrySet().iterator();
while (inputIT.hasNext()) {
Map.Entry<String, Map> inputEntry = inputIT.next();
String inputType = inputEntry.getKey();
Map inputConfig = inputEntry.getValue(); Class<?> inputClass = Class.forName("com.ctrip.ops.sysdev.inputs." + inputType);
Constructor<?> ctor = inputClass.getConstructor(Map.class,ArrayList.class, ArrayList.class);
BaseInput inputInstance = (BaseInput) ctor.newInstance(inputConfig, configs.get("filters"), configs.get("outputs"));
inputInstance.emit();
}

其中inputIT是获得input配置集合,通过反射的方式拿到class

Class.forName("com.ctrip.ops.sysdev.inputs." + inputType);

设置它的构造方法,并初始化

Constructor<?> ctor = inputClass.getConstructor(Map.class,ArrayList.class, ArrayList.class);
BaseInput inputInstance = (BaseInput) ctor.newInstance(inputConfig, configs.get("filters"), configs.get("outputs"));

最后使用emit方法,启动input输入

inputInstance.emit();

类图

流程图

日志分析系统——Hangout源码学习的更多相关文章

  1. 【Python学习】记一次开源博客系统Blog_mini源码学习历程-Flask

    今天准备看看Flask框架,找到一套博客系统源码,拿来学习学习 https://github.com/xpleaf/Blog_mini 演示地址 http://140.143.205.19 技术框架 ...

  2. Qt Creator 源码学习笔记04,多插件实现原理分析

    阅读本文大概需要 8 分钟 插件听上去很高大上,实际上就是一个个动态库,动态库在不同平台下后缀名不一样,比如在 Windows下以.dll结尾,Linux 下以.so结尾 开发插件其实就是开发一个动态 ...

  3. go 源码学习之---Tail 源码分析

    已经有两个月没有写博客了,也有好几个月没有看go相关的内容了,由于工作原因最近在做java以及大数据相关的内容,导致最近工作较忙,博客停止了更新,正好想捡起之前go的东西,所以找了一个源码学习 这个也 ...

  4. Asp.NetCore源码学习[2-1]:日志

    Asp.NetCore源码学习[2-1]:日志 在一个系统中,日志是不可或缺的部分.对于.net而言有许多成熟的日志框架,包括Log4Net.NLog.Serilog 等等.你可以在系统中直接使用这些 ...

  5. mybatis源码学习:一级缓存和二级缓存分析

    目录 零.一级缓存和二级缓存的流程 一级缓存总结 二级缓存总结 一.缓存接口Cache及其实现类 二.cache标签解析源码 三.CacheKey缓存项的key 四.二级缓存TransactionCa ...

  6. Mybatis源码学习第六天(核心流程分析)之Executor分析

    今Executor这个类,Mybatis虽然表面是SqlSession做的增删改查,其实底层统一调用的是Executor这个接口 在这里贴一下Mybatis查询体系结构图 Executor组件分析 E ...

  7. Java并发包源码学习之AQS框架(四)AbstractQueuedSynchronizer源码分析

    经过前面几篇文章的铺垫,今天我们终于要看看AQS的庐山真面目了,建议第一次看AbstractQueuedSynchronizer 类源码的朋友可以先看下我前面几篇文章: <Java并发包源码学习 ...

  8. Dubbo源码学习--注册中心分析

    相关文章: Dubbo源码学习--服务是如何发布的 Dubbo源码学习--服务是如何引用的 注册中心 关于注册中心,Dubbo提供了多个实现方式,有比较成熟的使用zookeeper 和 redis 的 ...

  9. HashMap的源码学习以及性能分析

    HashMap的源码学习以及性能分析 一).Map接口的实现类 HashTable.HashMap.LinkedHashMap.TreeMap 二).HashMap和HashTable的区别 1).H ...

随机推荐

  1. pip 国内源 gem 国内源

    清华: https://pypi.tuna.tsinghua.edu.cn/simple 豆瓣: http://pypi.douban.com/simple/ 阿里: http://mirrors.a ...

  2. 国内及Github优秀开发人员列表

    自从入了Android软件开发的行道,解决问题和学习过程中免不了会参考别人的思路,浏览博文和门户网站成了最大的入口.下面这些列表取名为:国内及Github优秀开发人员列表,就是浏览后的成果. 虽然下述 ...

  3. 《UML大战需求分析》阅读笔记5

    流程分析利器三,顺序图. 顺序图描述的是一件事发生的顺序,按照时间的发展,事情的走向,其中分为角色,消息等,每个角色下面都有一条生命线,从上到下,从左到右,依次进行事件,没有事情的时候用虚线表示,而有 ...

  4. IIS出现 分析器错误消息: 在应用程序级别之外使用注册为 allowDefinition='MachineToApplication' 的节是错误的

    这是因为发布的时候按了“生成部署包”

  5. oracle后台进程详解

    oracle后台进程伴随实例的启动而启动,他们主要是维护数据库的稳定,相当于一个企业中的管理者及内部服务人员.他们并不会直接给用户提供服务.   一:database write--数据写入  DBW ...

  6. c++:string函数

    string类的构造函数:string(const char *s);    //用c字符串s初始化string(int n,char c);     //用n个字符c初始化此外,string类还支持 ...

  7. Java学习笔记 05 数据包装类

    一.包装类 综述 >>java.lang包中的Integer类.Long类和Short类,分别将基本数据类型int.long和short封装成一个类.这些类都是Number的子类. Int ...

  8. 移动Web开发中遇见的问题以及解决方法(不断更新中)

    20160524 问题:在使用des加密数据后,作为url参数传递发现,系统会把+自动变为空格,以至于解密的时候出现问题. 例如:uKsRUwdU6+83+J9WfgfflA== 传到服务端后 变为u ...

  9. [UE4]自定义MovementComponent组件

    自定义Movement组件 目的:实现自定义轨迹如抛物线,线性,定点等运动方式,作为组件控制绑定对象的运动. 基类:UMovementComponent 过程: 1.创建UCustomMovement ...

  10. 解决VS2010子目录中的.cpp文件引用上一级目录的stdafx.h找不到定义的问题

    Source目录 |-- stdafx.h |--Util目录 |--Util.h |--Util.cpp 现在的发现Util.cpp各种变量的定义全是红色波浪线,找不到定义,但是却能够编译过 问题就 ...