初一看common包的代码吓了一跳,这么多scala文件!后面仔细一看大部分都是Kafka自定义的Exception类,简直可以改称为kafka.exceptions包了。由于那些异常类的名称通常都定义得很直观,笔者就不在一一赘述了。现在我们说说common包中其他的代码。

一、AppInfo.scala

这是一个object,实现了KafkaMetricsGroup trait。后者可以认为是一个创建各种度量元的工厂类。主要利用Yammer Metrics框架创建各种度量元,比如guage,meter,timer和histogram等。而在AppInfo object中只定义了一个方法:registerInfo

该方法没有返回值,它会首先判断是否已经注册过(isRegistered == true):如果已注册直接返回。之后判断这个类是否来自于jar包,如果不是的话也直接返回。最后程序创建一个Manifest对象并从中读取版本信息并使用该version信息创建一个guage。

二、ClientIdAndBroker.scala

发现kafka源代码中有很多类似于AAndB或AB这样的命名,基本上就是创建一个类,接收2个参数A和B的意思。这个scala文件也不例外,有两个case类:ClientIdAndBroker和ClientIdAllBrokers。基本上前者就是创建一个类保存一个clientId和一个broker;而后者给定一个clientId输出clientId-AllBrokers。

三、ClientIdTopic.scala

与ClientIdAndBroker.scala完全一样,只是这次保存的是(clientId, topic)的信息——元组对的方式非常有用,因为在后面Stats对象创建时会大量使用它们。

四、Config.scala

代码不复杂,就只是一个简单的trait,里面只有一个无返回值的方法: validateChars——目的也很简单就是验证给定的属性值里面有没有非法字符。目前只允许字母,数字,句点(.),下划线(_)以及横线(-)。其他字符都视为非法字符,一旦发现存储非法字符立即抛出异常。Producer和Consumer都有对应的config实现了这个Config trait。

五、ErrorMapping.scala

为common包中的每个异常做一个序号,并加入到一个Map中,同时提供很多方法可以双向检索——即根据序号返回异常实例或根据异常返回该异常序号

六、OffsetMetadataAndError.scala

该scala文件中提供了两组伴生对象:OffsetAndMetadata和OffsetMetadataAndError。我们先说第一组

OffsetAndMetadata object提供了三个常量字段:InvalidOffSet(-1)、NoMetadata("")以及InvalidTime(-1),主要用于出现错误时将OffsetAndMetadata字段的初始化。于是,同名的class构造器也接收三个参数: long型的位移信息、字符串表示的metadata信息以及一个时间戳。该class就提供了一个toString方法来格式化输出这个offset+metadata+timestamp的信息。

第二组OffsetMetadataAndError,从名字来说感觉就是offset+metadata+errorcode的风格。一看代码果不其然。OffsetMetadataAndError class的构造函数就是接收这三个参数。当然也提供了2个辅助构造函数只是用了很多的默认值,也没什么大不了的。asTuple方法就是将这三个字段打包成一个元组返回。toString就自不比说了。

定义了class之后,OffsetMetadataAndError object起到了工厂类的效果,实例化了4个类实例,分别是

NoOffset: 无效位移,无元数据(metadata),无错误异常

OffsetsLoading: 无效位移,无metadata,位移加载中异常

NotOffsetManagerForGroup: 无效位移,无metadata,consumer无对应coordinator异常

UnknownTopicOrPartition: 无效位移,无metadata,未知topic或分区ID不在有效范围内[0, numPartitions-1]

七、Topic.scala

刚看到Topic.scala时小小激动了一把。终于又看到与核心功能有点关联的代码了。本来预期Topic代码会很长,没想到并没有太多,只是简单地定义了一个object,几个字段加上一个方法就搞定了。名为Topic,其实更像是对Kafka topic的一个验证类。下面我们具体看一下。首先Topic的合法字符依然是字母、数字、句号,下划线和横线,另外topic最大长度不能超过255个字符。唯一的方法validate就是为给定的topic名做合法性检验。另外这个object中还维护了一个Set保存topic,后面在consumer的白名单、黑名单过滤时会用到。不过貌似这个集合只有一个topic:__consumer_offsets,而且整个kafka代码中也没有代码对其进行插入/删除操作,因此只是在内部使用的,正常的topic不应该加到这个Set中。

八、TopicAndPartition.scala

遵循以往的命名风格,这个类应该是同时保存一个topic和一个partition信息,并提供各种方式初始化该类实例,另外也提供了asTuple方法以元组的方式返回(topic, partition)

