python - Docker + pubsub + subprocess 挂起且没有错误

标签 python docker grpc publish-subscribe google-cloud-pubsub

我在 docker 容器中运行 pubsub,几分钟后遇到挂起。我一直在 docker 之外使用类似的命令运行 pubsub,并且没有看到挂起(运行超过 1 年)。

我能够通过下面概述的简化实现来重现我的问题。

以下四个文件(docker file、requirements.txt、worker.py、test.py)放在同一个目录下。它们位于此要点中。基本上,worker.py 正在调用一个子进程函数,该函数调用 test.py 来运行 time.sleep(3)。

Gist for code and debug outputs

为了构建 docker 文件,我将 Dockerfile、requirements.txt、worker.py 和 test.py 放入一个目录并运行:

docker build --tag=test .

要运行 docker 文件,我执行了以下操作:
docker run -it \
   -e GOOGLE_APPLICATION_CREDENTIALS=/keys/service-account.json \
   -e GRPC_ENABLE_FORK_SUPPORT=false \
   -e GRPC_VERBOSITY=debug \
   -e GRPC_TRACE=all \
   -v /tmp/keys/:/keys/:ro \
   -v /tmp/logs:/logs \
test:latest bash

文件 service-account.json 包含我的 pubsub key 。

我在我的 Mac 上运行 docker,但我也经历过使用 kubernetes 和运行 docker 的 Ubuntu 18.04 机器上的相同挂起。问题是几分钟后,pubsub 订阅者变得无响应。上面的代码在没有 docker 的虚拟环境中完美运行。

文件(要点)publish_output.txt 是我的 pubsub 发布者输出的日志文件,并包含消息 ID。

文件subscriber_output.txt (in gist) 是订阅者日志输出。我将 GRPC_TRACE 设置为 all 并将 GRPC_VERBOSITY 设置为调试。
收到的最后一条成功消息是消息 ID 1253690400552289(subscriber_output.txt 的第 9338 行)。 pubsub 未收到 1253713007710668、1253714609061509、1253713464329969 及以后的消息。

我需要做任何额外的设置吗?不幸的是,我正在从 python 运行自定义 C++ 代码,所以我需要使用子进程。

我的 docker 配置中的当前 python 包:
CacheControl             0.12.6
cachetools               4.1.0
certifi                  2020.4.5.1
chardet                  3.0.4
firebase                 3.0.1
firebase-admin           4.3.0
firestore                0.0.8
google-api-core          1.18.0
google-api-python-client 1.9.1
google-auth              1.16.1
google-auth-httplib2     0.0.3
google-cloud-core        1.3.0
google-cloud-firestore   1.7.0
google-cloud-logging     1.15.0
google-cloud-pubsub      1.5.0
google-cloud-storage     1.28.1
google-resumable-media   0.5.1
googleapis-common-protos 1.52.0
grpc-google-iam-v1       0.12.3
grpcio                   1.29.0
httplib2                 0.18.1
idna                     2.9
iso8601                  0.1.12
msgpack                  1.0.0
pip                      20.1.1
protobuf                 3.12.2
pyasn1                   0.4.8
pyasn1-modules           0.2.8
pytz                     2020.1
requests                 2.23.0
rsa                      4.0
setuptools               46.4.0
six                      1.15.0
uritemplate              3.0.1
urllib3                  1.25.9
wheel                    0.34.2

任何帮助表示赞赏。

谢谢!

最佳答案

看起来问题出在 google-core-api 上。

我能够按照这里的建议解决它:

https://github.com/googleapis/python-pubsub/issues/112

基本上 requirements.txt 应该使用这些版本:

google-api-python-client <= 1.8.4
google-api-core <= 1.16.0

关于python - Docker + pubsub + subprocess 挂起且没有错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62209196/

相关文章:

python - 绘制非多项式多元隐式方程

go - grpc:收到的消息大于最大值(8653851 与 4194304)

jenkins - 为什么 Docker 在将图像推送到私有(private)注册表时会重置连接?

git - "gcloud auth activate-service-account"和 "gcloud source repos clone"错误

java - Spring Boot gRPC : How to return error code when business error happens?

ssl - 无法与 Kubernetes 中的 Go gRPC 服务通信

python - 如何使用Python在多个CPU核心上运行外部程序?

python - 将两个列表组合成一个新列表并排序

python - 在 OS X 中使用相对(而不是绝对)鼠标移动的方法?

docker - 安装 Docker 时的 WSL2 lan 重定向问题