最近在StackOverflow碰到的一个问题,即在consumer.poll之后assignment()返回为空的问题,如下面这段代码所示:

consumer.subscribe(Arrays.asList("test"));
consumer.poll(Duration.ofMillis(0));
// consumer.poll(0);
Set<TopicPartition> assignment = consumer.assignment(); // empty!

有意思的是,如果是consumer.poll(0);则assignment不为空。之前我以为poll(long)被标记为“Deprecated”之后使用poll(Duration)是相同的效果,现在看来两者还是要有差别的。为什么poll(0)就能获取到consumer分配方案,而使用poll(Duration)就不能呢?

调研了一番之后发现原因如下:在poll(0)中consumer会一直阻塞直到它成功获取了所需的元数据信息,之后它才会发起fetch请求去获取数据。虽然poll可以指定超时时间,但这个超时时间只适用于后面的消息获取,前面更新元数据信息不计入这个超时时间。poll(Duration)这个版本修改了这样的设计,会把元数据获取也计入整个超时时间。由于本例中使用的是0,即瞬时超时,因此consumer根本无法在这么短的时间内连接上coordinator,所以只能赶在超时前返回一个空集合。这就是为什么使用不同版本的poll命令assignment不同的原因。

仔细想想为什么社区要做这样的变更?poll(0)这种设计的一个问题在于如果远端的broker不可用了, 那么consumer程序会被无限阻塞下去。用户指定了超时时间但却被无限阻塞,显然这样的设计时有欠缺的。特别是对于Kafka Streams而言,这个设计可能导致的问题在于Stream Thread无法正常关闭。目前源代码中依然有一些无限阻塞的场景,比如之前处理的initTransaction,commitTransaction和abortTransaction也是无限等待。看来后面社区还是需要慢慢地将它们都替换掉,毕竟在分布式系统中没有什么场景是需要绝对地等待的。

最新文章

  1. [转]SQL Relay使用
  2. supervisor安装和配置
  3. codevs 2924 数独
  4. 【BZOJ】【1565】【NOI2009】PVZ 植物大战僵尸
  5. ExtJS4.2学习(18)时间控件(转)
  6. onethink和phpwind共享
  7. jQuery未定义错误原因(jQuery is not define)
  8. Web开发入门学习笔记
  9. lua版本的一个状态机
  10. 网络流之P3254 圆桌问题
  11. asd短片数篇
  12. 工控随笔_13_西门子_WinCC的VBS脚本_04_变量类型之二
  13. 21-matlab 迷宫题
  14. 前端 - Ajax (1)
  15. 如何快速学习Scala
  16. 解决在antd中使用 autoprefixer 9.4.5 会抛出错误 Replace text-decoration-skip: ink to text-decoration-skip-ink: auto, because spec had been changed 的问题
  17. Codeforces Round 500 (Div 2) Solution
  18. C++ 后台进程 daemon
  19. js如何判断小数点后有几位
  20. Linux之MySQL

热门文章

  1. Html块标签、含样式的标签、语义化的标签:
  2. Python实现图像信息隐藏
  3. Java 集合总体框架介绍
  4. fast-fail事件的产生及其解决办法
  5. oracle 存储过程调用方式
  6. Linux之nginx反向代理+三台web+nfs共享存储实现集群配置
  7. Java 读取 txt 文件内容到容器 List
  8. Compile groovy mixed with java in Maven
  9. 9、js扩展
  10. __c语言__测一段代码的运行时间