Kafka -- 一、初识Kafka
初识Kafka
发布与订阅消息系统
- 业务开始的时候只是简单的想收集一些数据指标,但随着业务扩展和需要收集的指标维度增加,这个简单的数据收集也变得复杂
- 混沌的发布与订阅

- 为了解决这个混沌的系统,创建了一个独立的服务来接收各个业务的数据,并为下游提供查询服务,于是成了下面的样子

- 但是问题又来了,别的同事也有类似的需求,也在做同样的事情,数据被重复的处理

Kafka
Kafka就是一个独立的发布订阅系统,为了解决上述的问题,简单的说,Kafka支持对同一个数据流的多个发布者和多个订阅者(重复消费),下面介绍一些基础概念
- 消息和批次
- 消息:Kafka的数据单元,也可以看作是数据库中的一行数据,不过Kafka中消息没有格式要求
- 批次:一组消息,如果每个消息都单独的进行发送网络开销比较大,所以同一个主题和分区的消息会分批次的发送,所以在Kafka中不需要手动的进行批量推送(mysql就没有这个优化),不过会带来数据延时的问题,需要做平衡
- 模式:上面提到Kafka的消息没有格式上的要求,所以搞了个模式来定义消息内容,关系到数据的序列化、解析之类操作方式,所以不同的模式之间不一定兼容,常用的模式是apche Avro
- 主题和分区:可以理解为表和分区,Kafka会保证分区内的数据有序,但是一个消费者可以同时消费多个分区,所以如果有顺序需求的场景需要把数据放入同一个分区中,一个分区最多只能被一个消费者消费
- 生产者:消息的创建者,通常情况下,消息会被均衡地分布在分区中,如果有消息键写入指定分区的需求可以使用分区器,为消息键做散列来保证相同的键在相同的分区中,分区器支持自定义
- 消费者:
- 偏移量:消费者通过偏移量来区分已经读取过的消息,偏移量是一个递增整数,偏移量是按分区隔离的不能跨分区,偏移量会被保存在zookeeper或者Kafka中,消费者关闭或者重启偏移量不会丢失
- 消费者群组:多个消费者组成一个群组,每个分区只会被群组内的一个消费者读取,消费者和分区之间的映射叫所有权关系
- broker:一个独立的Kafka服务叫做broker,单个broker可以处理数千个分区已经每秒百万级的消息量
- 集群:由多个broker组成,每个集群都有一个broker充当集群控制器的角色(选举而来);在集群中一个分区从属于一个broker(首领),一个分区可以分配给多个broker,这个会发生分区复制,来提供消息冗余(备份)
- 保留消息:Kafka的一个重要特性,可以配置一定时间过期或者达到一定大小过期;所以Kafka消息重量不会超过配置大小
- 多集群:镜像数据类型分离、安全需求隔离、多数据中心(灾难恢复),Kafka消息复制机制只在单个集群内,多集群之间用mirrormaker来实现
为什么选择Kafka
- 多个生产者
- 多个消费者:支持多个消费者互不影响的消费一个消息流,消费者还可以组成群组来共享一个消息流
- 基于磁盘的数据存储:应对流量高峰数据可以根据策略持久化到本地,消费者也可以被关闭,消息会继续保存在Kafka中
- 伸缩性:可以通过扩展broker数量来形成集群,进而扩展可容纳的数据量,以及应对个别broker失效的情况
- 高性能:通过横向扩展生产者、消费者和broker,可以轻松处理巨大的消息流
