Python Google PubSub订阅无法从StatusCode恢复。不可用[code=8a75]错误

Python Google PubSub订阅无法从StatusCode恢复。不可用[code=8a75]错误,python,google-cloud-pubsub,Python,Google Cloud Pubsub,例外情况: 线程线程消费双向流中出现异常:grpc.\u通道.\u集合点: 上述异常是以下异常的直接原因: google.api_core.exceptions.ServiceUnavailable:503服务无法满足您的请求。请再试一次。[代码=8a75] 我正在尝试构建一个大致遵循谷歌端到端示例(|)的物联网原型,当队列中没有消息时,我在订户中遇到了一个错误。这可能发生在订阅服务器在大约一分钟后第一次启动空队列时,也可能发生在处理任意数量的消息后以及队列清空后一分钟左右 我在这里找到了一个解

例外情况:

线程线程消费双向流中出现异常:grpc.\u通道.\u集合点:

上述异常是以下异常的直接原因:

google.api_core.exceptions.ServiceUnavailable:503服务无法满足您的请求。请再试一次。[代码=8a75]

我正在尝试构建一个大致遵循谷歌端到端示例(|)的物联网原型,当队列中没有消息时,我在订户中遇到了一个错误。这可能发生在订阅服务器在大约一分钟后第一次启动空队列时,也可能发生在处理任意数量的消息后以及队列清空后一分钟左右

我在这里找到了一个解决办法,但无法让它工作因此,我的问题是如何使此变通策略起作用,因为它所做的只是隐藏错误-我的订阅者仍然挂起,不处理任何进一步的消息。

相关的代码位如下所示:

从google.cloud导入pubsub
导入google.cloud.pubsub_v1.subscriber.message作为消息
从google.cloud.pubsub_v1.subscriber.policy导入线程
进口grpc
类解决方案策略(thread.Policy):
def on_异常(自身、异常):
#如果发现不可用,则需要重试(因此返回None)
不可用=grpc.StatusCode.unavailable
如果isinstance(异常,服务不可用):
logger.warning('忽略google.api_core.exceptions.ServiceUnavailable异常:{}'。格式(异常))
返回
[unavailable]中的elif getattr(异常,'code',lambda:None)():
logger.warning('忽略grpc.StatusCode.UNAVAILABLE(原始异常:{}')。格式(异常))
返回
#对于其他任何事情,请依赖父类行为
super(变通策略,self).on_异常(异常)
#为简洁起见,指定了其他进口和代码
def回调(消息:消息):
尝试:
data=json.loads(msg.data)
除ValueError为e外:
logger.error('加载有效负载({})引发异常:{}.'.format(msg.data,e))
#对于原型,如果我们看不懂,那么就丢弃它
msg.ack()
返回
设备项目id=msg.attributes['projectId']
设备\u注册表\u id=msg.attributes['deviceRegistryId']
设备id=msg.attributes['deviceId']
device_region=msg.attributes['deviceRegistryLocation']
自我更新设备配置(
设备\u项目\u id,
设备(u)区,,
设备\u注册表\u id,
设备id,
(数据)
msg.ack()
def运行(自身、项目名称、订阅名称):
#指定解决策略以处理StatusCode.UNAVAILABLE[code=8a75]错误(但可能会出现CPU问题)
#subscriber=pubsub.SubscriberClient(策略类=变通策略)
#或者,在没有解决方法的情况下实例化订阅服务器,以查看完整的异常堆栈
subscriber=pubsub.SubscriberClient()
订阅=订阅服务器。订阅(订阅路径,回调)
subscription.future.result()
尽管如此:
时间。睡眠(60)
如果有帮助,可以在中找到完整版本

堆栈跟踪/命令行输出(无策略解决方案)

(venv)Freds MBP:iot订户问题Fred$python Controller.py\
--项目id=xyz测试\
--pubsub_subscription=简单mqtt控制器\
--service_account_json=/Users/Fred/_dev/gcp credentials/simple-mqtt-controller-service-account.json
2018-03-21 09:36:20975信息控制器从JSON密钥文件创建凭据:“/Users/Fred/_dev/gcp credentials/simple mqtt Controller service account.JSON”。。。
2018-03-21 09:36:20991信息控制器从发现URL创建服务:https://cloudiot.googleapis.com/$discovery/rest?版本=v1“。。。
2018-03-21 09:36:20992请求的信息GoogleAppClient.discovery URL:获取https://cloudiot.googleapis.com/$discovery/rest?版本=v1
2018-03-21 09:36:21508信息控制器为项目创建订阅服务器:“xyz测试”和订阅:“简单mqtt控制器”。。。
2018-03-21 09:36:23200信息控制器正在侦听项目上的消息/xyz测试/订阅/simple mqtt控制器。。。
#这通常在60秒左右(有时长达2分钟)后发生:
线程消费双向流中的异常:
回溯(最近一次呼叫最后一次):
文件“/Users/Fred/_dev/datacentricity public samples/iot subscriber issue/venv/lib/python3.6/site packages/google/api_core/grpc_helpers.py”,第76行,下一行
返回六。下一个(自我包装)
文件“/Users/Fred/_dev/datacentricity public samples/iot subscriber issue/venv/lib/python3.6/site packages/grpc/_channel.py”,第347行,下一页__
返回自我。_next()
文件“/Users/Fred/_dev/datacentricity public samples/iot subscriber issue/venv/lib/python3.6/site packages/grpc/_channel.py”,第341行,下一页
自立
grpc._通道_会合点:
上述异常是以下异常的直接原因:
回溯(最近一次呼叫最后一次):
文件“/Users/Fred/\u dev/datacentricity public samples/iot subscriber issue/venv/lib/python3.6/site packages/google/cloud/pubsub\u v1/subscriber/\u consumer.py”,第349行,在“阻塞”\u consumer
关于答复中的答复:
文件“/Users/Fred/_dev/datacentricity public samples/iot subscriber issue/venv/lib/python3.6/site packages/google/cloud/pubsub\u v1/subscriber/_consumer.py”,第476行,可暂停迭代器
生成下一个(迭代器)
文件“/Users/Fred/_dev/datacentricity public samples/iot subscriber issue/venv/lib/python3.6/site packages/google/api_core/grpc_helpers.py”,第78行,下一页
六、从(例外情况。从grpc错误(exc),exc)
文件“”,第3行,从
google.api_core.exceptions.ServiceUnavailable:503服务无法满足您的请求。请再试一次。[代码=8a75]
在处理上述ex时
google-api-core==1.1.0 
google-api-python-client==1.6.5 
google-auth==1.4.1 
google-auth-httplib2==0.0.3 
google-cloud-pubsub==0.32.1 
googleapis-common-protos==1.5.3 
grpc-google-iam-v1==0.11.4 
grpcio==1.10.0 
httplib2==0.10.3 
paho-mqtt==1.3.1