原文地址:http://blog.csdn.net/honglei915/article/details/37565119

之前讨论了consumer和producer是怎么工作的,现在来讨论一下数据传输方面。数据传输的事务定义通常有以下三种级别:

  1. 最多一次: 消息不会被重复发送,最多被传输一次,但也有可能一次不传输。
  2. 最少一次: 消息不会被漏发送,最少被传输一次,但也有可能被重复传输.
  3. 精确的一次(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设计篇之消息传输的事务定义相关推荐

  1. 漫游Kafka设计篇之数据持久化

    转载注明出处:http://blog.csdn.net/honglei915/article/details/37564595 Kafka视频教程同步首发,欢迎观看! 不要畏惧文件系统! Kafka大 ...

  2. 漫游Kafka设计篇之性能优化(7)

    Kafka在提高效率方面做了很大努力.Kafka的一个主要使用场景是处理网站活动日志,吞吐量是非常大的,每个页面都会产生好多次写操作.读方面,假设每个消息只被消费一次,读的量的也是很大的,Kafka也 ...

  3. 漫游Kafka设计篇之Producer和Consumer

    原文地址:http://blog.csdn.net/honglei915/article/details/37564871 Kafka视频教程同步首发,欢迎观看! Kafka Producer 消息发 ...

  4. 漫游Kafka设计篇之性能优化

    原文地址:http://blog.csdn.net/honglei915/article/details/37564757 Kafka视频教程同步首发,欢迎观看! Kafka在提高效率方面做了很大努力 ...

  5. 漫游Kafka设计篇之Producer和Consumer(4)

    Kafka Producer 消息发送 producer直接将数据发送到broker的leader(主节点),不需要在多个节点进行分发.为了帮助producer做到这点,所有的Kafka节点都可以及时 ...

  6. 漫游Kafka实现篇之消息和日志

    原文地址:http://blog.csdn.net/honglei915/article/details/37760631 Kafka视频教程同步首发,欢迎观看! 消息格式 日志 一个叫做" ...

  7. 漫游Kafka设计篇之主从同步

    原文地址:http://blog.csdn.net/honglei915/article/details/37565289 Kafka视频教程同步首发,欢迎观看! Kafka允许topic的分区拥有若 ...

  8. 漫游Kafka实战篇之客户端编程实例

    原文地址:http://blog.csdn.net/honglei915/article/details/37697655 Kafka视频教程同步首发,欢迎观看! Kafka Producer API ...

  9. 漫游Kafka实战篇clientAPI

    原文地址:http://blog.csdn.net/honglei915/article/details/37697655 Kafka Producer APIs 旧版的Procuder API有两种 ...

最新文章

  1. c语言日期星期程序,C语言程序设计: 输入年月日 然后输出是星期几
  2. dhcp报文_动态地址分配DHCP,IP地址管理方式及分配原则,一分钟了解下
  3. arcgis车辆轨迹动态_聪明反被聪明误 屏蔽车辆GPS被处罚
  4. 一些SAP S4CRM On-Premises开发的代码审查,2017-02-16
  5. php OpenSSL 加解密
  6. [译]如何在.NET Core中使用System.Drawing?
  7. 加速引擎SmartFlow助力浪潮云海超融合2021H1中国市场增速第一
  8. 视频PPT互动问答丨数据库技术前沿的创新与实践专题
  9. mysql 错误提示_Mysql必读mysql常见的错误提示问题处理小结
  10. Microsoft SQL Server 2000 索引碎片整理最佳实践(上)
  11. 让ssh跳转支持ipv6
  12. paip.修复文件关联总结
  13. ADC和DAC中常见技术术语
  14. 4am永远 鼠标按键设置_罗技的MX Master鼠标是苹果Mac系统下最好的鼠标
  15. 一张图看懂:左倾 右倾;左派 右派; 左翼 右翼
  16. AWS Academy 学生报名考证
  17. 用二代测序数据的reads组装一个基因序列
  18. ajax选项卡解析,ajax实现的选项卡
  19. 栈帧详解ebp、esp
  20. Google Chrome 浏览器最新版本 71.0.3578.98(正式版本) (64 位)

热门文章

  1. 多继承-概念、语法和基本演练
  2. mysql复制功能介绍
  3. 设计模式之_Strategy_06
  4. animate方法 jQuery中元素的创建 创建十个p标签 创建列表 动态创建列表
  5. opencv轮廓周长原理_OpenCV3 - 轮廓特征
  6. mac自带python怎么用_怎么在mac上使用python
  7. 【Unity】7.6 自定义输入
  8. 在Scrollview中使用AutoLayout
  9. 扩展GridView控件——为内容项添加拖放及分组功能
  10. Java转iOS-第一个项目总结(2)