`

kafka的topic多分区的情况,如何保证跨区的消息消费的顺序性

 
阅读更多

这个问题严格来说是肯定有的,kafka只能保证分区内的有序性。

 

下面是kafka作者Jay Kreps的blog中介绍kafka设计思想的一段话。

Each partition is a totally ordered log, but there is no global ordering between partitions (other than perhaps some wall-clock time you might include in your messages). The assignment of the messages to a particular partition is controllable by the writer, with most users choosing to partition by some kind of key (e.g. user id). Partitioning allows log appends to occur without co-ordination between shards and allows the throughput of the system to scale linearly with the Kafka cluster size.

 

针对部分消息有序(message.key相同的message要保证消费顺序)场景,可以在producer往kafka插入数据时控制,同一key分发到同一partition上面。

 

kafka源码如下,支持该方式

private[kafka]classDefaultPartitioner[T]extendsPartitioner[T]{
  privateval random = newjava.util.Random
  def partition(key: T, numPartitions: Int): Int = {
    if(key== null){
        println("key is null")
        random.nextInt(numPartitions)
    }
    else{
        println("key is "+ key + " hashcode is "+key.hashCode)
        math.abs(key.hashCode) % numPartitions
    }
  }
}

 

 

在kafka-storm中,如果one partition -> one consumer instance 的话,就没这样的问题,但失去了并行。

如果N1 partitions -> N2 consumer instances的话 ,

1)N1<N2,这种情况会造成部分consumer空转,资源浪费。

2)N1>N2(N2>1),这种情况,每个kafka-spout实例会消费固定的1个或者几个partition,msg不会被不同consumer重复消费。

3)N1=N2,这种情况,实际操作发现,1个consumer instance都对应消费1个partition。1个partition只会有1个consumer实例,否则需要加锁等操作,这样减少了消费控制的复杂性。

 

 

具体应用场景:

计算用户在某个位置的滞留时间,日志内容可以抽象成用户ID、时间点、位置。

应用系统-》日志文件sftp服务器-》数据采集层-》kafka-》storm实时数据清洗处理层-》Redis、Hbase-》定时任务、mapreduce

在集成测试期间,由于没有实际的日志,所以在采集层模拟往kafka插入数据(特别在发送频率模拟的很粗糙),发现在实时处理层,计算出来用户在某个位置滞留时间计算出来为负数,原因如下,

 

1)采集层模拟不真实(同一用户往kafka插入的位置的时间是随机生成),但要考虑目前的日志文件sftp服务器 或者 采集层 是否会有这种情况,如果有,可以从业务层面规避,过滤掉该条无效数据。

 

2)就是storm中tuple处理失败,重发,kafka-storm中就使offset回到失败的那个位置,但之前位置信息可能已经缓存到了redis(为了减少hbase访问次数,用户的最近一条位置信息放在了redis中),这样offset之后的所有消息会重新被消费,这样以来滞留时间为负数,可以过滤掉该条记录,不存到redis中。 

 

  真实数据:U1 T1 A1->U1 T2 A2

 

  fail重发  :U1 T1 A1->U1 T2 A2 ->  前两条都失败,重发 -> U1 T1 A1(负数的滞留时间) -> U1 T2 A2

 

由于采用的是失败重发,是at least once,如果是only once的话,就会没有这样的情况,

 

 

PS:一些原理性问题,可以参考“kafka消费原理”介绍。

分享到:
评论

相关推荐

    springboot整合kafka,指定分区发送,批量消费,指定topic分区消费

    在本文中,我们将深入探讨如何在Spring Boot 2.x应用程序中整合Apache Kafka,重点是实现指定分区发送、批量消费以及指定topic分区消费的功能。Apache Kafka是一个分布式流处理平台,广泛用于构建实时数据管道和流...

    kafka_topic创建、分区、删除管理

    在分布式消息系统Kafka中,Topic是数据的逻辑存储单元,它是消息的分类或主题。本文将深入探讨如何管理和操作Kafka的Topic,包括创建、查看、分区以及删除等核心概念。 **创建Topic** 在Kafka中,创建Topic通常通过...

    springboot集成kafka实战项目,kafka生产者、消费者、创建topic,指定消费分区

    在本项目中,我们将深入探讨如何使用Spring Boot与Kafka进行集成,实现一个实战项目,包括Kafka的生产者、消费者以及如何创建Topic,并且特别关注指定消费分区这一高级特性。Kafka是一款高吞吐量的分布式消息系统,...

    kafka分区消费策略

    在消费者端,Kafka支持多消费者组(Consumer Group)的概念,每个分区只能被组内的一个消费者消费,这样保证了消息的唯一性。如果希望消费者从特定的分区开始消费,可以使用`seek()`方法定位到特定的偏移量(Offset...

    SpringBoot整合kafka,代码简洁,自动分配分区和指定分区消费(亲测可用)

    在本文中,我们将深入探讨如何将SpringBoot与Apache Kafka进行集成,实现消息生产和消费功能,同时涵盖自动分配分区和指定分区消费的策略。SpringBoot以其轻量级、快速开发的特性,深受开发者喜爱,而Kafka作为一个...

    kafka topic迁移脚本

    在分布式消息系统Kafka中,Topic是数据存储和消费的基本单元。Topic迁移是将一个Topic的数据从一个集群移动到另一个集群的过程,这对于扩展、备份或故障恢复等操作至关重要。本篇将详细介绍如何利用自动化脚本实现...

    Kafka多分区消费实践.rar

    当kafka中的某一个topic数据量很大的时候就会导致消费者处理数据很慢,那我们可能会想着适当的增加分区(partition)来提高消费者的消费速度,那么我们创建多个分区的时候,生产者是如何分配生产的消息到分区的尼,让我...

    Kafka vs RocketMQ—— Topic数量对单机性能的影响1

    分区是Kafka和RocketMQ的特点,每个分区仅允许一个消费线程消费消息,避免了并发问题。在生产环境中,通常会将一个Topic设置为多分区,以支持多个消费者同时消费。 测试目的在于比较在发送端和接收端共存的情况下,...

    Kafka创建Topic,还有生产者消费者按照FileBeat格式通信

    能力申请提交成功后,自动根据标识ID创建对应Kafka的Topic。 设计思路: 1、在Java代码中调用ZooKeeper的工具类,创建Topic。 2、建立一个含有Topic属性的JavaBean,set内容到各个属性中。 3、Id的规则尚不明确,...

    kafka多线程顺序消费

    - **分区概念**:Kafka 的每个主题可以被划分为多个分区,每个分区内的消息按照生产顺序存储,并且在默认情况下,Kafka 保证每个分区内的消息顺序。 - **顺序消费**:如果一个应用程序希望按顺序消费所有消息,...

    Kafka常见问题整理

    自动位移提交在正常情况下不会发生消息丢失或重复消费的现象,唯一可能的情况,你拉取到消息后,消费者那边刚好进行了位移提交,Kafka那边以为你已经消费了这条消息,其实你刚开始准备对这条消息进行业务处理,但你...

    kafka demo ,两种线程消费方式

    Kafka是一个发布/订阅模型的消息队列,它包含生产者(Producer)、消费者(Consumer)和主题(Topic)。生产者负责发布消息到主题,而消费者则订阅这些主题并消费消息。消费者通过消费者组(Consumer Group)进行...

    Kafka分区策略浅谈

    Kafka中的每个Topic被划分为多个Partitions,而每个Partition只能被同一个Consumer Group中的一个Consumer消费,确保消息的有序性和唯一性。Consumer Group的概念使得多消费者可以协同工作,共同消费Topic的...

    Kafka Producer机制优化-提高发送消息可靠性

    为了提高系统的并发处理能力和数据冗余性,每个Topic被划分为多个Partitions(分区)。这种架构设计使得Kafka能够高效地处理大量消息。 然而,在实际运行过程中,可能会遇到Broker故障的情况,导致消息无法正常发送...

    grafana-kafka 测试消费者组消费情况.json

    grafana上kafka 测试消费者组消费情况使用的json文件

    Kafka简介及使用PHP处理Kafka消息

    3. 支持 Kafka Server 间的消息分区,同时保证每个 Partition 内的消息顺序传输。 4. 分布式系统,易于向外扩展。所有的 producer、broker 和 consumer 都会有多个,均为分布式的。 5. 无需停机即可扩展机器。 6. ...

    kafka动态新增分区

    在Kafka中,为了实现消息的高效存储与处理,每一个主题(topic)都会被划分为多个分区(partition)。这些分区不仅有助于提升系统的整体吞吐量,还能确保数据的持久性和容错性。然而,在某些情况下,随着业务的增长或...

    Flink无法获取Kafka Topic Metadata异常及解决.docx

    Flink 无法获取 Kafka Topic Metadata 异常及解决 一、问题现象 在使用 Kafka 0.11.0.1 和 Flink 1.4 进行实时计算时,Flink 无法获取 Kafka Topic Metadata,报以下异常:org.apache.kafka.common.errors....

    kafka流培训材料

    同一个Topic的不同分区可以被多个消费组并行消费,而同一个消费组的不同消费者可以同时消费同一个分区的消息,但每个分区只能由消费组中的一个消费者消费,这样做是为了保证消息的顺序。 消费者分配分区的算法有...

    kafka-java-demo 基于java的kafka生产消费者示例

    例如,可以创建多个消费者线程来并行消费不同分区的消息。 【Kafka配置】 Kafka的配置项众多,包括但不限于broker地址、请求超时时间、重试次数、序列化方式等。在Java示例中,这些配置通常通过`Properties`对象...

Global site tag (gtag.js) - Google Analytics