Kafka:从主机发布的事件不会在Docker中运行的应用程序使用

莎莎(Sasha Shpota)

我正在为应用程序编写端到端测试。我启动了一个应用程序实例,一个Kafka实例和一个Zookeeper(均已Docker化),然后与应用程序API交互以测试其功能。我需要在此应用程序中测试事件使用者的功能。我发布了测试中的事件,应用程序有望处理这些事件。

问题:如果我在本地(不在Docker中)运行应用程序并运行会产生事件的测试,则应用程序代码中的使用者可以正确处理事件。在这种情况下,使用者和测试已bootstrapServers设置为localhost:9092但是,如果应用程序作为Dockerized实例运行,则不会看到事件。在这种情况下bootstrapServerskafka:9092在应用程序和localhost:9092测试中将设置为kafkaDocker容器名称。kafka容器暴露它的9092端口,使卡夫卡的同一个实例可以从泊坞窗容器内,并从主机(运行我的测试)来访问主机。

代码中的唯一区别是localhostvskafka设置为引导服务器。在这两种情况下,消费者和生产者都可以成功启动;事件发布没有错误。只是在一种情况下,消费者没有收到事件。

问题:如何使Docker化的使用者看到从主机发布的事件?

注意:我有一个配置正确的Docker网络,其中包括应用程序实例,Zookeeper和Kafka。他们都互相“见”。的相应的端口kafkazookeeper被暴露到主机。卡夫卡港口:0.0.0.0:9092->9092/tcpZookeeper端口:22/tcp, 2888/tcp, 3888/tcp, 0.0.0.0:2181->2181/tcp

我正在使用wurstmeister / kafkawurstmeister / zookeeper Docker映像(我无法替换它们)。

任何想法/想法表示赞赏。您将如何调试它?

更新:问题是KAFKA_ADVERTISED_LISTENERSKAFKA_LISTENERS设置为INSIDE和OUTSIDE通信的不同端口的env变量有关。解决方案是在Docker容器中运行应用程序代码时使用正确的端口。

尼克斯

这类问题通常与Kafka处理经纪人地址的方式有关。

当您启动Kafka经纪人时,它会绑定自己0.0.0.0:9092并使用地址在Zookeeper注册<hostname>:9092与客户建立联系时,将与Zookeeper联系以获取特定经纪人的地址。

这意味着,当您启动Kafka容器时,会遇到以下情况:

  • 容器名称:kafka
  • 网络名称:kafkanet
  • 主机名:kafka
  • 在动物园管理员上注册:kafka:9092

现在,如果您从kafkanet网络内部的容器中将客户端连接到Kafka,则从Zookeeper返回的地址就是kafka:9092可以通过kafkanet网络解析的地址。

但是,如果您从外部docker连接到Kafka(即使用localhost:9092docker映射终结点),您仍会获取kafka:9092无法解析地址。

为了解决此问题,您可以在代理配置中指定advertised.host.name和,advertised.port以使所有客户端都可以解析该地址(请参阅文档)。

通常要做的是设置advertised.host.name<container-name>.<network>(在您的情况下为kafka.kafkanet),以便连接到网络的任何容器都能够正确解析Kafka代理的IP。

但是,在您的情况下,您具有混合的网络配置,因为某些组件位于docker内部(因此能够解析kafkanet网络),而其他组件则位于docker内部。如果是生产系统,我的建议是将设置advertised.host.name为主机的DNS / IP,并始终依靠docker端口映射来访问Kafka代理。

但是从我的理解来看,您只需要此设置即可测试所有内容,因此最简单的方法是“欺骗”位于docker外部的系统。使用上面指定的命名,这意味着只需将/etc/hostsline添加到您(或Windows等效)中127.0.0.1 kafka.kafkanet

这样,当您居住在docker外部的客户端连接到Kafka时,将会发生以下情况:

  1. 客户端->通过本地主机卡夫卡:9092
  2. kafka查询Zookeeper并返回主机 kafka.kafkanet
  3. 客户端解析kafka.kafkanet为127.0.0.1
  4. 客户-> Kafka通过127.0.0.1:9092

编辑

