Kafka

69 阅读4分钟

什么是Apache Kafka?

Apache Kafka 是由Apache开发的一种发布订阅消息系统,它是一个分布式的,分区的和重复的日志服务

Kafka适合什么样的场景?

它可以用于两大类别的应用:

1.  构造实时流数据管道,它可以在系统或应用之间可靠地获取数据。 (相当于message queue)
2.  构建实时流式应用程序,对这些流数据进行转换或者影响。 (就是流处理,通过kafka stream topic和topic之间内部进行变化)

Kafka有四个核心的API:

  • [Producer API] 允许一个应用程序发布一串流式的数据到一个或者多个Kafka topic。
  • [Consumer API] 允许一个应用程序订阅一个或多个 topic ,并且对发布给他们的流式数据进行处理。
  • [Streams API] 允许一个应用程序作为一个流处理器,消费一个或者多个topic产生的输入流,然后生产一个输出流到一个或多个topic中去,在输入输出流中进行有效的转换。
  • [Connector API] 允许构建并运行可重用的生产者或者消费者,将Kafka topics连接到已存在的应用程序或者数据系统。比如,连接到一个关系型数据库,捕捉表(table)的所有变更内容。

Kafka的架构

image.png

  • Producer: 生产者可以将数据发布到所选择的topic(主题)中。生成者负责将记录分配到topic的哪一个分区(partition)中,这里可以使用对多个partition循环发送来实现多个server负载均衡
  • Broker:日志的分区(partition)分布在Kafka集群的服务器上。每个服务器处理数据和请求时,共享这些分区。每一个分区都会在以配置的服务器上进行备份,确保容错性。
  • Consumer: 消费者使用一个group(消费组)名称来表示,发布到topic中的每条记录将被分配到订阅消费组中的其中一个消费者示例。消费者实例可以分布在多个进程中或多个机器上

传统的消息传递方法?

排队:在队列中,一组用户可以从服务器中读取消息,每条消息都发送给其中一人
发布-订阅:在这个模型中,消息被广播给所有用户。

Kafka相较于传统的消息传递方法有什么优势?

 高性能:单一的Kafka代理可以处理成千上万的客户端,每秒处理数兆字节的读写操作,kafka性能远超过传统的ActiveMQ、RabbitMQ等,而且Kafka支持Batch操作
 可扩展:Kafka集群可以透明的扩展,增加新的服务器进集群
 容错性:Kafka每个Partions数据会复制到几台服务器,当某个Broker失效时,Zookeeper将通知生产者和消费者从而使用其他的Broker;
 

Kafka服务器能接受到最大信息是多少?

Kafka服务器可以接收到的消息最大大小是1000000字节。

Kafka中的Zookeeper是什么?Kafka是否可以脱离Zookeeper独立运行?

Zookeeper是一个开放源码的、高性能的协调服务,它用于Kafka的分布式应用

不可以,不可能越过zk直接联系Kafka broker,一旦Zk停止工作,它就不能服务客户端请求。

zk主要用于在集群中不同节点之间进行通信,在Kafka中,它被用作提交偏移量,因此如果节点在任何情况下都失败了,它都可以从之前提交的偏移量中获取,除此之外,它还执行其他活动 如leader检测,分布式同步,配置管理、识别新节点何时离开或连接、集群、节点实时状态等等

Kafka的用户如何消费信息?

在Kafka中传递消息是通过使用sendfile API完成的。它支持将字节Socket转移到磁盘,通过内核空间保存副本,并在内核用户之间调用内核

如何提高远程用户的吞吐量?

如果用户位于与broker不同的数据中心,则可能需要调优Socket缓冲区大小,以对长网络延迟进行摊销。

在数据制作过程中,如何能从Kafka得到准确的信息

在数据中,为了精确地获得Kafka的消息,必须遵循两件事:在数据消耗期间避免重复,在数据生产避免重复
这里有两种方法,可以在数据生成时准确地获得一个语义:
每个分区使用一个单独的写入器,每当你发现一个网络错误,检查该分区中的最后一条消息,以查看您的最后一次写入是否成功
在消息中包含一个主键(UUID或其他)

请说明Kafka 的消息投递保证(delivery guarantee)机制以及如何实现?
Kafka支持三种消息投递语义:
① At most once 消息可能会丢,但绝不会重复传递
② At least one 消息绝不会丢,但可能会重复传递
③ Exactly once 每条消息肯定会被传输一次且仅传输一次,很多时候这是用户想要的