热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

kafka拉取的数据排序_Kafka的原理介绍及实践

kafka是近年来关注度飞速上升并得到越来越广泛应用的一个产品,本文将介绍一下它的实现原理以及在我们邮箱服务中的应用。1.1Kafka–官方定义根据官网的介绍

kafka是近年来关注度飞速上升并得到越来越广泛应用的一个产品,本文将介绍一下它的实现原理以及在我们邮箱服务中的应用。

1.1 Kafka – 官方定义

根据官网的介绍,Kafka是一个提供统一的、高吞吐、低延迟的,用来处理实时数据的流式平台,它具备以下三特性: 1、流式记录的发布和订阅:类似于消息系统。 2、存储:在一个分布式、容错的集群中安全持久化地存储流式数据。

3、处理:编写流处理应用程序,对实时事件进行响应。 Kafka一般用在两大类应用中: 1、建立实时流数据管道,在系统或应用之间实时地传输数据。

2、构建对数据流进行转换和处理的实时流应用程序。 在邮箱服务中,我们主要将kafka作为消息系统,用于系统内部消息的传输。为什么要采用kafka呢?让我们先从kafka的设计原理说起。

1.2 Kafka – 概念与存储机制

Topic

kafka中是以Topic机制来对消息进行分类的,同一类消息属于同一个Topic,你可以将每个topic看成是一个消息队列。 生产者将消息发送到相应的Topic,而消费者通过从Topic拉取消息来消费,没错,在kafka中是要求消费者主动拉取消息消费的,它并不会主动推送消息,这是它的一个特点,为什么会这样设计呢?我们后面再说,先来看一下Topic的结构:

Partition分区

每个topic可以有多个分区,这是kafka为了提高并发量而设计的一种机制:一个topic下的多个分区可以并发接收消息,同样的也能供消费者并发拉取消息,即分区之间互不干扰,这样的话,有多少个分区就可以有多大的并发量。所以,如果要更准确的打比方,一个分区就是一个消息队列,只不过这些消息队列同属于一种消息分类。 在kafka服务器,分区是以目录形式存在的,每个分区目录中,Kafka会按配置大小或配置周期将分区拆分成多个段文件(LogSegment), 每个段由三部分组成:

  1. 磁盘文件:*.log
  2. 位移索引文件:*.index
  3. 时间索引文件:*.timeindex

其中*.log用于存储消息本身的数据内容,*.index存储消息在文件中的位置(包括消息的逻辑offset和物理存储offset),*.timeindex存储消息创建时间和对应逻辑地址的映射关系。

段文件结构图如下 :

8556e077807b9ee5dd097aff5d1fbad4.png

将分区拆分成多个段是为了控制存储的文件大小,如果整个分区只保存为一个文件,那随着分区里消息的增多,文件也将越来越大,最后不可控制。而如果每个消息都保存为一个文件,那文件数量又将变得巨大,同样容易失去控制。所以kafka采用段这种方式,控制了每个文件的大小,也方便控制所有文件的数量。同时,这些文件因为大小适中,可以很方便地通过操作系统mmap机制映射到内存中,提高写入和读取效率。 这个设计的另一个好处是:当系统要清除过期数据时,可以直接将过期的段文件删除,非常简洁。

但是这里也会有一个问题:如果每个消息都要在index文件中保存位置信息,那么index文件也很容易变得很大,这样又会减弱上文所说的好处。所以在kafka中,index设计为稀疏索引来降低index的文件大小,这样,index文件存储的实际内容为:该段消息在消息队列中的相对offset和在log文件中的物理偏移量映射的稀疏记录。 那么多少条消息会在index中保存一条记录呢?这个可以通过系统配置来进行设置。索引记录固定为8个字节大小,分别为4个字节的相对offset(消息在partition中全局offset减去该segment的起始offset),4个字节的消息具体存储文件的物理偏移量。

index文件结构图如下:

7f6473d3ffde85ce11810d6ef073488b.png

Kafka不会在消费者拉取完消息后马上就清理消息,而是会保存段文件一段时间,直到其过期再标记为可清理,由后台程序定期进行清理。这种机制使得消费者可以重复消费消息,满足更灵活的需求。

1.3 Kafka – 查询机制

上面说过,kafka虽然作为消息系统,但是消费消息并不是通过推送而是通过拉取来消费的,client需要通过offset和size参数主动去查询消息。 kafka收到客户端请求后,对消息的寻址会经过下面几个步骤:

1、查找具体的Log Segment,kafka将段信息缓存在跳跃表中,所以这个步骤将从跳跃表中获取段信息。 2、根据offset在index文件中进行定位,找到匹配范围的偏移量position,此时得到的是一个近似起始文件偏移量。

