1.问题背景

有一个应用需要用kafka消费event hub的消息,其中两个kafka consumer同时连接到了同一个namespace下的两个event hub。

kafka:consumer:consumer1:bootstrap-servers: namespace.servicebus.windows.net:9093topic: topic1credentials: org.apache.kafka.common.security.plain.PlainLoginModule required username="$ConnectionString" password="Endpoint=sb://namespace.servicebus.windows.net/;SharedAccessKeyName=key-for-topic1;SharedAccessKey=key1blabla";consumer2:bootstrap-servers: namespace.servicebus.windows.net:9093topic: topic2credentials: org.apache.kafka.common.security.plain.PlainLoginModule required username="$ConnectionString" password="Endpoint=sb://namespace.servicebus.windows.net/;SharedAccessKeyName=key-for-topic2;SharedAccessKey=key2blablabalabala";

关于event hub namespace和event hub之间的关系,类比kafka的配置,可以简单地理解为event hub1和event hub2是两个不同的topic,event hub namespace相当于提供一个servername。图解如下:

其中consumer是通过share access signature(SAS)连接到不同的event hub的,这里的share access signature都是在对应的event hub下生成的具有listen权限的字符串,只能访问对应的event hub(topic)

2.问题描述

当consumer1连event hub1,同时consumer2连event hub2的时候,两个consumer无法同时消费event hub的消息,每次只有一个consumer能成消费,而且是随机的,这次是consumer1可以,下一次就是consumer2可以。

3.Application Log分析

比如当consumer1不能消费信息的时候,我们看到的application log是类似这样的(下面的log精简为抛出错误的类和错误信息):

  1. 与consumer1有关只有一条log:

Subscribed to topic(s):topic1

  • 3.与consumer2有关的是:
  1. Subscribed to topic(s):topic2
  2. Error while fetching metadata with correlation id 99 : {topic2=TOPIC_AUTHORIZATION_FAILED}
  3. Topic authorization failed for topics [topic2]
  4. Not authorized to access topics: [topic2]
  5. Finished assignment for group at generation 43: {namespace.servicebus.windows.net:c:consumer-group-name:Assignment(partitions=[topic2])}"
  6. Notifying assignor about the new Assignment(partitions=[topic2])
  7. Adding newly assigned partitions: topic2-0"
  8. Found no committed offset for partition topic2-0

可以看到前面的4条log都指明consumer2是认证失败的,但是不知为何从第5条开始就好了,直接去分配partitions了。虽然Log里面看到的信息很少,但是我们至少可以知道一个结论,这个bug是跟权限认证有关的。
但仅凭这些信息,我们是无法解决这个bug的,这也是为啥我找了一周和event hub相关的资料都没有解决问题,最后我换了个思路开始搜Kafka,然后幸运地看到了一个stackOverFlow的帖子Logstash pipeline issues when sending to multiple Kafka topics,于是我尝试了第一种方法,解决了这个问题。

4.解决步骤

解决方法可以参考第一个回答,用让这两个consumer使用同一个share access string,至于如何消费哪一个event hub,可以通过配置topic的值来区分。具体的方法是:

  • 在event hub的namespace中选择share access policy,新建一个policy,访问权限选择是listen,然后拿到“connection string-primary key”
  • 把上一步拿到的“connection string-primary key”作为credentials中的password
kafka:consumer:consumer1:bootstrap-servers: namespace.servicebus.windows.net:9093topic: topic1credentials: org.apache.kafka.common.security.plain.PlainLoginModule required username="$ConnectionString" password="Endpoint=sb://namespace.servicebus.windows.net/;SharedAccessKeyName=key-for-common-topic;SharedAccessKey=commonkeyblabla";consumer2:bootstrap-servers: namespace.servicebus.windows.net:9093topic: topic2credentials: org.apache.kafka.common.security.plain.PlainLoginModule required username="$ConnectionString" password="Endpoint=sb://namespace.servicebus.windows.net/;SharedAccessKeyName=key-for-common-topic;SharedAccessKey=commonkeyblabla";

所以这个问题跟kafka没有关系,还是Event hub认证的问题,也是没想到搜event hub找不到对应的帖子搜这个才知道的。

5.造成Bug原因

帖子中的第二个回答给出了具体的原因,因为连接event Hub的时候我们需要做认证,如果通过SAS的方式,那么我们是使用share access key和token的方式进行认证,这个token是由client生成的,由于我们是在同一个application下连接的event hub,两个consumer用的token是一样的。
两个consumer 用同一个token和不同的share access key,只有一个会通过,另一个会报错,
因此连接event hub的时候需要share access key也是一样的,如果不一样就会出现认证错误,所以我们的办法就是两个consumer用同一个share access key。

虽然解决了问题,但是这个解释还不够具体,我依然感到困惑。因此我会继续研究这个认证机制的具体细节,如果有进展在之后的博客更新。

