exactly-once和kafka
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的更多相关文章
- Spark踩坑记——Spark Streaming+Kafka
[TOC] 前言 在WeTest舆情项目中,需要对每天千万级的游戏评论信息进行词频统计,在生产者一端,我们将数据按照每天的拉取时间存入了Kafka当中,而在消费者一端,我们利用了spark strea ...
- 消息队列 Kafka 的基本知识及 .NET Core 客户端
前言 最新项目中要用到消息队列来做消息的传输,之所以选着 Kafka 是因为要配合其他 java 项目中,所以就对 Kafka 了解了一下,也算是做个笔记吧. 本篇不谈论 Kafka 和其他的一些消息 ...
- kafka学习笔记:知识点整理
一.为什么需要消息系统 1.解耦: 允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束. 2.冗余: 消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险. ...
- .net windows Kafka 安装与使用入门(入门笔记)
完整解决方案请参考: Setting Up and Running Apache Kafka on Windows OS 在环境搭建过程中遇到两个问题,在这里先列出来,以方便查询: 1. \Jav ...
- kafka配置与使用实例
kafka作为消息队列,在与netty.多线程配合使用时,可以达到高效的消息队列
- kafka源码分析之一server启动分析
0. 关键概念 关键概念 Concepts Function Topic 用于划分Message的逻辑概念,一个Topic可以分布在多个Broker上. Partition 是Kafka中横向扩展和一 ...
- Kafka副本管理—— 为何去掉replica.lag.max.messages参数
今天查看Kafka 0.10.0的官方文档,发现了这样一句话:Configuration parameter replica.lag.max.messages was removed. Partiti ...
- Kafka:主要参数详解(转)
原文地址:http://kafka.apache.org/documentation.html ############################# System ############### ...
- kafka
2016-11-13 20:48:43 简单说明什么是kafka? Apache kafka是消息中间件的一种,我发现很多人不知道消息中间件是什么,在开始学习之前,我这边就先简单的解释一下什么是消息 ...
- Spark Streaming+Kafka
Spark Streaming+Kafka 前言 在WeTest舆情项目中,需要对每天千万级的游戏评论信息进行词频统计,在生产者一端,我们将数据按照每天的拉取时间存入了Kafka当中,而在消费者一端, ...
随机推荐
- Windows下命令行怎样登录MySQL
直接cmd回车然后 “ mysql -u root -p ” 登录时出现错误,原来是权限不够 打开cmd时需要以管理员的身份打开 然后继续使用 “ mysql -u root -p ” 还是不行, ...
- part4:素数判别
法一: √n判别 这个的话就是暴力了吧,不过只能判别单个数是不是质数,而且很大的话会爆 //没有代码qwq(不想写 法二:埃式筛法 O(nloglogn)判别 直接代码好不啦: ],n,num; ]; ...
- 2015-10-05 js3
Javascript 实例2九九乘法表 var s = ""; s += "<table>"; for (var i = 1; i < 10; ...
- day 01 python基础
1.计算机历史 2.python历史 宏观: python2和python3的区别: python2 源码不标准,混乱,重复代码过多 python3 统一标准,去除重复代码 3.python环境 ...
- 20175227张雪莹 2018-2019-2 《Java程序设计》第六周学习总结
20175227张雪莹 2018-2019-2 <Java程序设计>第六周学习总结 教材学习内容总结 第七章 内部类与异常类 内部类:在一个类中定义另一个类:包含内部类的类为外嵌类 内部类 ...
- asp.net ajax控件选项卡控件的选项卡的动态显示与隐藏问题
if (dq_gly.Yhm != "admin") { this.TabContainer1.Tabs[0].Visible = false; this.TabContainer ...
- day20_python_1124
01 昨日内容回顾 类的名称空间 对象的空间 class A: def __init__(): pass obj = A() 对象查询属性:对象本身 ----> 类 -----> 父类 类 ...
- windows下《Go Web编程》之Go环境配置和安装
<Go Web编程>笔者是基于unix下讲述的,作为入门练手,我选择在windows下开发,全程按照目录进行... 一.安装 windows下需要安装MinGW,通过MinGW安装gcc支 ...
- Python中的yield生成器的简单介绍
Python yield 使用浅析(整理自:廖 雪峰, 软件工程师, HP 2012 年 11 月 22 日 ) 初学 Python 的开发者经常会发现很多 Python 函数中用到了 yield 关 ...
- tensorFlow(五)深层神经网络
TensorFlow基础见前博客 上实例: MNIST 数据集介绍 MNIST 是一个手写阿拉伯数字的数据集. 其中包含有 60000 个已经标注了的训练集,还有 10000 个用于测试的测试集. 本 ...