Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写。Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动)是在现代网络上的许多社会功能的一个关键因素。 这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决。 对于像Hadoop的一样的日志数据和离线分析系统,但又要求实时处理的限制,这是一个可行的解决方案。Kafka的目的是通过Hadoop的并行加载机制来统一线上和离线的消息处理,也是为了通过集群来提供实时的消息。
?
基本组件:
-
Broker 消息中间件处理节点,一个Kafka节点就是一个Broker,一个或者多个Broker可以组成一个Kafka集群 -
Topic 每条发布到Kafka集群的消息都有一个类别,这个类别被称为Topic。(物理上不同Topic的消息分开存储,逻辑上一个Topic的消息虽然保存于一个或多个broker上但用户只需指定消息的Topic即可生产或消费数据而不必关心数据存于何处) -
Partition 用于存放消息的队列,存放的消息都是有序的,同一主题可以分多个Partition,如分多个Partiton时,同样会以如partition1存放1、3、5消息,partition2存放2、4、6消息 -
Producer 消息生产者,向Broker发送消息的客户端 -
Consumer 消息消费者,从Broker读取消息的客户端,Consumer是通过offset进行标识消息被消费的位置 -
Consumer Group 每个Consumer属于一个特定的Consumer Group,一条消息可以发送到多个不同的Consumer Group,但是同一个Consumer Group中只能有一个Consumer能够消费该消息
主要特性:
-
快速持久化:可以在 O(1) 的系统开销下进行消息持久化 -
高吞吐:在一台普通的服务器上既可以达到10W/s的吞吐速率 -
完全的分布式系统:Broker、Producer和Consumer都原生自动支持分布式,自动实现负载均衡 -
零拷贝技术(zero-copy):减少IO操作步骤,提高系统吞吐量 -
支持同步和异步复制两种高可用机制 -
丰富的消息拉取模型,支持数据批量发送和拉取 -
数据迁移、扩容对用户透明 -
无需停机即可扩展机器 -
高效订阅者水平扩展、实时的消息订阅、亿级的消息堆积能力、定期删除机制
如何实现延时消息:
原生Kafka默认是不支持延时消息的,需要开发者自己实现一层代理服务,比如发送端将消息发送到延时Topic,代理服务消费延时Topic的消息然后转存起来,代理服务通过一定的算法,计算延时消息所附带的延时时间是否到达,然后将延时消息取出来并发送到实际的Topic里面,消费端从实际的Topic里面进行消费。
Mafka-接入指南
Q&A
-
为什么Kafka更适合pull模式? “作为一个消息系统,Kafka遵循了传统的方式,选择由 Producer 向 Broker Push 消息并由 Consumer 从 Broker Pull 消息。一些 logging-centric system,比如 Facebook 的Scribe和 Cloudera 的Flume,采用Push模式。事实上,Push模式和Pull模式各有优劣。Push 模式很难适应消费速率不同的消费者,因为消息发送速率是由Broker决定的。Push 模式的目标是尽可能以最快速度传递消息,但是这样很容易造成 Consumer 来不及处理消息,典型的表现就是拒绝服务以及网络拥塞。而Pull 模式则可以根据Consumer 的消费能力以适当的速率消费消息。对于Kafka而言,Pull 模式更合适。Pull 模式可简化 Broker 的设计,Consumer可自主控制消费消息的速率,同时Consumer可以自己控制消费方式(即可批量消费也可逐条消费),同时还能选择不同的提交方式从而实现不同的传输语义。”
|