Kafka-初识

简介

kafka是一个分布式的发布订阅消息系统(或者说是一个分布式流平台),可以实时处理大数据。我们可以把kafka比作水管,水管中可以承载水流,那么kafka可以承载数据流。kafka可以构建实时的流数据管道,来处理大量的数据流。

消息系统

kafka是一个优秀的消息系统,支持持久化,更关注吞吐量,显式的分布式。

  1. 消息系统是什么?
    消息系统负责将数据从一个应用程序传递到另一个应用程序。
  2. 消息系统类型?
    点对点:消息生产者生产消息发送到queue中,然后消息消费者从queue中取出并且消费消息。消息被消费以后,queue中不再有存储,所以消息消费者不可能消费到已经被消费的消息。
    发布/订阅:消息生产者将消息发布到topic中,同时有多个消息消费者消费该消息。和点对点方式不同,发布到topic的消息会被所有订阅者消费。
  3. 消息系统的作用?
    异步处理
    如果一个系统进行一项操作,而这项操作非常耗时,那么引入这么一个消息系统,我们将这个操作扔到消息系统中,那么请求可以立即返回,由一个消费者去获取消息并这行操作,这样大大提升了响应效率。
    解耦
    可以作为异构系统之间共享数据的桥梁,消息发送方只需要关心发送数据,不需要关心谁来消费。
    冗余
    将消息持久化,避免丢失,如果消费者没有上线,那么数据也可以保存在消息系统中。
    顺序保证
    某些场景下需要保证数据的顺序性,那么消息队列在时间的维度上就是根据时间进行排序,保证了一定的顺序性。
  4. 应用场景
    日志处理
    流量削峰
    应用解耦
    数据集成
  5. 其他消息系统
    RabbitMQ:支持的协议多,非常重量级消息队列,对路由(Routing),负载均衡(Load balance)或者数据持久化都有很好的支持。
    ZeroMQ:号称最快的消息队列系统,尤其针对大吞吐量的需求场景,擅长的高级/复杂的队列,但是技术也复杂,并且只提供非持久性的队列。
    ActiveMQ:Apache下的一个子项,类似ZeroMQ,能够以代理人和点对点的技术实现队列 。
    Redis:是一个key-Value的NOSql数据库,但也支持MQ功能,数据量较小,性能优于RabbitMQ,数据超过10K就慢的无法忍受。

kafka的特点

吞吐量:kafka的主要设计约束是吞吐量而不是功能。同时为发布和订阅提供高吞吐量。

持久化:kafka将消息持久化到磁盘,因此可用于批量消费,例如 ETL,以及实时应用程序。通过将数据持久化到硬盘以及复制分区防止数据丢失。

分布式:kafka是个分布式系统,易于向外扩展。所有的 producer、broker 和 consumer 都会有多个,均为分布式的,无需停机即可扩展机器。

无状态:消息被处理的状态是在 consumer 端维护,而不是由 server 端维护。当失败时能自动平衡。这样也减轻了消息系统维护消息偏移的压力。

实时和离线:支持实时和离线的场景,可以用离线和实时系统提供数据。

kafka的架构模型

Kafka-初识
上图是kafka的基础架构模型。

kafka组成

Broker:kafa集群由一个或多个服务器实例构成,那么这些服务器实例则称为Broker,消息在Broker中通Log追加的方式进行持久化存储,并进行分区。
Topic:主题,每个消息都有对应的主题,相当于一种分类。
Partition:分区,每个主题的消息可以有多个分区,分区可以分布在一个或多个broker中,消息会通过负载均衡机制分散到不同的分区中。
Producer:生成者,一个生产者可以向一个主题发布消息。
Consumer:消费者,消费者可以从经纪人那里订阅一个或多个主题,并通过从经纪人那里提取数据来消费订阅的消息
Consumer Group:消费者组,一个消息只能被一个消费者组中的一个消费者消费。在一个消费者组中,一个消费者会对应一个分区,多出来的消费者将不会受到消息。
Replicas of partition:分区备份,kafka为了提高系统的高可用,可以设置为分区做备份。

Broker无状态机制

  1. Broker不保存订阅者的状态,由订阅者自己保存这样可以减轻服务器的压力。

  2. 无状态会导致消息的删除成为问题,broker不知道哪些消息时被消费过的,哪写没有被消费过。kafka采用基于时间的SLA(服务水平保证),消息保存一定时间(默认为7天)后会被删除。

  3. 消息订阅者可以rewind back到任意位置重新进行消费,当订阅者故障时,可以选择最小的offset(id)进行重新读取消费消息。

分区目的

  1. kafka基于文件存储。分区可以分布在多个broker上,通过分区,可以将数据日志分散到多个broker上,来避免文件大小达到单机磁盘的上限。

  2. 一个主题可以有多个分区,消息可以分布在不同的分区上。一个消费者组的多个消费者可以同时向不同的分区拉取消息,大大地提高了效率。