[Azure][Event hub]Kafka无法同时连接到同一个namespace下的两个Event hub相关推荐

  1. 最新Kafka教程(包含kafka部署与基本操作、java连接kafka、spring连接kafka以及使用springboot)

    最新Kafka教程(包含kafka部署与基本操作.java连接kafka.spring连接kafka以及使用springboot) 欢迎转载,转载请注明网址:https://blog.csdn.net ...

  2. Kafka Producer对连接的管理

    Kafka Producer对连接的管理 使用TCP连接 Kafka Producer连接Broker采用TCP连接.  是基于以下几点考虑 可以使用TCP本身提供的某些高级特性,比如多路复用请求,同 ...

  3. 【Microsoft Azure 的1024种玩法】三十. 使用Azure Data Studio之快速上手连接管理Azure SQL 数据库(一)

    [简介] Azure Data Studio 是一种跨平台的数据库工具,适合在 Windows.macOS 和 Linux 上使用本地和云数据平台的数据专业人员,Azure Data Studio 利 ...

  4. 【Unity3D 问题总结】☀️ | 在Unity Hub中 许可证服务器连接失败 解决方案

    Unity 小科普 老规矩,先介绍一下 Unity 的科普小知识: Unity是 实时3D互动内容创作和运营平台 . 包括游戏开发.美术.建筑.汽车设计.影视在内的所有创作者,借助 Unity 将创意 ...

  5. HTG评论The Wink Hub:在不破坏资金的情况下为您的智能家居提供大脑

    Having a home packed with smart devices is great but managing them all in a smooth and unified fashi ...

  6. 小米手机2连接在UBUNTU12.04下调试

    把小米手机2直接连接到ubuntu, ADB工具不能识别,在网上找了一些文章,并 折腾了一下终于连上了,特记录下来. 参考 http://blog.csdn.net/qclzdh/article/de ...

  7. evt参数是干啥用的_http连接池中非常关键的两个参数,到底是干啥用的?

    作者简介:大厂一线资深开发.从crud开发到资深开发,再到研究员兼技术经理.<资深开发讲技术> 从一线实战中总结有故事,有背景的案例,希望带给大家一系列技术盛宴. 求关注,欢迎技术交流.友 ...

  8. 第三十三期:连接池中非常关键的两个参数,到底是干啥用的?

    说来惭愧,从事互联网开发好些年了,有些概念一直没有彻底搞清楚.其中之一就是,ttp client配置连接池的时候,maxConnectionsPerHost,和maxTotalConnections, ...

  9. wireshark linux远程,如何在SSH连接Linux的环境下使用wireshark抓包云边端架构?

    原标题:如何在SSH连接Linux的环境下使用wireshark抓包云边端架构? TSINGSEE青犀视频云边端架构EasyNVR.EasyDSS.EasyGBS等都是有两种操作系统的版本,一种是li ...

最新文章

  1. 十三、进程互斥的软件实现方法
  2. 数据库分页存储过程(5)
  3. VR跨界一触即发,探秘87870“魔都之夜”VR派对
  4. 谷歌杀手Wolfram Alpha搜索引擎上线测试
  5. 人工智能:自由能理论,AI未来的数学模型
  6. 没看完这11 条,别说你精通 Python 装饰器
  7. nginx搭建静态文件服务器,Nginx 静态文件服务器搭建及autoindex模块解析
  8. 算法---宝藏最优选择问题
  9. js serialize php 解,[转]JavaScript 版本的 PHP serialize/unserialize 完整实现
  10. google浏览器调试
  11. 其实,我只想安静的写写代码...
  12. 批量下载魔兽replays录像文件
  13. GreenSock GSAP 3.0 最新版 所有内容创建于2020年4月4日
  14. 魔方矩阵c语言,C语言 检验并打印魔方矩阵 在下面的5×5魔方矩阵中,每一行、每一列、...
  15. 饿了么ui 下拉框远程搜索 绑定清空原始数据
  16. Hapi入门--独立路由
  17. [UE4C++程序]GameModule与Plugin
  18. java计算机毕业设计列车票务信息管理系统源程序+mysql+系统+lw文档+远程调试
  19. 音频-mp3 -> pcm 解码
  20. 手机之家在线签名_手写签名在线生成器在线-手写签名在线生成器在线

热门文章

  1. 关于WGAN的学习总结——Lipschitz约束与正则化
  2. Don’t Touch What Matters: Task-Aware Lipschitz Data Augmentationfor Visual Reinforcement Learning
  3. 关于hive on spark的distribute by和group by使用以及小文件合并问题
  4. ARM 编译工具链详解
  5. python爬取pdf教程_#如何利用Python抓取PDF中的某些内容#python爬取pdf教程
  6. 详解CPU的主频、核心、线程、缓存、架构
  7. 腹有诗书气自华——记环宇通软CEO骆永华
  8. 【CTF WriteUp】UTCTF 2020部分题解
  9. Python当前时间是一年中第几周
  10. java解析excel文件详解_java解析excel文件的方法