介绍
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在风控
发表回复