Kafka消息delivery可靠性保证(Message Delivery Semantics)

原文见:http://kafka.apache.org/documentation.html#semantics

kafka在生产者和消费者之间的传输是如何保证的,我们可以知道有这么几种可能提供的delivery guarantee:

  • At most once 消息可能会丢,但绝不会重复传输
  • At least one 消息绝不会丢,但可能会重复传输
  • Exactly once 每条消息肯定会被传输一次且仅传输一次,很多时候这是用户所想要的。  

  值得注意的是,当Producer向broker发送消息时,一旦这条消息被commit,因数replication的存在,它就不会丢。但是如果Producer发送数据给broker后,遇到网络问题而造成通信中断,那Producer就无法判断该条消息是否已经commit。虽然Kafka无法确定网络故障期间发生了什么,但是Producer可以生成一种类似于主键的东西,发生故障时幂等性的重试多次,这样就做到了Exactly once。目前这一Feature还并未实现,有希望在Kafka未来的版本中实现。(所以目前默认情况下一条消息从Producer到broker是确保了At least once,可通过设置Producer异步发送实现At most once)。

  接下来讨论的是消息从broker到Consumer的delivery guarantee语义。(仅针对Kafka consumer high level API)。Consumer在从broker读取消息后,可以选择commit,该操作会在Zookeeper中保存该Consumer在该Partition中读取的消息的offset。该Consumer下一次再读该Partition时会从下一条开始读取。如未commit,下一次读取的开始位置会跟上一次commit之后的开始位置相同。当然可以将Consumer设置为autocommit,即Consumer一旦读到数据立即自动commit。如果只讨论这一读取消息的过程,那Kafka是确保了Exactly once。但实际使用中应用程序并非在Consumer读取完数据就结束了,而是要进行进一步处理,而数据处理与commit的顺序在很大程度上决定了消息从broker和consumer的消息投递语义保证。

  • 读完消息先commit消费状态(保存offset)再处理消息。这种模式下,如果Consumer在commit后还没来得及处理消息就crash了,下次重新开始工作后就无法读到刚刚已提交而未处理的消息,这对应at-most-once。
  • 读完消息先处理再commit消费状态(保存offset)。这种模式下,如果在处理完消息之后commit之前Consumer crash了,下次重新开始工作时还会处理刚刚未commit的消息,实际上该消息已经被处理过了。这对应at-least-once。
  • 如果一定要做到exactly once,就需要协调offset和实际操作的输出。经典的做法是引入两阶段提交,如果能让offset和操作输入存到同一个地方,会更简洁和通用。这种方式可能更好,因为许多输出系统可能不支持两阶段提交。比如,Consumer拿到数据后可能把数据放到HDFS,如果把最新的offset和数据本身一起写到HDFS,那就可以保证数据的输出和offset的更新要么都完成,要么都不完成,间接实现Exactly once。目前就high level api而言,offset是存于Zookeeper中的,无法存于HDFS,而low level API的offset是由自己去维护的,可以将之存于HDFS中.

  

Kafka默认保证At least once,并且允许通过设置Producer异步提交来实现At most once。而Exactly once要求与外部存储系统协作,幸运的是Kafka提供的offset可以非常直接非常容易得使用这种方式。

参考:

http://kafka.apache.org/documentation.html#semantics

时间: 2024-11-02 19:17:29

Kafka消息delivery可靠性保证(Message Delivery Semantics)的相关文章

Spark Streaming Crash 如何保证Exactly Once Semantics

