Exactly-Once的概念是指"恰好一次",简单讲就是同一个数据只会被处理一次,应用有机质保证不会重复处理同一条数据(如果数据因为因为网络业务异常被发送多次);Exactly-Onece实现了操作的等幂性,如果在kafka处理数据全流程保证历史/重新处理数据结果都是一致的。

  Kafka处理数据的这种等幂性要从三个点说起:

  1. 重复发送数据等幂性:kafka客户端每次传输数据都会传送pid以及seqNo,前者说明的producer的标志,后者是当前producer消息的序列,这两个数据可以保证数据的唯一性;当出现重复数据,可以根据这两个字段进行判断;该特性默认关闭,需要设置enable.idempotence=true

  2. 数据处理数据的等幂性:borker通过"事务"机制实现了分配数据到topic和partition之间的等幂。

  注意,虽然代码中采用producer,但是这部分流程是在broker中实现的,我们看到kafka中通过设置了事务处理,实现了要么全部写入,要全部不写入;回滚通过读取日志实现(这个和mysql的binlog很类似)。

  3. 消息的消费,注意消息消费也不是原子操作,而是有一套流程的:1)消息消费;2)消息的处理;3)把消息处理结果发送到某个topic中;4)偏移量发送到指定的topic中。前两部不是很清楚意思,有些混淆,但是后面两步通常会被忽略;保证exactly onece的机制第二部类似,对于这四个步骤,都会放到一个事务中,操作流程将会记录到Transaction Log中。

  同样的消息处理的exactly因为都是有一定的成本的,默认是关闭,打开:processing.guarantee="exactly-once "

  消息传输保障除了exactly-once之外,还有两种,分别是:

  at most once:这个机制是指客户端数据最多传一次即可保证成功,简单讲就是完全没有数据保障,客户端传输一次就完事,网络异常,处理故障丢数据不再关心;

  at least onece:这个是kafka默认的机制,就是数据可能会被传输多次,相同的数据可能会被处理多次,且处理过程不具有等幂性;即有重复的可能性(默认不会校验pid以及seqNo是否有重复)

  其实我们看到,传输保障并不是描述服务器端的机制,而是是客户端和服务器端(生产者-消费者)共通协作实现的。

参考:

https://blog.csdn.net/liangyihuai/article/details/82931140

kafka的exactly once机制描述的很清晰(本博客中图片就是来自于此文)

https://www.cnblogs.com/bonelee/p/6360644.html

https://www.cnblogs.com/foreach-break/p/distributed_system_and_transaction.html#_3

解释传输保障的三个级别,描述的还是比较清晰的

exactly-once和kafka的更多相关文章

  1. Spark踩坑记——Spark Streaming+Kafka

    [TOC] 前言 在WeTest舆情项目中,需要对每天千万级的游戏评论信息进行词频统计,在生产者一端,我们将数据按照每天的拉取时间存入了Kafka当中,而在消费者一端,我们利用了spark strea ...

  2. 消息队列 Kafka 的基本知识及 .NET Core 客户端

    前言 最新项目中要用到消息队列来做消息的传输,之所以选着 Kafka 是因为要配合其他 java 项目中,所以就对 Kafka 了解了一下,也算是做个笔记吧. 本篇不谈论 Kafka 和其他的一些消息 ...

  3. kafka学习笔记:知识点整理

    一.为什么需要消息系统 1.解耦: 允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束. 2.冗余: 消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险. ...

  4. .net windows Kafka 安装与使用入门(入门笔记)

    完整解决方案请参考: Setting Up and Running Apache Kafka on Windows OS   在环境搭建过程中遇到两个问题,在这里先列出来,以方便查询: 1. \Jav ...

  5. kafka配置与使用实例

    kafka作为消息队列,在与netty.多线程配合使用时,可以达到高效的消息队列

  6. kafka源码分析之一server启动分析

    0. 关键概念 关键概念 Concepts Function Topic 用于划分Message的逻辑概念,一个Topic可以分布在多个Broker上. Partition 是Kafka中横向扩展和一 ...

  7. Kafka副本管理—— 为何去掉replica.lag.max.messages参数

    今天查看Kafka 0.10.0的官方文档,发现了这样一句话:Configuration parameter replica.lag.max.messages was removed. Partiti ...

  8. Kafka:主要参数详解(转)

    原文地址:http://kafka.apache.org/documentation.html ############################# System ############### ...

  9. kafka

    2016-11-13  20:48:43 简单说明什么是kafka? Apache kafka是消息中间件的一种,我发现很多人不知道消息中间件是什么,在开始学习之前,我这边就先简单的解释一下什么是消息 ...

  10. Spark Streaming+Kafka

    Spark Streaming+Kafka 前言 在WeTest舆情项目中,需要对每天千万级的游戏评论信息进行词频统计,在生产者一端,我们将数据按照每天的拉取时间存入了Kafka当中,而在消费者一端, ...

随机推荐

  1. echarts的axisLabel的文字内容过长的解决办法

    通过查找资料学习,我总结了四种解决的办法,不一定是最好的,但是希望能够帮助到需要的童鞋,同时如果大家有什么更好的方法欢迎指导. 方法一:这种方法就是将文本内容转换为字符串数组,然后再按需求换行,需要每 ...

  2. 实现mypwd&mybash&myod&读者写者

    目录: 一.mypwd 二.mybash 三.myod 四.读者.写者 一.实现mypwd 学习pwd命令 研究pwd实现需要的系统调用(man -k; grep),写出伪代码 实现mypwd 测试m ...

  3. start-dfs.sh 启动成功 datanode未启动

    在namenode中启动报错 test2: Exception in thread "main" java.net.UnknownHostException: unknown ho ...

  4. 函数, arguments对象, eval,静态成员和实例成员

    函数创建: 3种创建函数的方式    * 直接声明函数 function funcName(/*参数列表*/){ //函数体 } * 函数表达式 var funcName = function(){ ...

  5. Java中如何设置表格处于不可编辑状态

    代码片段如下: 这样的话就可以将表格设置为不可编辑状态

  6. js parseInt()与Number()区别

    说到转换成数字类型,我首先想到的是parseInt()方法,后来接触多了才发现还有一个Number()方法,同样是转换成数字类型,这两种方法有什么不同的呢? 1.parseInt():      pa ...

  7. python -- 字典 集合

    1.字典          定义:字典是以 key :value 的形式来保存数据,用{} 来表示,存储的是 key : value        查找效率比较高(注:字典存储数据时,用的是hash值 ...

  8. URL和URI(简单介绍)

    URL与URI 我们经常接触到的就是URL了,它就是我们访问web的一个字符串地址,那么URI是什么呢?他们是什么关系呢? URL:uniform resource location 统一资源定位符U ...

  9. cornerstone 使用-图标含义-分支-合并

    http://www.jianshu.com/p/7f5c019c528b http://www.cnblogs.com/fyongbetter/p/5404697.html

  10. 马凯军201771010116《面向对象程序设计(java)》第四周学习总结

    第一部分:理论知识学习部分 第四章 1.类与对象的基础概念. 对象:即数据,对象有三个特性:行为 .状态.标识. 类是对象,事物的描述和抽象,是具有相同属性和行为的对象集合.对象则是该类事物的实例. ...