Google cloud platform Google PubSub返回Google.gax.errors.GaxError:GaxError RPC失败,原因是。。。StatusCode.UNAVAILABLE
我们正在尝试在一个分布式系统上的事件发生后对现有主题进行简单的发布 代码如下所示:Google cloud platform Google PubSub返回Google.gax.errors.GaxError:GaxError RPC失败,原因是。。。StatusCode.UNAVAILABLE,google-cloud-platform,google-cloud-pubsub,Google Cloud Platform,Google Cloud Pubsub,我们正在尝试在一个分布式系统上的事件发生后对现有主题进行简单的发布 代码如下所示: try: dat = data.encode('utf-8') topic.publish(dat) except: <code to recover> 看起来您正在寻找的相关讨论是第2683期 您没有做错任何事情,似乎捕获异常并重试是目前最合适的解决方法。如果主题是全局变量,它将停止产生错误。将主题设置为类变量并仅实例化一次-仅调用此行一次: topic = pubsub.Client
try:
dat = data.encode('utf-8')
topic.publish(dat)
except:
<code to recover>
看起来您正在寻找的相关讨论是第2683期
您没有做错任何事情,似乎捕获异常并重试是目前最合适的解决方法。如果主题是全局变量,它将停止产生错误。将主题设置为类变量并仅实例化一次-仅调用此行一次:
topic = pubsub.Client().topic(name)
而且,这似乎只适用于Python2.7—在Python3.6中,重试会使疼痛稍微麻木
禁用gRPC对Python 3.6起到了作用-这可以通过设置环境变量来实现:
ENV GOOGLE_CLOUD_DISABLE_GRPC=true
我设法找到了一个“不那么漂亮”的解决办法。使用一个策略,为超过的最后期限复制代码
在接收消息功能上,我有一个类似
subscriber = pubsub.SubscriberClient(policy_class=UnavailableHackPolicy)
subscription_path = subscriber.subscription_path(project, subscription_name)
subscriber.subscribe(subscription_path, callback=callback, flow_control=flow_control)
问题是,当资源确实不可用时,我们将不知道。然而,当GRPC开发团队设法解决此问题时,我们将使用此解决方法
from google.cloud.pubsub_v1.subscriber.policy.thread import Policy
import grpc
class UnavailableHackPolicy(Policy):
def on_exception(self, exception):
"""
There is issue on grpc channel that launch an UNAVAILABLE exception now and then. Until
that issue is fixed we need to protect our consumer thread from broke.
https://github.com/GoogleCloudPlatform/google-cloud-python/issues/2683
"""
unavailable = grpc.StatusCode.UNAVAILABLE
if getattr(exception, 'code', lambda: None)() in [unavailable]:
print("¡OrbitalHack! - {}".format(exception))
return
return super(UnavailableHackPolicy, self).on_exception(exception)
subscriber = pubsub.SubscriberClient(policy_class=UnavailableHackPolicy)
subscription_path = subscriber.subscription_path(project, subscription_name)
subscriber.subscribe(subscription_path, callback=callback, flow_control=flow_control)