【问题标题】:Google Cloud App Engine Flexible Python 2.7 Env Errors starting new threadsGoogle Cloud App Engine 灵活的 Python 2.7 环境错误启动新线程
【发布时间】:2018-12-25 10:24:27
【问题描述】:

我知道足够多的 devops 是危险的。我已经成功地向 App Engine 部署了一个非常简单的 python 烧瓶应用程序,它基本上将收到的帖子数据作为消息发布到 PubSub。这样做几乎与 Google 的 sample code 相同。唯一的区别是它使用我通过应用程序存储库推送的服务帐户来访问 PubSub 以规避this issue

到目前为止工作得很好,但我开始看到在threading.py 中启动新线程时出现了极少数错误:

1)

Traceback (most recent call last):
  File "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi", line 33, in grpc._cython.cygrpc._spawn_callback_async
  File "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi", line 24, in grpc._cython.cygrpc._spawn_callback_in_thread
  File "/usr/lib/python2.7/threading.py", line 736, in start
    _start_new_thread(self.__bootstrap, ())
thread.error: can't start new thread

2)

Traceback (most recent call last):
  File "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi", line 33, in grpc._cython.cygrpc._spawn_callback_async
  File "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi", line 24, in grpc._cython.cygrpc._spawn_callback_in_thread

3)

Traceback (most recent call last):
  File "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi", line 33, in grpc._cython.cygrpc._spawn_callback_async
  File "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi", line 33, in grpc._cython.cygrpc._spawn_callback_async
  File "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi", line 24, in grpc._cython.cygrpc._spawn_callback_in_thread
  File "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi", line 24, in grpc._cython.cygrpc._spawn_callback_in_thread
  File "/usr/lib/python2.7/threading.py", line 736, in start
  File "/usr/lib/python2.7/threading.py", line 736, in start

我有 2 个问题,按重要性排序:

  1. 这是一个基本上需要 100% 正常运行时间才能不丢失数据的应用程序(如果我的服务器端出现错误,客户端会尝试重试)。这些错误是 App Engine 如何管理我的应用程序资源的内部错误,并且不会导致处理实际请求的错误吗?如何确定我是否曾响应 HTTP 错误/未成功处理请求?我在我的 nginx 日志中没有看到任何错误...这是我需要查看是否有任何故障的地方吗?
  2. 有什么方法可以修复这个错误吗?

【问题讨论】:

标签: python google-app-engine nginx google-cloud-platform google-app-engine-python


【解决方案1】:

https://github.com/GoogleCloudPlatform/google-cloud-python/blob/master/pubsub/google/cloud/pubsub_v1/publisher/client.py#L143

看起来publisher.publish(topic_path, data=data) 是一个异步操作,返回一个concurrent.futures.Future 对象

您是否尝试拨打 Future 的 result()https://docs.python.org/3/library/concurrent.futures.html#concurrent.futures.Future.result

这将阻塞,直到未来的对象成功、失败或超时。

然后您可以将该结果作为您的 HTTP 响应转发。

希望结果对象能够为您提供有关错误的更多信息。

【讨论】:

  • 嘿@Alex 感谢您的想法——我可以试一试,如果它返回失败状态,也许可以重新尝试发布,这回答了我的第二点。但是,我仍然对我的第 1 点中的问题感兴趣。
  • console.cloud.google.com/logs/viewer 是我检查我的日志和 http 活动的地方,你的打印/堆栈跟踪没有出现在那里吗?此外,向您的服务器提交请求的客户端确实需要实现某种级别的缓存/重试。几周前,我所有的应用引擎项目都出现故障,并且在大约 30 分钟内没有响应而没有任何警告。
【解决方案2】:

最终稍微改变了方法。我决定使用 BigQuery python 客户端直接流式传输到 BQ,而不是发布 pubsub 消息然后通过 GCS 将数据流摄取到 BigQuery。将 python 烧瓶应用程序的依赖项更新为:

Flask==1.0.2
google-cloud-pubsub==0.39.1
gunicorn==19.9.0

google-cloud-bigquery==1.11.2

我不再看到任何这些异常。值得注意的是,我仍在使用与应用程序源位于同一目录中的服务帐户 .json 凭据文件,并且我正在创建 BigQuery 客户端 bq_client = bigquery.Client.from_service_account_json(BQ_SVC_ACCT_FILE).

对于其他有类似问题的人,我建议更新您的依赖项(尤其是任何 Google Cloud 客户端库)并从本地服务帐户凭据文件创建您需要的客户端。我尝试使用继承的计算引擎环境凭据(基本上是默认的项目计算引擎服务帐户),但这比推送实际的凭据文件并在本地使用它更不稳定。但是...在做同样的事情之前评估您自己的安全需求。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-02
    • 1970-01-01
    • 2019-09-20
    • 2017-11-16
    • 1970-01-01
    • 2016-08-26
    • 2020-11-23
    相关资源
    最近更新 更多