3、从Log文件的position位置处开始往后寻找,直到找到offset处的消息。

kafka读取示意图:

b86c8a7901c81e1d2dc0d7b1f076e199.png

2.rabbitmq vs kafka

介绍了kafka的实现原理,我们再来对比一下同样作为消息队列服务的rabbitmq。mq的应用也很广泛,功能多而全,那么和mq相比,kafka有哪些优势呢?为什么我们会使用kafka而抛弃了rabbitmq呢? rabbitmq流程图:

6cba4c3059ea76e64d98ceefd7d21b5f.png
  • RabbitMQ消费者只能从队列头部按序进行消费,消息一旦被消费,就会被打上删除标记,紧接着消费下一条消息,没办法进行回溯操作,这样的话一个消费者消费完消息,别一个消费者就别想再消费了。而Kafka提供动态指定消费位点,能够灵活地进行回溯消费操作,只要该消息还在生命周期内可以重复拉取,并且不同消费者可以互不干扰的消费同一个消息队列,这就比rabbitmq灵活多了。

kafka消费位点示意图:

cc50da155da281f40759c4c1bcd27914.png
  • RabbitMQ如果要满足多个消费者消费同一个消息队列,也可以借助exchange路由能力,但是这样会将消息复制到多个队列,每个消费者需要绑定一个自己的队列进行消费。如果有几百个消费者,那么队列复制几百倍,引起mq的消息水位猛涨,容易失控。而kafka就没这个问题,不管多少个消费者都只需要一个队列就能满足,每个消费者都可以完整地不相互干扰地消费队列中的所有消息。
  • 当然,RabbitMQ也有其优点,它提供的exchange,binding, queue等抽象实体,提供强大的路由关系(rounte key and bindkey)和消息过滤能力。作为传统消息系统提供了细粒度的消息控制能力。而Kafka主要是面向高流量,大吞吐的批处理系统,在路由抽象方面化繁为简,重点关注系统的高吞吐,所以使用上更为简洁。

kafka还有传统解决方案无法满足的高伸缩能力等优势,这里就不一一介绍了。

3.Kafka在邮件系统data bus中的运用

正因为kafka有着以上介绍的能力和优势,我们的邮箱服务中采用了它作为消息系统,其中一个应用就是邮件系统的data bus。

data bus介绍:

邮件系统用户收发信流程伴随着大量的业务逻辑和子系统调用,如果将这些流程都强依附在主干枝上,将会对系统造成较大的压力,整个业务流程也将变得复杂而缓慢。所以通过数据总线将主次流程进行解耦,减轻收发信主流程的复杂度,使其可以以更快的速度完成,加快系统响应时间。主流程产生事件源,通过kafka的传输,触发多个次要流程,次要流程可以并发在系统后台完成,并且可以轻易的扩展多种多样的次要流程。 下图以简化后的进信流程为例:

0536d5cba3751e0603d5db5a26ca789e.png

Kafka在data bus中的运用

邮件系统在完成收发信流程后,会生成当次流程相关的系统事件,比如新邮件事件。data bus将这些事件写入到kafka集群的相应topic中,下游的一系列子系统对topic进行消费。

  1. 每个不同的流程会对应不用的topic,以区分不同类别的事件,比如新进邮件,邮件已读,邮件删除等。
  2. 每个topic可以根据各自的消息吞吐量和并发需求划分成多个partition,比如新进邮件量大可以划分成256个分区,邮件删除量小则可以划分32个分区。
  3. 每个事件按什么机制来分配到相应的分区呢?一般来说可以按邮筒来划分,同一个邮筒的事件进入同一个partition,这样就保证了同一邮筒发生的事件的顺序。
  4. 不同事件的时效性可能有不同,所以其需要保存的时间也可以不同,可以根据业务的需求来设置topic的保留时长。
  5. 由于事件全部写入到kafka中,后台任务可以任意消费,所以可以灵活地增加不同的业务流程。

如下图所示,应用消费能力能借助Kafka集群实现弹性扩容。

0f8d423071023ef36cfd89522f04d691.png

总结一下,kafka在邮件系统中的应用给我们带来的好处:

  • 时延敏感型业务:通过提高业务Topic的Partition数量,一来留下了较好的机器扩容的空间,另一方面也可以通过提高消费者并发线程数来提升应用整体消费速度,减少时延。
  • 慢速型业务:有些不关心时效性的下游业务,在考虑消息生命周期等因素,可以很好地利用Kafka的消息堆积能力,磁盘存储能力,削峰填谷,让消费流速适应自己的处理能力,不至于因为突然间的大量消息冲击而崩溃。

