当前位置: 首页 > news >正文

日志分析系统——Hangout源码学习

这两天看了下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();

类图

449064-20160628212634781-1648146751.png

流程图

449064-20160628212608734-1760192645.png

相关文章:

  • spring boot 调试 - 热部署
  • 阿里云服务器Linux CentOS安装配置(零)目录
  • 数据结构 树 相关面试试题
  • zabbix Maintenance维护周期
  • [CentOs7]图形界面
  • Kafka问题排查(消费者自动关闭)
  • 手把手之STM32GPIO
  • iOS 读取plist 方法
  • json恶补
  • mybatis实战教程(mybatis in action)之三:实现数据的增删改查
  • 在代码中修改TextView的DrawableRight图片
  • MongoDB-基础-limit-skip-sort
  • Python 安装模块 模块搜索路径
  • Android第三十天
  • nbsp
  • 分享一款快速APP功能测试工具
  • 收藏网友的 源程序下载网
  • [译]前端离线指南(上)
  • 002-读书笔记-JavaScript高级程序设计 在HTML中使用JavaScript
  • Android Studio:GIT提交项目到远程仓库
  • docker-consul
  • javascript 总结(常用工具类的封装)
  • jquery cookie
  • log4j2输出到kafka
  • PAT A1050
  • PhantomJS 安装
  • Rancher-k8s加速安装文档
  • ubuntu 下nginx安装 并支持https协议
  • vue-loader 源码解析系列之 selector
  • web标准化(下)
  • 给自己的博客网站加上酷炫的初音未来音乐游戏?
  • 后端_ThinkPHP5
  • 技术发展面试
  • 看域名解析域名安全对SEO的影响
  • 马上搞懂 GeoJSON
  • 前端攻城师
  • 入手阿里云新服务器的部署NODE
  • 使用putty远程连接linux
  • ​直流电和交流电有什么区别为什么这个时候又要变成直流电呢?交流转换到直流(整流器)直流变交流(逆变器)​
  • #if #elif #endif
  • $L^p$ 调和函数恒为零
  • (5)STL算法之复制
  • (二)正点原子I.MX6ULL u-boot移植
  • (附源码)springboot 房产中介系统 毕业设计 312341
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (一)u-boot-nand.bin的下载
  • (译) 函数式 JS #1:简介
  • (转)IOS中获取各种文件的目录路径的方法
  • .libPaths()设置包加载目录
  • .NET 4.0中的泛型协变和反变
  • .net core 6 redis操作类
  • .net mvc actionresult 返回字符串_.NET架构师知识普及
  • .net 程序发生了一个不可捕获的异常
  • .Net开发笔记(二十)创建一个需要授权的第三方组件
  • @JoinTable会自动删除关联表的数据