【发布时间】:2018-07-26 17:39:02
【问题描述】:
我在 Flask 应用程序中使用 kafka-python (pip install kafka-python) 将消息发送到 Kafka 集群(运行版本 0.11)。该应用程序通过docker 部署到AWS elastic beanstalk。但是,我没有看到任何消息到达 Kafka(已通过控制台消费者验证)。
除了如何连接到正在运行的容器外,我对 docker 了解不多。所以这就是我所做的。我登录到 beanstalk 实例,然后连接到 docker 容器。在那里,我在 Python3 中运行了以下命令。
>> from kafka import KafkaProducer
>> p = KafkaProducer(bootstrap_servers='my_kafka_servers:9092', compression_type='gzip')
>> r = p.send(topic = 'my_kafka_topic', value = 'message from docker', key = 'docker1')
>> r.succeeded()
>> False
>> p.flush()
>> r.succeeded()
>> False
>> p.close()
>> r.succeeded()
>> False
在此期间,我有一个控制台使用者正在运行并监听该主题,但我没有看到任何消息。
我在 docker 容器“外部”(即在 beanstalk 实例中)做了同样的练习。我首先使用 pip 安装了kafka-python。然后在python3中运行以下。
>> from kafka import KafkaProducer
>> p = KafkaProducer(bootstrap_servers='my_kafka_servers:9092', compression_type='gzip')
>> r = p.send(topic = 'my_kafka_topic', value = 'message outside the docker', key = 'instance1')
>> r.succeeded()
>> False
# waited a second or two
>> r.succeeded()
>> True
这一次,我确实看到了来自控制台消费者的消息。
所以,我的问题是:
- 为什么 docker 会阻止 kafka 生产者的发送?
- 我该如何解决这个问题?
这是我需要发布 docker 配置的东西吗?我没有设置它,所以没有该信息。
编辑 我在项目中找到了一些 docker 配置的具体信息。
{
"AWSEBDockerrunVersion": "1",
"Image": {
"Name": "<AWS_ACCOUNT_ID>.dkr.ecr.<REGION>.amazonaws.com/<NAME>:<VERSION>",
"Update": "true"
},
"Ports": [
{
"ContainerPort": "80"
}
],
"Logging": "/var/eb_log"
}
【问题讨论】:
-
你是如何运行docker组件的,有没有命令说明?
标签: python-3.x docker apache-kafka amazon-elastic-beanstalk kafka-python