![](/img/trans.png)
[英]com.google.cloud.pubsub.spi.v1.Publisher.publish is not sending data to PubSub
[英]Google pub/sub ERROR com.google.cloud.pubsub.v1.StreamingSubscriberConnection
我有一个托管在 GKE 中的扫雪机 enricher 应用程序使用来自 google pub/sub 订阅的消息并且 enricher 应用程序抛出以下错误。
我每天可以在发布/订阅订阅中看到num_undelivered_messages计数激增(超过 50000)3-4 次,我认为这些错误消息的发生是因为 enricher 应用程序无法从上述订阅中获取消息。
为什么应用程序有时无法连接到发布/订阅订阅?
非常感谢任何帮助。
Apr 12, 2022 12:30:32 PM com.google.cloud.pubsub.v1.StreamingSubscriberConnection$2 onFailure
WARNING: failed to send operations
com.google.api.gax.rpc.UnavailableException: io.grpc.StatusRuntimeException: UNAVAILABLE: 502:Bad Gateway
at com.google.api.gax.rpc.ApiExceptionFactory.createException(ApiExceptionFactory.java:69)
at com.google.api.gax.grpc.GrpcApiExceptionFactory.create(GrpcApiExceptionFactory.java:72)
at com.google.api.gax.grpc.GrpcApiExceptionFactory.create(GrpcApiExceptionFactory.java:60)
at com.google.api.gax.grpc.GrpcExceptionCallable$ExceptionTransformingFuture.onFailure(GrpcExceptionCallable.java:97)
at com.google.api.core.ApiFutures$1.onFailure(ApiFutures.java:68)
at com.google.common.util.concurrent.Futures$CallbackListener.run(Futures.java:1050)
at com.google.common.util.concurrent.DirectExecutor.execute(DirectExecutor.java:30)
at com.google.common.util.concurrent.AbstractFuture.executeListener(AbstractFuture.java:1176)
at com.google.common.util.concurrent.AbstractFuture.complete(AbstractFuture.java:969)
at com.google.common.util.concurrent.AbstractFuture.setException(AbstractFuture.java:760)
at io.grpc.stub.ClientCalls$GrpcFuture.setException(ClientCalls.java:545)
at io.grpc.stub.ClientCalls$UnaryStreamToFuture.onClose(ClientCalls.java:515)
at io.grpc.internal.ClientCallImpl.closeObserver(ClientCallImpl.java:426)
at io.grpc.internal.ClientCallImpl.access$500(ClientCallImpl.java:66)
at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl.close(ClientCallImpl.java:689)
at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl.access$900(ClientCallImpl.java:577)
at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl$1StreamClosed.runInternal(ClientCallImpl.java:751)
at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl$1StreamClosed.runInContext(ClientCallImpl.java:740)
at io.grpc.internal.ContextRunnable.run(ContextRunnable.java:37)
at io.grpc.internal.SerializingExecutor.run(SerializingExecutor.java:123)
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: io.grpc.StatusRuntimeException: UNAVAILABLE: 502:Bad Gateway
at io.grpc.Status.asRuntimeException(Status.java:533)
... 15 more
订阅中消息的累积表明您的订阅者跟不上消息流。
要监控您的订阅者,您可以创建一个包含积压指标的仪表板: num_undelivered_messages
和oldest_unacked_message_age
(订阅积压中最旧的未确认消息的年龄),按资源汇总所有订阅。
如果oldest_unacked_message
和num_undelivered_messages
都在增长,那是因为订阅者跟不上消息量。
解决方案:添加更多订阅者线程/机器并查找代码中可能阻止确认消息的任何错误。
如果oldest_unacked_message_age
稳定增长且积压量稳定且较小,则可能有少量消息无法处理。 这可能是由于消息卡住了。
解决方案:检查您的应用程序日志以了解是否某些消息导致您的代码崩溃。 违规消息不太可能(但有可能)卡在 Pub/Sub 而不是您的客户端中。
如果oldest_unacked_message_age
超过订阅的消息保留期限,则数据丢失的可能性很高; 在这种情况下,最好的选择是将警报设置为在订阅的消息保留期限到期之前触发。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.