Kafka入门
消息队列
在高并发的应用场景中,由于来不及同步处理请求,接收到的请求往往会发生阻塞。例如,大量的插入、更新请求同时到达数据库,这会导致行或表被锁住,最后会因为请求堆积过多而触发“连接数过多的异常”(Too Many Connections)错误。因此,在高并发的应用场景中需要一个缓冲机制,而消息队列则可以很好地充当这样一个角色。
消息队列采用异步通信机制。即,消息的发送者和接收者无须同时与消息队列进行数据交互,消息会一直保存在队列中,直至被接收者读取。每一条消息记录都包含详细的数据说明,包括数据产生的时间、数据类型、特定的输入参数
消息队列的作用
- 应用解耦
- 异步处理
- 数据限流
- 异步通信
Kafka基本概念
Kafka是一个分布式实时处理流平台,可独立部署在单台机器上或者部署在多台机器上形成集群。
它提供了发布订阅功能,可以从Kafka集群读取数据或者保存数据到Kafka。
- 代理(broker)
在Kafka集群中,一个Kafka实例被称为一个代理(broker)节点。代理节点是消息队列常用的一个概念。 - Producer
Procucer 可以将指定消息发送到某个topic或者根据算法发送到指定partition - Consumer
Consumer消费者从指定topic读取消息记录。在读取Topic数据时需要设置GroupId 否则会默认生成一个GroupId
一个读取Kafka消息的实例可称为一个消费者。 - Consumer Group
消费者组。消费者程序在读取topic数据时,通常会使用多个线程来执行。一个消费者组可以包含一个或者多个消费者程序。使用多分区和多线程模式可以提供读取速度。
一般来说一个消费者对应一个线程。
出现背景:举个例子,现有这样一个场景:客户端从Kafka系统中读取消息记录,并且进行业务逻辑处理,最后将处理后的结果输出。
可以创建一个消费者程序来实现这样一个场景。但是,当生产者向Kafka系统主题写消息数据的速度比消费者读取的速度要快时,随着时间的增长,主题中的消息数据将出现越来越严重的堆积现象。
面对这类情况,通常可以增加多个消费者程序来水平扩展,从而解决这种堆积现象。
消费者组是Kafka系统提供的一种可扩展、高容错的消费者机制。 - topic
主题,主要用来区分不同业务类型的记录
Kafka系统中的数据最终还需要保存到磁盘进行持久化。为了区分不同的业务数据,数据库会有命名空间(即:数据库名),每个命名空间下又有若干个表。
在Kafka系统中,为了区分业务数据,设计了“主题”这个概念。将不同类型的消息数据按一定的规则进行分类,最后将相同类型的业务数据存储到同一个主题中 - Partition
分区。一个Topic可以有多个partition。在Kafka设计思想中,partition对应物理层面,不同分区对应不同文件。
每个分区对应的消息是有序的。每个消息在各自的分区上对应不同的数据偏移量offset。
在Kafka系统中,为何要在主题中加入分区和副本的概念呢?“主题”是一个逻辑概念,而“分区”则是一个物理概念。
一个partition只对应一个Broker,一个Broker可以包含不同Partition.
从性能方面来说,如果主题内消息数据只存储在一个代理节点,那该节点将很快会成为Kafka集群的瓶颈,无法实现水平扩展。因此,把主题内的消息数据分布到整个Kafka集群就是一件很重要的事情,而分区的引入则很好地解决了水平扩展的问题。
Topic 的每个partition可以被认为是一个无限长度的数组,新来的消息数据可以有序地追加到该数组上。从物理意义上讲,每个partition对应一个文件夹。一个Kafka代理节点上可以存放多个partition。这样,Producer可以将消息数据发送到多个broker上的多个partition,Consumer也可以并行地从多个代理节点上的不同partition获取数据,实现水平扩展. - Replication
副本。每个Topic在创建的时候都会有指定的副本数。默认是1.来保证Kafka系统的高可用性。
一个主题拥有多个副本,可以很好地避免数据丢失的风险 - Record
记录。写到Kafka集群,并可被消费者读取的信息称为record。
每条记录包含一个key ,value ,timestamp.
kafka 应用场景
- Messaging
消息系统。如同ActiveMQ RabbitMQ - website activity tracking
网站活动估计追踪 - Metrics
可以用来监控数据 - Log Aggregation
日志收集 - Stream Processing
实时流处理
Kafka4种核心API
Kafka有四个核心APIs.
即:生产者,消费者,连接器,实时处理器
注意
在 Kafka系统中,主题的partition只能增加不能减少。