介绍
Kafka 是一种分布式公布 - 订阅音讯零碎。它最后由 LinkedIn 公司开发,之后成为 Apache 我的项目的一部分。Kafka 是一个分布式的,可划分的,冗余备份的持久性的日志服务。它次要用于解决沉闷的流式数据。
提供了相似于 JMS 的个性,然而在设计实现上齐全不同。
JMS
JMS(Java Message Service,Java 音讯服务)API 是一套音讯服务的规范,容许应用程序组件基于 JavaEE 平台创立、发送、接管和读取音讯。
零碎间异步通信,升高零碎间耦合度。
反对两种音讯模型
- 点对点或队列模型
- 发布者 / 订阅者模型
Kafka 总体架构
基本概念
Topic:Kafka 将音讯种子(Feed) 分门别类,每一类的音讯称之为一个主题。
Producer:公布音讯的对象称之为主题生产者。
Consumer:订阅音讯并解决公布的音讯的种子的对象称之为主题消费者。
Broker:已公布的音讯保留在一组服务器中,称之为 Kafka 集群。集群中的每一个服务器都是一个代理(Broker). 消费者能够订阅一个或多个主题并从 Broker 拉数据,从而生产这些已公布的音讯。
Partition:Topic 物理上的分组,一个 topic 能够分为多个 partition,每个 partition 是一个有序的队列。partition 中的每条音讯都会被调配一个有序的 id(offset)。
工作流程
Topic
对于每一个 Topic,Kafka 集群保护这一个分区的 log,音讯存储在日志文件中;
每一个分区都是一个程序的、不可变的音讯队列,并且能够继续的增加。分区中的音讯都被分赔了一个序列号,称之为偏移量 (offset),在每个分区中此偏移量都是惟一的;
Kafka 集群会将音讯保留一段时间(可配置),无论音讯是否被生产,到期后才删除,消费者仅持有音讯的偏移量。
偏移量有消费者管制,消费者能够将偏移量重置为更老的一个偏移量,从新读取音讯,所以一个消费者的操作不会影响其它消费者对此 log 的解决。
Partition
分区是物理上的一个概念,在 Broker 上以目录的模式存在,每个分区下蕴含多个段 (Segment),每个 Segment 对应一个日志文件,文件的命名为音讯的 offset。
Topic 的分区被散布到集群中的多个服务器上,每个服务器解决它分到的分区。
依据配置每个分区能够设置多个备份(replicas),复制到其它服务器作为备份容错。
每个分区有一个 leader,零或多个 follower。Leader 解决此分区的所有的读写申请,而 follower 被动的复制数据。如果 leader 宕机,其它的一个 follower 会被推举为新的 leader。
leader 负责跟踪所有的 follower 状态, 如果 follower“落后”太多或者生效,leader 将会把它从 replicas 同步列表中删除。当所有的 follower 都将一条音讯保留胜利,此音讯才被认为是“committed”,那么此时 consumer 能力生产它。
一台服务器可能同时是一个分区的 leader,另一个分区的 follower。这样能够均衡负载,防止所有的申请都只让一台或者某几台服务器解决。
Producer
生产者往某个 Topic 上公布音讯,同时生产者也负责抉择公布到 Topic 上的哪一个分区(发给分区的 Leader);
音讯发送策略分为同步、异步两种;
音讯被路由到哪个 partition 上,是由 producer 客户端决定的. 比方客户端采纳 Random,Hash 及 RoundRobin 轮询等;
Consumer
通常来讲,音讯模型能够分为两种,队列和公布 - 订阅式。Kafka 为这两种模型提供了繁多的消费者形象模型:消费者组(consumer group),消费者用一个消费者组名标记本人。
一个公布在 Topic 上音讯被分发给此消费者组中的一个消费者。如果所有的消费者都在一个组中,那么这就变成了 queue 模型;如果所有的消费者都在不同的组中,那么就齐全变成了公布 - 订阅模型。
咱们能够创立一些消费者组作为逻辑上的订阅者。每个组蕴含数目不等的消费者,一个组内多个消费者能够用来扩大性能和容错。
Kafka 的设计
高吞吐量,高可用是其外围设计指标。
数据磁盘长久化:音讯不在内存中 cache,间接写入到磁盘,充分利用磁盘的程序读写性能。
zero-copy:缩小 IO 操作步骤(磁盘 -> 内核 -> 网卡)。
反对数据批量发送和拉取。
反对数据压缩。
Topic 划分为多个 partition,进步并行处理能力。
程度扩大。
音讯队列比照
利用场景
实用场景:
- 用户行为数据分析
- 经营监控
- 日志收集
- 音讯零碎
不实用场景:
- 须要事物反对;
- 严格的程序生产。
Kafka 在风控