前言 其实这次写Spark Streaming相关的内容,主要是解决在其使用过程中大家真正关心的一些问题.我觉得应该有两块: 数据接收.我在用的过程中确实产生了问题. 应用的可靠性.因为SS是7*24小时运行的问题,我想知道如果它Crash了,会不会丢数据. 第一个问题在之前的三篇文章已经有所阐述: Spark Streaming 数据产生与导入相关的内存分析 Spark Streaming 数据接收优化 Spark Streaming Direct Approach (No Receivers

Apache Storm 官方文档 —— 消息的可靠性保障

原文链接    译者:魏勇 Storm 能够保证每一个由 Spout 发送的消息都能够得到完整地处理.本文详细解释了 Storm 如何实现这种保障机制,以及作为用户如何使用好 Storm 的可靠性机制. 消息的"完整性处理"是什么意思 一个从 spout 中发送出的 tuple 会产生上千个基于它创建的 tuples.例如,有这样一个 word-count 拓扑: TopologyBuilder builder = new TopologyBuilder(); builder.setS

Kafka 消息监控 - Kafka Eagle

1.概述 在开发工作当中,消费 Kafka 集群中的消息时,数据的变动是我们所关心的,当业务并不复杂的前提下,我们可以使用 Kafka 提供的命令工具,配合 Zookeeper 客户端工具,可以很方便的完成我们的工作.随着业务的复杂化,Group 和 Topic 的增加,此时我们使用 Kafka 提供的命令工具,已预感到力不从心,这时候 Kafka 的监控系统此刻便尤为显得重要,我们需要观察消费应用的详情. 监控系统业界有很多杰出的开源监控系统.我们在早期,有使用 KafkaMonitor 和

Kafka消息序列化和反序列化

Kafka Producer在发送消息时必须配置的参数为:bootstrap.servers.key.serializer.value.serializer.序列化操作是在拦截器(Interceptor)执行之后并且在分配分区(partitions)之前执行的. 首先我们通过一段示例代码来看下普通情况下Kafka Producer如何编写: public class ProducerJavaDemo { public static final String brokerList = "192.1

云消息推送平台Message Bus获1100万美元融资

总部位于加州的云本地化服务创业公司Message Bus日前宣布已获得新一轮1100万美元"增长"融资.Message Bus提供基于"云本地化"的http://www.aliyun.com/zixun/aggregation/15818.html">应用服务,允许用户跨电子邮件,社交网站以及移动平台进行信息推送. 该公司于2010年由原Twitter的创始团队成员之一的Jeremy LatRasse创立:Jeremy曾担任过这家社交网络公司的运营总

[WCF REST] Web消息主体风格(Message Body Style)

对于Web HTTP编程模型来说,服务契约中作为操作的方法无须应用OperationContractAttribute特性,只需要根据需要应用WebGetAttribute与WebInvokeAttribute特性即可.前者针对GET HTTP方法,或者则针对其他HTTP方法.WebGetAttribute与WebInvokeAttribute的属性BodyStyle和IsBodyStyleSetExplicitly涉及到"Web消息主体风格"的话题. 1: [AttributeUsa

Sparkstreaming读取Kafka消息再结合SparkSQL,将结果保存到HBase

亲自摸索,送给大家,原创文章,转载注明哦. import org.apache.hadoop.hbase.HBaseConfiguration import org.apache.hadoop.hbase.mapreduce.TableOutputFormat import org.apache.spark.SparkConf import org.apache.spark.sql._ import org.apache.spark.streaming.kafka.KafkaUtils impo

SQL Server 2005基于消息的应用程序介绍

基于消息的应用程序并不是一个新概念,但一直以来,从头编写这样的应用程序都相当困难.我将在一系列三篇文章中讨论一个建立异步消息应用程序的新平台,本文为第一篇,我将在其中说明基于消息的应用程序这一概念,以及一个建立包含在SQL Server 2005中的这些应用程序的新型基础程序. 基于消息的应用程序介绍 处理消息的应用程序是大体上会成功的应用程序.实际上,大多数大型应用程序都应用了某种类型的消息处理.这种处理可能相当简单,例如,把一个文件放在网络共享中,以便另一个应用程序能够处理这个文件:之后,你

基于SQL Server 2008 Service B“.NET研究”roker构建企业级消息系统

1.引言 Microsoft 在SQL Server 2005引入了服务代理 (Service Broker 简称SSB) 为技术支持代理设计模式和面向消息的中间件 (MOM) 的原则.Service Broker在SQL Server 2008上得到完善, SQL Server Service Broker 为消息和队列应用程序提供 SQL Server 数据库引擎本机支持. 这使开发人员可以轻松地创建使用数据库引擎组件在完全不同的数据库之间进行通信的复杂应用程序.开发人员可以使用 Servi