在GKE中,如果我有一个设置为使用pull
方法的Pub/Sub主题和作为该主题订阅者的API,如果该API具有3
的复制(spec.replicas: 3), API(客户端)的开箱即用行为是什么?
。当消息被推送到主题时,给定API是来自主题的asynchronously pulling
消息(https://cloud.google.com/pubsub/docs/pull#asynchronous-pull)并且具有3的复制,是否所有3个pod同时拉消息(并以重复结束)?在幕后是否存在某种负载平衡?跳出常规的行为是什么?
你在youtube上有一个很棒的视频系列:Google Cloud youtube频道。您可以深入了解每种订阅类型的行为、重试策略等。
立即回答您的问题:是的,有一个负载平衡器,并且根据订阅者的数量发送消息。但这并不是真正的循环赛。底层优化是将消息块分派给每个订阅者(根据它们的大小和数量)。我的意思是,如果你在同一时间发送3条测试消息,这3条消息将发送给同一个订阅者。
消息只在订阅(推送或拉取)中重复。
消息在连接到相同订阅的订阅者客户端之间进行负载平衡。给定的消息一次只对一个订阅者有效,直到ack deadline
到期,此时它可以被重新传递到不同的订阅者客户端。该服务还单独尊重每个订阅者客户端的流控制设置,并且不会向流控制的客户端发送消息,而是将它们路由到其他客户端。有关订阅者行为的更多信息,请参阅订阅者文档。
因此,如果3个副本连接到相同的订阅,主题的消息将在它们之间负载均衡,即它们将接收不同的消息子集。您应该提供足够的副本,以便它们的总体处理速度比消息发布到主题的速度快。
如果您希望3个副本分别接收所有消息,请为每个副本使用不同的订阅。