`
san_yun
  • 浏览: 2638236 次
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

kafka简单介绍

    博客分类:
  • mq
 
阅读更多

kafka是什么

kafka是LinkedIn开发并开源的一个分布式MQ系统,现在是Apache的一个孵化项目。在它的主页描述kafka为一个高吞吐量的分布式(能将消息分散到不同的节点上)MQ。在这片博文中,作者简单提到了开发kafka而不选择已有MQ系统的原因。两个原因:性能和扩展性。这里做适当解释。

基本上目前绝大多数(如果不是所有的)MQ系统都是针对企业集成应用设计的,而不是针对大规模Service应用设计的。两者有什么区别?

企业集成的基本特点是把企业中现存的本不相干的各种应用进行集成。例如:一个企业可能想把财务系统和仓管系统进行集成,减少部门间结算和流通的成本 和时间,并能更好的支持上层决策。但这两个系统是由不同的厂家做的,不能修改。另外企业集成是一个持续渐进的过程,需求变化非常频繁。这对MQ系统的要求 是要非常灵活,可定制性要求高。所以常见的MQ系统通常都可以通过复炸的xml配置或插件开发进行定制以适应不同企业的业务流程的需要。他们大多数都能通 过配置不同程度的支持EIP中定义一些模式。但设计目标并没有很重视扩展性和性能,因为通常企业级应用的数据流和规模都不会非常大。即使有的比较大,使用 高配置的服务器或做一个简单几个节点的集群就可以满足了。

大规模的service是指面向公众的向facebook,google,linkedin和taobao这样级别或有可能成长到这个级别的应用。 相对企业集成来讲,这些应用的业务流程相对比较稳定。子系统间集成的业务复杂度也相对较低,因为子系统通常也是经过精心选择和设计的并能做一定的调整。所 以对MQ系统的可定制性及定制的复杂性要求并不高。但由于数据量会非常巨大,不是几台Server能满足的,可能需要几十甚至几百台,且对性能要求较高以 降低成本,所以MQ系统需要有很好的扩展性。

kafka正是一个满足SaaS要求的MQ系统,它通过降低MQ系统的复杂度来提高性能和扩展性。

2. kafka的设计

kafka的设计文档详细说明了它的设计思路。这里简单列举并讨论一下。

基本概念

kafka的工作方式和其他MQ基本相同,只是在一些名词命名上有些不同。为了更好的讨论,这里对这些名词做简单解释。通过这些解释应该可以大致了解kafka MQ的工作方式。

  • Producer (P):就是网kafka发消息的客户端
  • Consumer (C):从kafka取消息的客户端
  • Topic (T):可以理解为一个队列
  • Consumer Group (CG):这是kafka用来实现一个topic消息的广播(发给所有的consumer)和单播(发给任意一个consumer)的手段。一个 topic可以有多个CG。topic的消息会复制(不是真的复制,是概念上的)到所有的CG,但每个CG只会把消息发给该CG中的一个 consumer。如果需要实现广播,只要每个consumer有一个独立的CG就可以了。要实现单播只要所有的consumer在同一个CG。用CG还 可以将consumer进行自由的分组而不需要多次发送消息到不同的topic。
  • Broker (B):一台kafka服务器就是一个broker。一个集群由多个broker组成。一个broker可以容纳多个topic。
  • Partition(P):为了实现扩展性,一个非常大的topic可以分布到多个broker(即服务器)上。kafka只保证按一个partition中的顺序将消息发给consumer,不保证一个topic的整体(多个partition间)的顺序。

可靠性(一致性)

MQ要实现从producer到consumer之间的可靠的消息传送和分发。传统的MQ系统通常都是通过broker和consumer间的确认 (ack)机制实现的,并在broker保存消息分发的状态。即使这样一致性也是很难保证的(参考原文)。kafka的做法是由consumer自己保存 状态,也不要任何确认。这样虽然consumer负担更重,但其实更灵活了。因为不管consumer上任何原因导致需要重新处理消息,都可以再次从 broker获得。

kafka的producer有一种异步发送的操作。这是为提高性能提供的。producer先将消息放在内存中,就返回。这样调用者(应用程序) 就不需要等网络传输结束就可以继续了。内存中的消息会在后台批量的发送到broker。由于消息会在内存呆一段时间,这段时间是有消息丢失的风险的。所以 使用该操作时需要仔细评估这一点。

另外,在最新的版本中,还实现了broker间的消息复制机制,去除了broker的单点故障(SPOF)。

扩展性

kafka使用zookeeper来实现动态的集群扩展,不需要更改客户端(producer和consumer)的配置。broker会在 zookeeper注册并保持相关的元数据(topic,partition信息等)更新。而客户端会在zookeeper上注册相关的watcher。 一旦zookeeper发生变化,客户端能及时感知并作出相应调整。这样就保证了添加或去除broker时,各broker间仍能自动实现负载均衡。

负载均衡

负载均衡可以分为两个部分:producer发消息的负载均衡和consumer读消息的负载均衡。

producer有一个到当前所有broker的连接池,当一个消息需要发送时,需要决定发到哪个broker(即partition)。这是由 partitioner实现的,partitioner是由应用程序实现的。应用程序可以实现任意的分区机制。要实现均衡的负载均衡同时考虑到消息顺序的 问题(只有一个partition/broker上的消息能保证按顺序投递),partitioner的实现并不容易。个人认为这一点还有待改进。

consumer读取消息时,除了考虑当前的broker情况外,还要考虑其他consumer的情况,才能决定从哪个partition读取消息。具体的机制还不是很清楚,需要做更深入的研究。

性能

性能是kafka设计重点考虑的因素。使用多种方法来保证稳定的O(1)性能。

kafka使用磁盘文件保存收到的消息。它使用一种类似于WAL(write ahead log)的机制来实现对磁盘的顺序读写,然后再定时的将消息批量写入磁盘。消息的读取基本也是顺序的。这正符合MQ的顺序读取和追加写特性。

另外,kafka通过批量消息传输来减少网络传输,并使用java中的sendfile和0拷贝机制减少从读取文件到发送消息间内存数据拷贝和内核用户态切换的次数。

根据kafka的性能测试报告,它的性能基本达到了O(1)的复杂度。

3. 总结

从以上来看,个人觉得kafka比较适合用来做简单的消息传递和分发,能支持大数据量。但如果需要实现复杂的EIP模式,则不像传统MQ那么容易。 而且,因为只有partition内的消息才能保证传递顺序,如果消息的顺序很重要,又需要很好的扩展性,使用kafka实现可能会比较困难。所 以,kafka应该比较适合处理简单的事件和消息,例如数据(log)收集,大量事实数据的实时分析(kafka可与MapReduce集成)。

分享到:
评论

相关推荐

    kafka的安装和简单实例测试

    接下来,我们将详细介绍Kafka的安装步骤: 1. **下载Kafka安装包**:首先确保已经下载了Kafka的安装包`kafka_2.10-0.10.1.0.tgz`到用户的下载目录下。 2. **解压安装包**:使用命令`sudo tar –zxf kafka_2.10-...

    Kafka技术内幕:图文详解Kafka源码设计与实现+书签.pdf+源码

    7. **连接器(Connectors)和流处理(Kafka Streams)**:Kafka Connect允许用户方便地集成其他系统,如数据库,而Kafka Streams则提供了一种在Kafka之上进行流处理的API,使得实时分析和复杂事件处理变得简单。...

    kafka安装包-2.13-3.6.2

    **Kafka介绍** Apache Kafka是一款高性能、分布式的消息中间件,由LinkedIn开发并捐献给Apache软件基金会。它最初设计的目标是构建一个实时的数据管道,能够高效地处理大量的数据流,同时支持发布订阅和队列模型,...

    kafka2种工具 kafkatool-64bit.exe kafka-eagle-bin-1.4.6.tar.gz

    本文将围绕标题和描述中提到的两种Kafka工具——kafkatool-64bit.exe和kafka-eagle-bin-1.4.6.tar.gz进行详细介绍,帮助读者理解它们的功能和用途。 首先,我们来看kafkatool-64bit.exe,这是一个开箱即用的Kafka...

    Kafka中文api使用介绍+配置

    API章节会详细介绍不同版本的生产者和消费者的API使用方法,包括老的上层消费者API和老的简单消费者API,以及新的消费者API。这些API允许开发者在他们的应用程序中实现Kafka消息的生产和消费。 流处理API(Streams ...

    Kafka .Net Framework4.0 版本

    本篇将详细介绍Kafka .Net Framework 4.0版本以及其相关知识点。 首先,Kafka .Net是.NET社区开发的一个C#和F#接口,它为.NET开发者提供了与Kafka集群通信的便利。这个库允许开发者发送和接收消息,管理主题和分区...

    可视化kafka测试工具

    本文将详细介绍一款可视化Kafka测试工具,该工具能够简化Kafka消息的生产和消费过程,并提供直观的界面来帮助我们理解Kafka的工作原理。 **工具介绍** 这款可视化Kafka测试工具的主要功能是模拟发送Topic消息到...

    kafka-2.12-3.6.1.tgz

    本文将详细介绍如何在Linux环境下部署并使用Kafka 2.12-3.6.1版本。 一、系统要求 在开始安装前,确保你的Linux系统已经安装了Java Development Kit (JDK) 8或以上版本,因为Kafka运行需要Java环境。你可以通过命令...

    Kafka Streams in Action 高清文字版 非扫描版

    总结来看,文档中提到的知识点涵盖了Kafka Streams的定义、实时应用与微服务的介绍、流处理API的重要性以及Kafka版本更新带来的影响。此外,还有对Manning出版公司早期访问计划MEAP的简单描述。通过这些内容,可以...

    kafkatool kafka可视化工具

    本文将详细介绍 "Kafka Tool" 这款64位的 Kafka 可视化工具,帮助用户更直观地理解其功能、安装过程以及如何利用它提升 Kafka 的操作效率。 **一、Kafka Tool 功能概述** 1. **集群管理**:Kafka Tool 提供了集群...

    kafka-manager 编译好的 可以直接使用

    **Kafka-Manager详解** ...总的来说,Kafka-Manager为Kafka的日常运维提供了便利,使得管理复杂的大规模Kafka集群变得更加简单。对于初学者或运维人员来说,熟练掌握Kafka-Manager的使用能极大地提升工作效率。

    Flume+kafka+Storm整合

    本篇内容重点介绍了如何利用Flume、Kafka与Storm这三个开源工具实现一套完整的实时数据流处理系统。 **Flume** 是一个高可靠、高性能的服务,用于收集、聚合和移动大量日志数据。它具有简单灵活的架构,基于流的...

    kafka简单指导

    ### Kafka简明指南 #### 一、Kafka概述 ...通过以上介绍,我们可以了解到Kafka作为一种分布式消息系统,在消息处理领域具有显著的优势。无论是对于大规模数据处理还是实时数据流处理,Kafka都能提供强大的支持。

    kafka3.2常用命令

    以上介绍了 Kafka 3.2 中的一些基本命令,包括启动 ZooKeeper 和 Kafka 服务、创建和管理 Topic 以及创建消费者和生产者。这些命令是日常管理和测试 Kafka 集群时非常实用的工具。熟练掌握这些命令可以帮助开发者和...

    Kafka介绍.pptx

    ### Kafka介绍 #### Kafka概述 Kafka是一种分布式发布-订阅消息系统,最初由LinkedIn公司开发,后成为Apache软件基金会的顶级项目。Kafka主要使用Scala语言编写,具有高吞吐量、可持久化、分布式扩展性强等特点。它...

    Spring Boot集群管理工具KafkaAdminClient使用方法解析

    下面将详细介绍 KafkaAdminClient 的使用方法和原理。 创建 Topic KafkaAdminClient 提供了 createTopics 方法来创建新的 Topic。该方法接收一个 NewTopic 对象的集合作为参数,NewTopic 对象中包含了 Topic 的...

    有关kafka的三本电子书,电子文档

    首先,《Kafka技术详解》这本书可能会从Kafka的基本架构开始介绍,包括它的分布式消息传递模型、主题与分区的概念、生产者和消费者的API用法。书中会详细阐述如何设置和管理Kafka集群,以及如何确保数据的一致性和...

    kafka 安装学习

    本文将详细介绍如何安装 Kafka,并简要介绍其基本使用方法。 ## 一、Kafka 概述 Kafka 由 LinkedIn 开发并贡献给 Apache 软件基金会,它主要由以下组件构成: 1. **Brokers**: Kafka 集群中的服务器,负责存储和...

    Spring for Apache Kafka.pdf

    - **官方文档**:详细介绍了Spring for Apache Kafka的所有特性和配置选项,是开发者深入了解该框架的最佳资源。 ### 总结 Spring for Apache Kafka是一个强大的工具,它简化了基于Kafka的应用程序的开发过程。...

    kafka中文文档0.10.pdf

    Kafka的快速开始部分为初学者提供了一种简便的入门方式,而其生态系统的介绍则展示了Kafka与周边技术的集成,这对于建立大规模的、复杂的数据处理系统非常重要。 总的来说,Kafka文档中所涵盖的知识点非常丰富,既...

Global site tag (gtag.js) - Google Analytics