来源:掘金推荐



推荐阅读
  • 深入剖析JVM垃圾回收机制
    本文详细探讨了Java虚拟机(JVM)中的垃圾回收机制,包括其意义、对象判定方法、引用类型、常见垃圾收集算法以及各种垃圾收集器的特点和工作原理。通过理解这些内容,开发人员可以更好地优化内存管理和程序性能。 ... [详细]
  • 本文详细探讨了HTML表单中GET和POST请求的区别,包括它们的工作原理、数据传输方式、安全性及适用场景。同时,通过实例展示了如何在Servlet中处理这两种请求。 ... [详细]
  • 深入解析Redis内存对象模型
    本文详细介绍了Redis内存对象模型的关键知识点,包括内存统计、内存分配、数据存储细节及优化策略。通过实际案例和专业分析,帮助读者全面理解Redis内存管理机制。 ... [详细]
  • 本文详细介绍了优化DB2数据库性能的多种方法,涵盖统计信息更新、缓冲池调整、日志缓冲区配置、应用程序堆大小设置、排序堆参数调整、代理程序管理、锁机制优化、活动应用程序限制、页清除程序配置、I/O服务器数量设定以及编入组提交数调整等方面。通过这些技术手段,可以显著提升数据库的运行效率和响应速度。 ... [详细]
  • 优化Flask应用的并发处理:解决Mysql连接过多问题
    本文探讨了在Flask应用中通过优化后端架构来应对高并发请求,特别是针对Mysql 'too many connections' 错误的解决方案。我们将介绍如何利用Redis缓存、Gunicorn多进程和Celery异步任务队列来提升系统的性能和稳定性。 ... [详细]
  • 深入理解Java多线程并发处理:基础与实践
    本文探讨了Java中的多线程并发处理机制,从基本概念到实际应用,帮助读者全面理解并掌握多线程编程技巧。通过实例解析和理论阐述,确保初学者也能轻松入门。 ... [详细]
  • 本文深入探讨了MySQL中常见的面试问题,包括事务隔离级别、存储引擎选择、索引结构及优化等关键知识点。通过详细解析,帮助读者在面对BAT等大厂面试时更加从容。 ... [详细]
  • 本文详细介绍了网络存储技术的基本概念、分类及应用场景。通过分析直连式存储(DAS)、网络附加存储(NAS)和存储区域网络(SAN)的特点,帮助读者理解不同存储方式的优势与局限性。 ... [详细]
  • Netflix利用Druid实现高效实时数据分析
    本文探讨了全球领先的在线娱乐公司Netflix如何通过采用Apache Druid,实现了高效的数据采集、处理和实时分析,从而显著提升了用户体验和业务决策的准确性。文章详细介绍了Netflix在系统架构、数据摄取、管理和查询方面的实践,并展示了Druid在大规模数据处理中的卓越性能。 ... [详细]
  • ZooKeeper集群脑裂问题及其解决方案
    本文深入探讨了ZooKeeper集群中可能出现的脑裂问题,分析其成因,并提供了多种有效的解决方案,确保集群在高可用性环境下的稳定运行。 ... [详细]
  • 本文深入探讨了SQL数据库中常见的面试问题,包括如何获取自增字段的当前值、防止SQL注入的方法、游标的作用与使用、索引的形式及其优缺点,以及事务和存储过程的概念。通过详细的解答和示例,帮助读者更好地理解和应对这些技术问题。 ... [详细]
  • 并发编程 12—— 任务取消与关闭 之 shutdownNow 的局限性
    Java并发编程实践目录并发编程01——ThreadLocal并发编程02——ConcurrentHashMap并发编程03——阻塞队列和生产者-消费者模式并发编程04——闭锁Co ... [详细]
  • 深入解析 Android IPC 中的 Messenger 机制
    本文详细介绍了 Android 中基于消息传递的进程间通信(IPC)机制——Messenger。通过实例和源码分析,帮助开发者更好地理解和使用这一高效的通信工具。 ... [详细]
  • 本文详细阐述了云主机流量的概念,探讨其对网站性能和安全的关键影响,并提供了优化配置的实用建议。 ... [详细]
  • 本文深入探讨了UNIX/Linux系统中的进程间通信(IPC)机制,包括消息传递、同步和共享内存等。详细介绍了管道(Pipe)、有名管道(FIFO)、Posix和System V消息队列、互斥锁与条件变量、读写锁、信号量以及共享内存的使用方法和应用场景。 ... [详细]
author-avatar
熊熊oO7sloveV
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有