kafka作为一款开源的消息引擎系统,主要功能提供提供完备的消息发布和订阅的解决方案。它的消息传递属性,就像引擎,具备某种转化能量的能力。
根据维基百科的定义,kafka是一组消息规范,企业利用在这组规范在不同系统间,传递精确语义定义的消息,实现松耦合的异步式数据传递。
消息引擎最基础的功能:传递对象是消息;如何传递消息。
支持两种消息引擎模型:点对点;发布订阅模型。
消息引擎的作用:
削峰填谷:缓冲上下游瞬时突发流量,使其平滑。一般,上游的TPS高于下游,使得下游服务无法即时处理上游消息。
让两个系统之间实现松耦合,较少不必要的系统交互。
专业术语解释:
主题(Topic):发布与订阅的对象,可以为每个业务、每个应用、或者每类数据定义一个主题。
生产者(producer):向主题发布消息的客户端应用程序。
消费者(consumer):订阅主题消息的客户端应用程序。
生产者和消费者统称为客户端。
对应于客户端,kafka的服务器端由被称为broker的服务进程构成。即一个kafka集群由多个broker组成,每个broker负责接收和处理客户端的请求,以及消息持久化。
高可用性:1. broker一般分布在多台机器上,这样只要有一台机器宕机,其他机器仍可对外提供服务。
2. 备份机制:相同数据拷贝在不同机器,每个备份叫做副本,leader副本和follower副本。
副本工作机制:生产者向leader副本写消息,消费者从leader副本读消息,follower副本向leader副本发送请求,请求leader副本将消息发给它,以保持与领导者同步。
伸缩性:分区机制(partitioning),每个主题分为多个分区,每个分区是一组有序的消息日志,每条消息只会被发送到一个分区。kafka分区编号从0开始,分区位移(offset)也是从0开始。
kafka的三层消息架构:
主题层:每个主题分为多个分区,每个分区有多个副本。
分区层:每个分区的多个副本,只能有一个leader,对外提供服务,其他的是follower,提供数据冗余之用。
消息层:每个分区由若干消息组成, 消息位移从0开始。
怎样持久化数据:kafka使用消息日志保存消息,一个消息日志就是磁盘上只能被追加写的物理文件。追加写,避免了缓慢的随机IO操作,改为性能较好的顺序IO写操作(高吞吐量的手段之一)。每个消息日志,进一步分为多个日志段,消息被追加写道当前最新日志段,写满即封存,开启新的日志段。kafka在后天定期检查老的日志段,过期的就删除,实现磁盘空间回收。
kafka实现点对点模型是通过消费者组机制,多个消费者实例构成一个消费者组,消费一个主题,其中主题的每个分区只能被一个消费者实例消费。这样,多个消费者实例同时消费消息,增加了消费端的吞吐量(TPS)。
消费者组中的实例不仅可以瓜分订阅主题的数据,还彼此协助,即当某个消费者实例挂掉,kafka自动检测,把挂掉消费者实例消费的分区转移给其他的分区。被称为重平衡(rebalance)。
kafka仅仅是消息引擎吗?
kafka设计之初,旨在提供三方面特性:提供一套API实现生产者和消费者;降低网络传输和磁盘存储开销;实现高伸缩性架构。
apache kafka 是消息引擎系统,也是分布式流处理平台。与其他主流大数据流式计算框架,有两点优势:端到端的正确性;对于自己流式计算的定位。
另外,kafka还可以用作分布式存储系统。
kafka组织:apache kafka; confluent kafka; CDH kafka和HDP kafka。
如果仅仅需要一个消息引擎系统亦或简单的流处理应用场景,同时需要对系统有较大的把控度,推荐使用apache kafka;
如果需要kafka的一些高级特性,推荐使用confluent kafka;
如果需要快速搭建消息引擎系统,或者需要构建多框架构成的数据平台且kafka只是其中一个组件,推荐使用第三者。
kafka版本演进:
比如:
kafka_2.11-2.1.1,真正版本号2.1.1, 2-大版本号,major version,中间的1-小版本号,minor version, 后面的1-修订版本号,patch号。“大版本号-小版本号-Patch号”。
kafka目前演进了7个大版本,0.7、0.8、0.9、0.10、0.11、1.0、2.0。
0.7版本:只提供基础的消息队列功能,连基本的副本机制都没有。
0.8版本:引入副本机制,成为一个真正意义的完备的分布式高可靠消息队列解决方案。使用的是老版本的客户端API,在开发生产者和消费者,需指定Zookeeper地址而非Broker地址。在0.8.2.0中开始引入新版本Producer API,需指定Broker地址的Producer。如果还在用0.8.1.1、0.8.2,建议升级到0.8.2.2,消费者API比较稳定,但不要用新版本Producer API。
0.9.0.0:增加了基础的安全认证/权限功能,同时使用JAVA重写了新版本消费者API,还引入了kafka connect组件(实现高性能的数据抽取)。新版本的Producer API比较稳定,但不要使用新版本consumer API。
0.10.0.0:引入kafka streams,kafka正式升级为分布式流处理平台,但还基本不能线上部署。新版本的consumer API比较稳定。
0.11.0.0:提供幂等性Producer API,以及事务API,对kafka消息格式重构。
1.0和2.0:主要在kafka streams的各种改进。在消息引擎方面并未有太多变化。
建议:尽量保证服务器端和客户端版本一致,否则会损失很多性能优化效益。
标注:这个系列文章是本人在极客时间专栏---kafka核心技术与实战中的学习笔记
https://time.geekbang.org/column/article/101171