原文地址:http://blog.csdn.net/honglei915/article/details/37565119
之前讨论了consumer和producer是怎么工作的,现在来讨论一下数据传输方面。数据传输的事务定义通常有以下三种级别:
- 最多一次: 消息不会被重复发送,最多被传输一次,但也有可能一次不传输。
- 最少一次: 消息不会被漏发送,最少被传输一次,但也有可能被重复传输.
- 精确的一次(Exactly once): 不会漏传输也不会重复传输,每个消息都传输被一次而且仅仅被传输一次,这是大家所期望的。
大多数消息系统声称可以做到“精确的一次”,但是仔细阅读它们的的文档可以看到里面存在误导,比如没有说明当consumer或producer失败时怎 么样,或者当有多个consumer并行时怎么样,或写入硬盘的数据丢失时又会怎么样。kafka的做法要更先进一些。当发布消息时,Kafka有一个 “committed”的概念,一旦消息被提交了,只要消息被写入的分区的所在的副本broker是活动的,数据就不会丢失。关于副本的活动的概念,下节 文档会讨论。现在假设broker是不会down的。
如果producer发布消息时发生了网络错误,但又不确定实在提交之前发生的还是提交之后发生的,这种情况虽然不常见,但是必须考虑进去,现在Kafka版本还没有解决这个问题,将来的版本正在努力尝试解决。
并不是所有的情况都需要“精确的一次”这样高的级别,Kafka允许producer灵活的指定级别。比如producer可以指定必须等待消息被提交的 通知,或者完全的异步发送消息而不等待任何通知,或者仅仅等待leader声明它拿到了消息(followers没有必要)。
现在从consumer的方面考虑这个问题,所有的副本都有相同的日志文件和相同的offset,consumer维护自己消费的消息的 offset,如果consumer不会崩溃当然可以在内存中保存这个值,当然谁也不能保证这点。如果consumer崩溃了,会有另外一个 consumer接着消费消息,它需要从一个合适的offset继续处理。这种情况下可以有以下选择:
- consumer可以先读取消息,然后将offset写入日志文件中,然后再处理消息。这存在一种可能就是在存储offset后还没处理消息就crash了,新的consumer继续从这个offset处理,那么就会有些消息永远不会被处理,这就是上面说的“最多一次”。
- consumer可以先读取消息,处理消息,最后记录offset,当然如果在记录offset之前就crash了,新的consumer会重复的消费一些消息,这就是上面说的“最少一次”。
- “精 确一次”可以通过将提交分为两个阶段来解决:保存了offset后提交一次,消息处理成功之后再提交一次。但是还有个更简单的做法:将消息的offset 和消息被处理后的结果保存在一起。比如用Hadoop ETL处理消息时,将处理后的结果和offset同时保存在HDFS中,这样就能保证消息和offser同时被处理了。
相关推荐
在这篇文章中,我们将从给定的文件中生成相关的知识点,主要涵盖Kafka的设计、数据传输、集群、producer、consumer、消息格式、存储设计等方面。 1. Kafka的设计 Kafka的设计中,将消息以topic为单位进行归纳,...
在 Kafka 中,数据传输的事务定义有三种级别: 1. 最多一次:消息不会被重复发送,最多被传输一次,但也有可能一次不传输。 2. 最少一次:消息不会被漏发送,最少被传输一次,但也有可能被重复传输。 3. 精确的一次...
Kafka 中有三种数据传输的事务定义:最多一次、最少一次和精确的一次。最多一次指消息不会被重复发送,最少一次指消息不会被漏发送,精确的一次指消息正好被传输一次。 Kafka 节点健康检查: Kafka 判断一个节点...
数据传输的事务定义通常有以下三种级别: (1)最多一次:消息不会被重复发送,最多被传输一次,但也有可能一次不传输。 (2)最少一次:消息不会被漏发送,最少被传输一次,但也有可能被重复传输。 (3)精确的...
Kafka支持以下三种级别的事务定义: 1. **最多一次(At most once)**:在这种情况下,消息可能会丢失,但不会重复发送。即,消息可能不会被送达,或者最多只会被送达一次。 2. **最少一次(At least once)**:确保...
Apache Kafka是一种高吞吐量、分布式的发布/订阅消息系统,它被设计为能够处理大量的实时数据。在Spring Boot框架中集成Kafka,可以简化开发流程,使得构建基于Kafka的应用变得更加便捷。 1. **Spring Boot与Kafka...
- **事务支持**:Kafka 0.11版本引入了事务支持,实现了消息的强一致性。 - **流处理框架**:Kafka Streams是基于Kafka构建的轻量级流处理框架,可以用来构建复杂的流处理应用程序。 #### 六、Kafka集群部署与运维 ...
这些组件在源代码中定义了如何将对象转换成字节流以及反向转换的过程,从而确保数据能够在应用程序和Kafka之间正确传输。 七、高可用与扩展性 Spring Kafka的设计考虑了高可用性和扩展性。例如,它支持动态分区...
在数据传输过程中,通常存在以下三种不同的事务定义: 1. **最多一次(At most once)**:确保消息不会被重复发送,即最多被传输一次,但可能会出现消息丢失的情况。 2. **最少一次(At least once)**:确保消息至少会...
Kafka支持三种数据传输事务级别,分别是: - 最多一次(At Most Once):消息传输保证最多一次到达消费者,有可能不传输或传输一次,但不会重复。 - 最少一次(At Least Once):消息至少传输一次,不会丢失,但可能...
而Apache Kafka作为一个高性能的消息中间件,被广泛用于大数据流处理和实时数据传输。本教程将详细介绍如何在SpringBoot项目中集成Kafka,构建高效的消息队列系统。 **一、SpringBoot与Kafka简介** 1. **...
如果你的应用需要事务性消息处理,Spring-Kafka支持与数据库操作一起的事务。通过KafkaTemplate的sendAndReceive()方法可以在同一个事务中发送消息和执行数据库操作。 7. **幂等性** 为了防止重复消息的问题,...
- **定义**:Kafka提供了一种机制来保证消息的原子性,即要么全部消息都被成功处理,要么全部失败。 - **应用场景**:对于需要保证数据一致性的业务场景尤为重要。 #### 五、Kafka实战应用 1. **日志收集**:Kafka...
3. 精确一次(Exactly once):每个消息都恰好被传输一次,既不丢失也不重复,这是理想的情况,Kafka通过其事务特性及幂等性设计来尽可能接近这一目标。 Kafka 判断一个节点是否存活的两个条件是: 1. 节点能够维持...
#### 数据传输的事务定义 **三种数据传输级别的定义:** - **最多一次(At most once)**:消息可能丢失,即消息可能完全不发送,也可能只发送一次。 - **最少一次(At least once)**:确保消息至少发送一次,但也可能...
在构建和管理大规模分布式消息系统时,Apache Kafka通常与Zookeeper协同工作,形成高效、可靠的实时数据流处理平台。Kafka作为一个高吞吐量、低延迟的发布/订阅消息系统,而Zookeeper则是一个分布式协调服务,用于...
数据传输事务定义** - **最多一次(At most once):** 消息可能丢失。 - **最少一次(At least once):** 消息可能重复。 - **精确一次(Exactly once):** 消息既不丢失也不重复。 #### 二、Kafka高可用性与性能优化 ...
数据传输的事务定义通常有三种级别:最多一次、最少一次、精确的一次。最多一次是指消息不会被重复发送,最多被传输一次,但也有可能一次不传输。最少一次是指消息不会被漏发送,最少被传输一次,但也有可能被重复...