这两天看了下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. java四种内部类

    内部类有成员内部类,局部内部类,匿名内部类,静态内部类. 1,成员内部类package innerClass; public class InnerClassTest { String s1=&quo ...

  2. 【洛谷P3076】Taxi

    这道题值得好好想一会 我们通过对一些小数据的手算,以及对于每段路程的拆分,可以发现: 1.每个st对应的ed这段路程无论如何都要算上 2.额外还要计算的一段路程,就是"切换"费用 ...

  3. redis cluster节点管理测试

    ####redis v3.2.0###添加节点:1.添加master节点 170 ./redis-trib.rb add-node 127.0.0.1:7007 127.0.0.1:7001 171 ...

  4. 解决Get请求的长度限制

    错误提示: HTTP Error 404.15 - Not Found The request filtering module is configured to deny a request whe ...

  5. TCP头部结构

    3.2 TCP头部结构 TCP头部信息出现在每个TCP报文段中,用于指定通信的源端端口,目的端端口,管理TCP连接等,本节详细介绍TCP的头部结构,包括固定头部结构和头部选项. 3.2.1 TCP固定 ...

  6. Win7 64下Visual C++ 6.0不兼容

    Win7 64下Visual C++ 6.0不兼容 安装VSE6.0: 1.运行setup.exe安装程序,会弹出如下的的 程序兼容性助手 提示框,这个是Win7在警告用户vc6存在兼容性问题:此程序 ...

  7. 使用Notepad++作为IDE代替Source Insight

    视图-->Folder as Workspace 视图-->函数列表 设置-->语言格式设置-->选择主题 插件-->Plugin Manager-->装上NppG ...

  8. MySQL的limit查询优化

    MySQL的limit查询优化以下的文章主要是对MySQL limit查询优化的具体内容的介绍,我们大家都知道MySQL数据库的优化是相当重要的.其他最为常用也是最为需要优化的就是limit.MySQ ...

  9. MongoDB初步(一)

    1.软件下载:mongodb-win32-x86_64-2008plus-ssl-3.4.1-signed.msi 2.下载补丁:hotfix kb2731284

  10. C#学习之Stream

    上节课老师主要讲了stream及其一些运用和实例,下面我们就来讨论讨论Stream. 我们知道,C#中常用的stream有文件流(FileSteam),内存流(MemoryStream),压缩流(GZ ...