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. Windows下命令行怎样登录MySQL

    直接cmd回车然后 “ mysql -u root -p  ”  登录时出现错误,原来是权限不够 打开cmd时需要以管理员的身份打开 然后继续使用 “ mysql -u root -p ” 还是不行, ...

  2. part4:素数判别

    法一: √n判别 这个的话就是暴力了吧,不过只能判别单个数是不是质数,而且很大的话会爆 //没有代码qwq(不想写 法二:埃式筛法 O(nloglogn)判别 直接代码好不啦: ],n,num; ]; ...

  3. 2015-10-05 js3

    Javascript 实例2九九乘法表 var s = ""; s += "<table>"; for (var i = 1; i < 10; ...

  4. day 01 python基础

    1.计算机历史 2.python历史 宏观: python2和python3的区别: python2  源码不标准,混乱,重复代码过多 python3  统一标准,去除重复代码 3.python环境 ...

  5. 20175227张雪莹 2018-2019-2 《Java程序设计》第六周学习总结

    20175227张雪莹 2018-2019-2 <Java程序设计>第六周学习总结 教材学习内容总结 第七章 内部类与异常类 内部类:在一个类中定义另一个类:包含内部类的类为外嵌类 内部类 ...

  6. asp.net ajax控件选项卡控件的选项卡的动态显示与隐藏问题

    if (dq_gly.Yhm != "admin") { this.TabContainer1.Tabs[0].Visible = false; this.TabContainer ...

  7. day20_python_1124

    01 昨日内容回顾 类的名称空间 对象的空间 class A: def __init__(): pass obj = A() 对象查询属性:对象本身 ----> 类 -----> 父类 类 ...

  8. windows下《Go Web编程》之Go环境配置和安装

    <Go Web编程>笔者是基于unix下讲述的,作为入门练手,我选择在windows下开发,全程按照目录进行... 一.安装 windows下需要安装MinGW,通过MinGW安装gcc支 ...

  9. Python中的yield生成器的简单介绍

    Python yield 使用浅析(整理自:廖 雪峰, 软件工程师, HP 2012 年 11 月 22 日 ) 初学 Python 的开发者经常会发现很多 Python 函数中用到了 yield 关 ...

  10. tensorFlow(五)深层神经网络

    TensorFlow基础见前博客 上实例: MNIST 数据集介绍 MNIST 是一个手写阿拉伯数字的数据集. 其中包含有 60000 个已经标注了的训练集,还有 10000 个用于测试的测试集. 本 ...