为什么我的 Google Cloud PubSub 订阅以如此高的速率将消息推送到云函数,尽管错误率很高?
这是订阅配置:
% gcloud pubsub subscriptions describe [REDACTED_SUBSCRIPTION_NAME]
ackDeadlineSeconds: 300
deadLetterPolicy:
deadLetterTopic: projects/[REDACTED]/topics/[REDACTED]
maxDeliveryAttempts: 100
expirationPolicy: {}
filter: attributes.env = "production"
messageRetentionDuration: 604800s
name: projects/[REDACTED]/subscriptions/[REDACTED_SUBSCRIPTION_NAME]
pushConfig:
pushEndpoint: https://[REDACTED].cloudfunctions.net/[REDACTED_FUNCTION_NAME]
...
retryPolicy:
maximumBackoff: 600s
minimumBackoff: 30s
state: ACTIVE
topic: projects/[REDACTED]/topics/[REDACTED_TOPIC_NAME]
以及云功能配置:
% gcloud functions describe [FUNCTION_NAME]
automaticUpdatePolicy: {}
availableMemoryMb: 1024
buildId: 623c4c9a-a8c5-45eb-b02d-b0db6305f2ea
buildName: projects/[PROJECT_ID]/locations/us-central1/builds/[BUILD_ID]
dockerRegistry: CONTAINER_REGISTRY
entryPoint: run
environmentVariables:
...
httpsTrigger:
securityLevel: SECURE_OPTIONAL
url: https://us-central1-[PROJECT].cloudfunctions.net/[FUNCTION_NAME]
ingressSettings: ALLOW_ALL
labels:
deployment-tool: cli-gcloud
maxInstances: 5
name: projects/[PROJECT]/locations/us-central1/functions/[FUNCTION_NAME]
runtime: nodejs18
serviceAccountEmail: [PROJECT]@appspot.gserviceaccount.com
status: ACTIVE
timeout: 300s
versionId: '59'
vpcConnector: projects/[PROJECT]/locations/us-central1/connectors/mcfx-identity
vpcConnectorEgressSettings: PRIVATE_RANGES_ONLY
在特定的分析期间,我观察到:
本文档 https://cloud.google.com/pubsub/docs/push#push_backoff 表示 pubsub 在这种情况下应该退避。
本文档https://cloud.google.com/pubsub/docs/push#delivery_rate说“推送窗口在任何成功交付时都会增加,在任何失败时都会减少”,但推送窗口似乎无法减少在这种情况下。
关于为什么尽管失败率很高但推送率仍然很高,以及如何缓解这个问题,有什么见解吗?
了解 @guillaume blaquiere 关于配置错误的评论,我也相信您的 Cloud Function 和 Pub/Sub 配置之间就是这种情况。
高推送率可能与您的 Pub/Sub 的 重试设置 相关联,尤其是在您的云功能中未正确处理消息的情况下。检查您如何处理消息失败,考虑增加云功能的最大实例值和发布/订阅的
minimumBackoff
,因为它可以增加消息突然爆发期间的重试尝试,从而有助于提高推送率(如果它们也设置了)低。
注意:此功能独立于Push backoff。您可以结合使用这两个功能来更好地控制消息流。在这种情况下,总延迟是推送退避值和重试策略值的最大组合值。如果您注意到消息传递问题,请仔细检查您的重试策略与推送退避的交互方式。