【问题标题】:django, gunicorn, grpc: "Failed to pick subchannel" if run django grpc client with gunicorndjango、gunicorn、grpc:如果使用 gunicorn 运行 django grpc 客户端,则“无法选择子频道”
【发布时间】:2021-07-14 04:46:13
【问题描述】:

我是 Django 框架的初学者。我编写了一个包含 2 个微服务的应用程序。一个作为 Django Rest 服务器,另一个作为 Django GRPC 服务器。其余请求在第一台服务器中转换为 GRPC 请求并发送到第二台服务器以供进程使用。

      ------>|-----------|------->|-----------|
             |rest server|        |grpc server|
             |           |        |           |
      <------|-----------|<-------|-----------|

当我使用python manage.py runserver ip:port 运行第一台服务器时,应用程序运行正常。但是当我使用gunicorn myapp.wsgi --workers=1 --bind=ip:port 运行第一台服务器时,来自其余服务器的 grpc 请求会随机反击一个错误:

{"created":"@1593330482.005402565","description":"Failed to pick 
subchannel","file":"src/core/ext/filters/client_channel/client_channel.cc","file_line":3981,"refer
enced_errors":[{"created":"@1593330482.005396918","description":"failed to connect to all 
addresses","file":"src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc","file_l
ine":394,"grpc_status":14}]}

有趣的是 grpc 服务器收到了 grpc 请求并返回了响应。

wsgi.py:

import os

from django.core.wsgi import get_wsgi_application

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myapp.settings')

application = get_wsgi_application()

【问题讨论】:

    标签: python django grpc


    【解决方案1】:

    gunicorn 使用 fork 生成子进程。您可以在https://github.com/grpc/grpc/blob/master/doc/fork_support.md 中找到更多关于为什么会出现问题以及如何启用分叉支持的信息。

    简而言之,您可以尝试提供一个 env var GRPC_ENABLE_FORK_SUPPORT=true,或者先在没有 gunicorn 的情况下调试您的流量。

    回到描述,Failed to pick subchannel 可能发生在 RPC 发送之前。例如,名称解析需要一段时间,或者客户端启动时后端没有启动。请仔细检查客户端是否错过了消息。

    如果问题仍然存在,您可以向https://github.com/grpc/grpc/issues 提出问题吗?

    【讨论】:

    • 我想我找到了问题所在。在每个请求的 view.py 中,我创建了一个 grpc 通道。通道需要一些时间才能连接到服务器。我想如果我在通道未连接到服务器时发送 grpc 请求,就会发生此错误。代码正在开发中。我将更改 view.py 以重用 grpc 通道。之后,如果错误仍然存​​在,我将使用您的建议并通知您结果。谢谢。
    • 这是我提到的第二种情况。您可以显式阻止直到通道准备好,请参阅grpc.github.io/grpc/python/grpc.html#grpc.channel_ready_future
    猜你喜欢
    • 1970-01-01
    • 2021-11-25
    • 2021-07-08
    • 2020-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多