大数据技术Kafka详解:消息队列(Messages Queue)
一、Kafka概述
Kafka是由LinkedIn公司最初开发的一种分布式、支持分区(Partition)、多副本(Replica)的基于ZooKeeper协调的分布式消息系统。它以Scala语言编写,并于2010年由LinkedIn贡献给了Apache基金会,成为顶级开源项目。Kafka的最大特性是可以实时处理大量数据,以满足各种需求场景,如基于Hadoop的批处理系统、低延迟的实时系统、Storm/Spark流式处理引擎、Web/Nginx日志、访问日志、消息服务等。
二、Kafka的产生背景
在当今社会,各种应用系统诸如商业、社交、搜索、浏览等,像信息工厂一样不断生产出各种信息。在大数据时代,我们面临诸多挑战,如数据的实时处理、高并发访问、数据持久化存储等。这些挑战形成了一个业务需求模型,即生产者生产(Produce)各种信息,消费者消费(Consume)这些信息,而在生产者与消费者之间,需要一个沟通两者的桥梁------消息系统。从一个微观层面来说,这种需求也可理解为不同的系统之间如何传递消息。Kafka的诞生正是为了解决上述问题,它实现了生产者和消费者之间的无缝连接。
三、Kafka的特性
- 高吞吐量、低延迟:Kafka每秒可以处理几十万条消息,其延迟最低只有几毫秒。
- 可扩展性:Kafka集群支持热扩展,通过增加新的节点来提高系统的处理能力。
- 持久性、可靠性:消息被持久化到本地磁盘,并且支持数据备份防止数据丢失。
- 容错性:允许集群中节点失败(若副本数量为n,则允许n-1个节点失败)。
- 日志收集:Kafka可以用来收集各种服务的日志,通过Kafka以统一接口服务的方式开放给各种消费者,如Hadoop、HBase、Solr等。
- 消息系统:解耦生产者和消费者、缓存消息等。
- 用户活动跟踪:Kafka经常被用来记录Web用户或App用户的各种活动,如浏览网页、搜索、点击等活动,这些活动信息被各个服务器发布到Kafka的Topic中,然后订阅者通过订阅这些Topic来做实时的监控分析,或者装载到Hadoop、数据仓库中做离线分析和挖掘。
- 运营指标:Kafka也用来记录运营监控数据,包括收集各种分布式应用的数据,生产各种操作的集中反馈,如报警和报告。
- 流式处理:如Spark Streaming和Storm事件源。
- Consumer Group:各个Consumer可以组成一个组,每个消息只能被组中的一个Consumer消费,如果一个消息可以被多个Consumer消费的话,那么这些Consumer必须在不同的组。
- 消息持久化:Kafka中会把消息持久化到本地文件系统中,并且保持极高的效率。
- 消息有效期:Kafka会长久保留其中的消息,以便Consumer可以多次消费,当然其中很多细节是可配置的。
- 批量发送:Kafka支持以消息集合为单位进行批量发送,以提高push效率。
- Push-and-Pull:Kafka中的Producer和Consumer采用的是Push-and-Pull模式,即Producer只管向Broker push消息,Consumer只管从Broker pull消息,两者对消息的生产和消费是异步的。
四、Kafka的核心概念
-
架构详情
Kafka集群由多个Kafka实例组成,每个实例称为Broker。每个Kafka集群内的Broker都有一个不重复的编号。Broker负责接收来自Producer的消息,为消息设置偏移量,并提交消息到磁盘保存。Broker为消费者提供服务,对读取分区的请求做出响应,返回已经提交到磁盘的消息。
-
消息和批(Messages And Batches)
Kafka的基本数据单元被称为Message(消息),为减少网络开销,提高效率,多个消息会被放入同一批次(Batch)中后再写入。
-
主题和分区(Topics And Partitions)
Kafka的消息通过Topics(主题)进行分类,一个主题可以被分为若干个Partitions(分区),一个分区就是一个提交日志(Commit Log)。消息以追加的方式写入分区,然后以先入先出的顺序读取。Kafka通过分区来实现数据的冗余和伸缩性,分区可以分布在不同的服务器上,这意味着一个Topic可以横跨多个服务器,以提供比单个服务器更强大的性能。
-
生产者和消费者(Producers And Consumers)
- 生产者(Producer):负责创建消息。一般情况下,生产者在把消息均衡地分布到主题的所有分区上,而并不关心消息会被写到哪个分区。如果我们想要把消息写到指定的分区,可以通过自定义分区器来实现。
- 消费者(Consumer):是消费者群组的一部分,负责消费消息。消费者可以订阅一个或者多个主题,并按照消息生成的顺序来读取它们。消费者通过检查消息的偏移量(Offset)来区分读取过的消息。偏移量是一个不断递增的数值,在创建消息时,Kafka会把它添加到其中,在给定的分区里,每个消息的偏移量都是唯一的。
-
服务器和集群(Brokers And Clusters)
- Broker:一个独立的Kafka服务器。
- Cluster:集群,由多个Broker组成。每一个集群都会选举出一个Broker作为集群控制器(Controller),集群控制器负责管理工作,包括将分区分配给Broker和监控Broker。在集群中,一个分区(Partition)从属一个Broker,该Broker被称为分区的首领(Leader)。一个分区可以分配给多个Brokers,这个时候会发生分区复制。这种复制机制为分区提供了消息冗余,如果有一个Broker失效,其他Broker可以接管领导权。
五、Kafka的消息队列模式
Kafka是一个分布式的发布-订阅(Pub-Sub)消息系统。在发布-订阅系统中,消息被保留在主题中。消费者可以订阅一个或多个主题并使用该主题中的所有消息。消息生产者称为发布者,消息使用者称为订阅者。
Kafka使用了Pull模式:消费者采用轮询的方式定期去Kafka Broker中进行数据的检索,如果有数据就用来消费,如果没有就再继续轮询等待。
六、Kafka的应用场景
- 应用耦合:多应用间通过消息队列对同一消息进行处理,避免调用接口失败导致整个过程失败。
- 异步处理:多应用对消息队列中同一消息进行处理,应用间并发处理消息,相比串行处理,减少处理时间。
- 限流削峰:广泛应用于秒杀或抢购活动中,避免流量过大导致应用系统挂掉的情况。
- 消息驱动的系统:系统分为消息队列、消息生产者、消息消费者,生产者负责产生消息,消费者(可能有多个)负责对消息进行处理。
七、Kafka与其他消息队列的比较
- ActiveMQ:成熟稳定,社区活跃,支持多种消息协议,但在高并发或网络不稳定环境下存在较低概率的数据丢失风险,且单机吞吐量较低。
- RabbitMQ:提供了丰富的交换机类型,支持复杂的路由规则,能满足多样化的消息分发需求,但在集群配置与维护上相对繁琐。
- RocketMQ:高性能与低延迟,原生支持分布式事务消息,适合金融、电商等对性能、事务处理要求严苛的场景,但社区活跃度和第三方资源略逊于Kafka。
八、总结
Kafka作为一种高吞吐量的分布式发布订阅消息系统,具有高性能、持久化、多副本备份、横向扩展能力等特点,广泛应用于大数据处理、流计算、日志收集、消息服务等领域。通过对其核心概念和特性的深入了解,可以更好地利用Kafka解决各种实际问题。