【原创】Kakfa common包源代码分析的更多相关文章

  1. 【原创】Kakfa cluster包源代码分析

    kafka.cluster包定义了Kafka的基本逻辑概念:broker.cluster.partition和replica——这些是最基本的概念.只有弄懂了这些概念,你才真正地使用kakfa来帮助完 ...

  2. 【原创】Kakfa message包源代码分析

    笔者最近在研究Kafka的message包代码,有了一些心得,特此记录一下.其实研究的目的从来都不是只是看源代码,更多地是想借这个机会思考几个问题:为什么是这么实现的?你自己实现方式是什么?比起人家的 ...

  3. 【原创】Kakfa log包源代码分析(二)

    八.Log.scala 日志类,个人认为是这个包最重要的两个类之一(另一个是LogManager).以伴生对象的方式提供.先说Log object,既然是object,就定义了一些类级别的变量,比如定 ...

  4. 【原创】Kakfa log包源代码分析(一)

    Kafka日志包是提供的是日志管理系统.主要的类是LogManager——该类负责处理所有的日志,并根据topic/partition分发日志.它还负责flush策略以及日志保存策略.Kafka日志本 ...

  5. 【原创】Kakfa network包源代码分析

    kafka.network包主要为kafka提供网络服务,通常不包含具体的逻辑,都是一些最基本的网络服务组件.其中比较重要的是Receive.Send和Handler.Receive和Send封装了底 ...

  6. 【原创】Kakfa api包源代码分析

    既然包名是api,说明里面肯定都是一些常用的Kafka API了. 一.ApiUtils.scala 顾名思义,就是一些常见的api辅助类,定义的方法包括: 1. readShortString: 从 ...

  7. 【原创】Kakfa metrics包源代码分析

    这个包主要是与Kafka度量相关的. 一.KafkaTimer.scala 对代码块的运行进行计时.仅提供一个方法: timer——在运行传入函数f的同时为期计时 二.KafkaMetricsConf ...

  8. 【原创】Kakfa serializer包源代码分析

    这个包很简单,只有两个scala文件: decoder和encoder,就是提供序列化/反序列化的服务.我们一个一个说. 一.Decoder.scala 首先定义了一个trait: Decoder[T ...

  9. 【原创】kafka producer源代码分析

        Kafka 0.8.2引入了一个用Java写的producer.下一个版本还会引入一个对等的Java版本的consumer.新的API旨在取代老的使用Scala编写的客户端API,但为了兼容性 ...

随机推荐

  1. C#版的eval,C#Light开源嵌入式脚本,unity热更新不再愁

    目前最新版本AlphaV0.06 完全的c#语法,可用于一切能运行C#的场合,wp windows xamarin mono asp.net unity3d 内嵌了int uint bool stri ...

  2. 使用mybatis访问sql server

    原创文章转载请注明出处:@协思, http://zeeman.cnblogs.com mybatis作为一种半自动化的ORM工具,可以提供更大的灵活性,逐渐受到社区的欢迎. 官方下载地址是:https ...

  3. svn 忽略文件不管用

    svn 不能对已添加过版本控制的文件进行忽略.于是乎,你会发先,你怎么忽略都不起作用.于是乎,该怎么办? svn忽略已添加到版本库文件或文件夹步骤: 将要忽略的文件或文件夹剪切到非工作拷贝目录. 在父 ...

  4. jQuery 绑定事件到动态创建的元素上

    在进入主题之前,我们先来看一个前台页面经常用到的功能:点击页面输入框时自动选择其中文本. 很容易想到利用输入框的focus事件,当输入框获得焦点时,再调用jQuery的select()方法. Okay ...

  5. as3commons-bytecode 获取所有类的一个BUG

    下载了这个swc,号称可以反射出所有加载的类.已经用在了spring. 可是一运行就报错,说bytearray.uncompress出错.操. 下载整个源码,单独加载as3commons-byteco ...

  6. 将网站添加到iPhone的主屏幕上

    我之前有篇文章介绍过如何将网站固定到Windows的开始菜单,并可以自定义图标.颜色以及Windows推送通知,其实Apple也有类似的功能,通过在网页的head部分添加link标记,在Safari浏 ...

  7. 博文写作——摘要&摘要图标

    问题描述: 写博文的时候,一个比较好的习惯就是在博文的开头用简短的文字介绍一下本篇博文的大致内容.在博客园系统里面,如果博文没有在指定的地方添加摘要内容,那么系统会自动截取博文的开始部分作为摘要.如下 ...

  8. EF架构~LinqToEntity里实现left join的一对一与一对多

    回到目录 对于linq to sql里实现left join我已经介绍过了,这篇文章的出现是由于最近在项目里遇到的一个问题,解决这个问题花了我不少时间,可能有2个小时,事件是这样的,对于两个表,它们是 ...

  9. 22.编写一个类A,该类创建的对象可以调用方法showA输出小写的英文字母表。然后再编写一个A类的子类B,子类B创建的对象不仅可以调用方法showA输出小写的英文字母表,而且可以调用子类新增的方法showB输出大写的英文字母表。最后编写主类C,在主类的main方法 中测试类A与类B。

    22.编写一个类A,该类创建的对象可以调用方法showA输出小写的英文字母表.然后再编写一个A类的子类B,子类B创建的对象不仅可以调用方法showA输出小写的英文字母表,而且可以调用子类新增的方法sh ...

  10. iOS----Xcode6或者Xcode7设置LaunchImage图标

    最近设置LaunchImage图标时发现怎么都没有效果,后来发现是Xcode6中新建项目的时候会默认添加一个LaunchScreen.xib的文件,我们启动程序的时候也会发现,加载的时LaunchSc ...