zoukankan      html  css  js  c++  java
  • 九 assign和subscribe

    1 subscribe:  自动安排分区, 通过group自动重新的负载均衡;

    •   关于Group的实验: 如果auto commit = true, 重新启动进程,如果是同样的groupID,从上次commit的地方开始消费数据,但是如果换了group后,就可以继续   消费了。
    •  auto commit = true, 多个consumer是同一个group,并且consumer是同时创建的,同时消费: 不出现重复消费的现象。
    •  auto commit = true, 多个consumer是同一个group, 但是多个consumer的启动有时间间隔,一般也不会出现重复消费数据的情况。
    •  auto commit = false,多个consumer是同一个group, 但是启动有间隔, 会出现重复消费的情况,即使同一个consumer都会出现重复。

                      因为本地存了offset,在进程没重启之前,应该是不会消费重复数据,但是为什么会导致有重复数据呢?猜测是因为,每隔一段时间有

                      consumer加进来,导致rebalance, offset混乱导致?(仅仅猜测

    • auto commit = false, 多个consumers同时创建,是同一个group, 没有发现重复的数据。因为是同时创建,是在消费之前就有了,不用rebalance,所以不会重复消       费数据。  
    •  auto commit = false,一个consumer执行完3个poll,然后close consumer, 再启动下一个(也就是多个consumer串行),可以重复消费。

           总结: 通过以上test cases发现, 只要是auto commit  = false, 并且在消费过程中,因为consumer个数的变化,就会导致有一些数据重复消费。这是因为本地保存了offset,但是没有提交到server,rebalance会导致重复消费。

    假设进程A正在消费分区1的信息,并提交了偏移量,之后又消费了10条数据,还没来得及提交偏移量的时候,reblance机制让进程B来继续消费分区1的信息,
    
    此时进程B会从上次进程A提交偏移量的地方开始消费,因此这10条数据就是重复消费的。
    当reblance比较频繁的时候,就会造成大量数据的重复。    
    
    因为kafka的offset下标的记录实际会有两份服务端会自己记录一份,本地的消费者客户端也会记录一份,提交的offset会告诉服务端已经消费到这了,
    但是本地的还没有提交的(应该是保存在进程中)并不会因此而改变offset进行再次消费。    

    2 assign:

            手动指定消费的分区(用户指定分区);不支持group的自动负载均衡(因为分区已经指定了,就不会在consumer之间负载均衡了);

             assign不会叠加,后一个会覆盖前一个(调用assign两次,后一个覆盖前一个);

    多个同样配置的consumer同时消费同一个分区:

    • earliest,auto commit = false: 多个consumer同时创建,是同一组, 消费同一个分区,会重复消费,因为组根本没意义。 如果此时继续
    •                                      producer新消息, 也是重复消费
    • earliest:auto commit = false: 多个consumer间隔创建,是同一组, 消费同一个分区,会重复消费,因为组根本没意义。如果此时继续
    •                                                 producer新消息, 也是重复消费
    • auto commit = true这个配置不起作用, 每次还能从头消费,证明没有commit。



     auto commit 对assign不起作用,实验一下consumer.commitSync()函数:

    • poll完commit: 多个consumer同时创建,是同一组, 消费同一个分区,会重复消费,因为consumer同时创建,同时读取, commit还没来得及保存到server,所以重复消费。
    • earliest, poll完commit: 多个consumer间隔创建,是同一组, 消费同一个分区,不会重复消费,因为consumer不是同时的,先commit的consumer是可以提交到server的,后面的就不会重复消费了。


     auto.offset.reset值含义解释:

    • earliest:当各分区下有已提交的offset时,从提交的offset开始消费;无提交的offset时,从头开始消费
    • latest:当各分区下有已提交的offset时,从提交的offset开始消费;无提交的offset时,消费新产生的该分区下的数据
    • none:topic各分区都存在已提交的offset时,从offset后开始消费;只要有一个分区不存在已提交的offset,则抛出异常
    offset commit是在Consumer端进行的操作,将下一次消费的位置(本次poll/准确的说是fetch?的最大record的后一位)commit到服务器。
    有两种commit方式:自动提交与手动提交。
    设置参数 props.put("enable.auto.commit", "true");开启自动提交,这样在执行poll命令后会立即将下一个offset提交至服务器。
    
    另外,也可以通过seek函数手动控制Consumer的position(即设置poll时的起始offset),这样就可以跳过一些数据或者获取一些历史数据:(注意使用seek设置指定partition的offset时该Consumer必须要先assign订阅了该partition。)
  • 相关阅读:
    vue-cli webpack3扩展多模块打包
    性能对比:aelf智能合约运行环境性能是evm的1000倍
    aelf帮助C#工程师10分钟零门槛搭建DAPP&私有链开发环境
    ASP.NET Core依赖注入最佳实践,提示&技巧
    linux环境安装php fileinfo扩展
    简单的部署nodejs和web应用
    安卓NDK操作sqlite3
    [解决]微信小程序调用wx.login解密之后出现乱码的问题
    windows server 2008 iis 添加ssl证书
    Mac 下修改文件或文件夹的隐藏状态
  • 原文地址:https://www.cnblogs.com/liufei1983/p/10099804.html
Copyright © 2011-2022 走看看