小编Wea*_*ana的帖子

Docker和VirtualBox VM中的Apache Kafka

我正在尝试使用Apache Kafka,即在虚拟机中与docker(wurstmeister/kafka-docker)连接的版本,并通过VM的主机系统连接到dockers中的kafka代理.

我将更详细地描述设置:

我的主机系统是在"通常"计算机上运行的Ubuntu 64位14.04.3 LTS(内核3.13).我有一个完整而复杂的各种码头集装箱相互作用的结构.为了不干扰或更好地说,要封装整个结构,不能直接在主机系统上运行docker镜像.另一个原因是需要在主机上使用不同的python库,这会干扰docker-compose所需的python-lib版本(用于启动不同的docker镜像).

因此,所需的解决方案应该是通过VirtualBox(来宾系统:Ubuntu 16.04.1 LTS)设置虚拟机,并在此VM中完全运行docker环境.这具有明显的优点,即VM本身可以完全根据docker结构的要求进行配置.

如上所述,其中一个docker镜像提供了用于通信和消息传递的kafka和zookeeper功能.这意味着.yaml文件设置运行此映像的容器,将kafka和zookeeper的所有必需端口转发到docker环境的主机系统(这是虚拟机VM的guest虚拟机系统).为了使docker环境在主机系统中可见,我通过VirtualBox中的网络设置转发了所有端口(网络 - >适配器NAT - >高级 - >端口转发).系统的行为如下:

当我运行docker-environment(包括kafka)时,我可以从VM-kafka连接,使用和生成,它使用推荐的标准kafka shell脚本(producer和consumer api).

当我在VM guest系统上运行Kafka和zookeeper服务器时,我可以从VM(主机)外部连接,生成和使用生产者和消费者api.

当我在docker环境中运行Kafka时,我可以从VM外部的主机系统连接,这意味着我可以看到所有主题,获取有关主题的信息,同时还可以看到来自docker中的kafka和zookeeper的一些调试输出.

遗憾的是,生成或消费来自主机系统到/来自docker-kafka的任何消息是不可能的.从生产者API我得到一个"批量过期"异常,消费者返回一个"ClosedChannelException".

我做了很多谷歌搜索,并找到了很多提示如何解决类似的问题.其中大多数引用kafka-server.properties中的advertised.host.name参数,该参数可通过.yaml中的KAFKA_ADVERTISED_HOST_NAME访问./sf/answers/2476184021/例如,当上述两个错误发生时,指的是该参数.不幸的是,没有一个场景同时具有docker和VM功能.

更多尝试修改此参数根本没有影响.虽然我对docker kafka 不太熟悉,但我可以在这里看到一个问题,因为kafka消费者和生产者将获得docker环境的本地IP,在NAT情况下为10.0.2.15,用作代理.但不幸的是,这个IP并不是来自VM之外的.因此,解决方案可能是更改的设置,其中应该使用VirtualBox网络中的桥接模式.这里奇怪的是,(当然)桥接连接导致了自己的虚拟机的IP通过DHCP,然后导致不可接近的泊坞窗,卡夫卡从虚拟机主机系统.这最后的行为对我来说似乎很尴尬.

总结我的问题是,如果有人对这个或类似场景有一些经验并且可以告诉我,如何配置docker-kafka,VirtualBox VM和主机系统.我已经为消费者和制作人电话尝试了很多不同的设置而没有成功.当然,也欢迎一些码头工人,卡夫卡或码头工人和卡夫卡专家回答.

如果您需要其他信息或者可以提供一些提示,请告诉我们.

提前致谢

virtualbox apache-kafka docker ubuntu-14.04

5
推荐指数
0
解决办法
563
查看次数

在 C++ 中更改现有 protobuf 消息的元素

我只是想知道,为什么没有人解决我最近遇到的与 google protobufs 相关的问题,但是经过广泛的谷歌搜索、阅读谷歌手册页的文档并在 Stackoverflow-DB 中搜索后,我没有找到解决方案。

我在 Ubuntu 14.04.3 LTS 上使用 proto2-c++-API,通过 cmake 文件使用 gcc/g++ 进行编译。

我有一个从文件中读取二进制(序列化)google 协议缓冲区消息的应用程序。该程序的目的是将消息(不进行反序列化)发送到另一个应用程序,该应用程序继续处理实际数据。

我现在想修改一些消息,从文件中读取,以便我可以测试第二个应用程序的功能。不幸的是,我的消息包含很多嵌套消息,因此在反序列化之后我必须调用类似

message().a().b().c()....x().value(); 
Run Code Online (Sandbox Code Playgroud)

能够处理实际数据。

我现在的问题是,如何在x不创建另一个类型的消息的情况下更改 的值,message其中我还必须创建所有子消息 ( a,b,c...) 并将这些分配给各自的前任,就像下面的伪代码一样?!

a = new a();
b = new b();
c = new c();
...
v = new v();
w = new w();
x = new x();
x.set_value();
w.set_allocated_x_value(x);
v.set_allocated_w_value(w);
...
a.set_allocated_b_value(b);
message.set_allocated_a_value(a);

...
/* forward message to second application */
...


delete x;
delete w;
...
delete a;
Run Code Online (Sandbox Code Playgroud)

显然,不可能set_value …

c++ protocol-buffers protobuf-c

3
推荐指数
1
解决办法
3777
查看次数