正如在评论中指出,新版本的卡夫卡现在使用的概念listenersadvertised.listeners其在地方的使用host.nameadvertised.host.name(被弃用,只在未指定以上的有情况下使用)。但总体思路是相同的:

  • host.name:指定Kafka经纪人应将自身绑定到的主机(与 port
  • listeners:指定Kafka代理应绑定到的所有端点(例如PLAINTEXT://0.0.0.0:9092,SSL://0.0.0.0:9091
  • advertised.host.name:指定如何将代理发布给客户端(即客户端应使用哪个地址连接到客户端)
  • avertised.listeners:指定所有发布的端点(例如PLAINTEXT://kafka.example.com:9092,SSL://kafka.example.com:9091

在这两种情况下,客户端都必须能够与Kafka成功通信,他们需要能够解析并连接到advertised主机名和端口。

在这两种情况下,如果未指定,它们将由代理自动使用运行代理的计算机的主机名派生。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Turbolinks 加载事件永远不会在全新的 Rails 5.1 应用程序中触发

来自分类Dev

瑞克任务不会在我的sinatra应用程序中运行

来自分类Dev

点击应用程序图标不会在应用程序中显示通知

来自分类Dev

点击应用程序图标不会在应用程序中显示通知

来自分类Dev

Flutter应用程序不会在发布模式下请求存储许可

来自分类Dev

默认的MVC5应用程序不会在浏览器VS Express 2013中以调试模式运行

来自分类Dev

我的应用程序不会在spring-secuirty.xml文件中的bean声明代码处运行“ XmlBeanDefinitionStoreException”,

来自分类Dev

使用 jest 运行时,应用程序不会在 history.push 上重新呈现

来自分类Dev

pyinstaller:应用程序不会在其他计算机上运行?

来自分类Dev

Mono WinFroms 应用程序不会在启动时运行

来自分类Dev

Firebase 云消息传递不会在应用程序运行时发出通知

来自分类Dev

Xcode不会在模拟器上运行该应用程序。(应用程序意外退出)

来自分类Dev

Spring-boot应用程序不会在Docker内部启动时启动

来自分类Dev

即使扩展了应用程序图标,共享扩展程序的应用程序图标也不会在设备中更新

来自分类Dev

应用程序不会在recyclerview火力显示数据

来自分类Dev

应用程序不会在调试模式下启动

来自分类Dev

在 Heroku 中更改 ENV 变量不会在 Phoenix 应用程序中更改它们

来自分类Dev

rCharts不会在闪亮的应用程序中渲染图

来自分类Dev

ffmpeg不会在我的项目中构建,在示例应用程序中可以正常工作

来自分类Dev

字体不会在Production Rails应用程序中呈现

来自分类Dev

类不会在GWT应用程序中序列化

来自分类Dev

单击Firebase动态链接不会在AppDelegate中调用应用程序(_:继续:restoreHandler :)方法

来自分类Dev

npm install不会在react应用程序中修改package.json

来自分类Dev

TextField将不会在Cocoa应用程序中更新

来自分类Dev

webstorm不会在nodejs应用程序中的断点处停止

来自分类Dev

类不会在GWT应用程序中序列化

来自分类Dev

应用程序不会在随机访问文件中搜索零

来自分类Dev

JSF不会在setter和getter中获取数据(CRUD应用程序)

来自分类Dev

`xdg-open` 不会在首选应用程序中打开文件

Related 相关文章

  1. 1

    Turbolinks 加载事件永远不会在全新的 Rails 5.1 应用程序中触发

  2. 2

    瑞克任务不会在我的sinatra应用程序中运行

  3. 3

    点击应用程序图标不会在应用程序中显示通知

  4. 4

    点击应用程序图标不会在应用程序中显示通知

  5. 5

    Flutter应用程序不会在发布模式下请求存储许可

  6. 6

    默认的MVC5应用程序不会在浏览器VS Express 2013中以调试模式运行

  7. 7

    我的应用程序不会在spring-secuirty.xml文件中的bean声明代码处运行“ XmlBeanDefinitionStoreException”,

  8. 8

    使用 jest 运行时,应用程序不会在 history.push 上重新呈现

  9. 9

    pyinstaller:应用程序不会在其他计算机上运行?

  10. 10

    Mono WinFroms 应用程序不会在启动时运行

  11. 11

    Firebase 云消息传递不会在应用程序运行时发出通知

  12. 12

    Xcode不会在模拟器上运行该应用程序。(应用程序意外退出)

  13. 13

    Spring-boot应用程序不会在Docker内部启动时启动

  14. 14

    即使扩展了应用程序图标,共享扩展程序的应用程序图标也不会在设备中更新

  15. 15

    应用程序不会在recyclerview火力显示数据

  16. 16

    应用程序不会在调试模式下启动

  17. 17

    在 Heroku 中更改 ENV 变量不会在 Phoenix 应用程序中更改它们

  18. 18

    rCharts不会在闪亮的应用程序中渲染图

  19. 19

    ffmpeg不会在我的项目中构建,在示例应用程序中可以正常工作

  20. 20

    字体不会在Production Rails应用程序中呈现

  21. 21

    类不会在GWT应用程序中序列化

  22. 22

    单击Firebase动态链接不会在AppDelegate中调用应用程序(_:继续:restoreHandler :)方法

  23. 23

    npm install不会在react应用程序中修改package.json

  24. 24

    TextField将不会在Cocoa应用程序中更新

  25. 25

    webstorm不会在nodejs应用程序中的断点处停止

  26. 26

    类不会在GWT应用程序中序列化

  27. 27

    应用程序不会在随机访问文件中搜索零

  28. 28

    JSF不会在setter和getter中获取数据(CRUD应用程序)

  29. 29

    `xdg-open` 不会在首选应用程序中打开文件

热门标签

归档