Go 如何使用GCP在pubsub模型中一次向所有订阅者发送消息
使用谷歌云平台实现pubsub模型,使用函数创建主题、订户、发布和pullmsg函数Go 如何使用GCP在pubsub模型中一次向所有订阅者发送消息,go,google-cloud-platform,publish-subscribe,google-cloud-pubsub,Go,Google Cloud Platform,Publish Subscribe,Google Cloud Pubsub,使用谷歌云平台实现pubsub模型,使用函数创建主题、订户、发布和pullmsg函数 func pullMsgs(projectID, subID string, jsonPath string) error { ctx := context.Background() client, err := pubsub.NewClient(ctx, projectID, option.WithCredentialsFile(jsonPath)) if err != nil {
func pullMsgs(projectID, subID string, jsonPath string) error {
ctx := context.Background()
client, err := pubsub.NewClient(ctx, projectID, option.WithCredentialsFile(jsonPath))
if err != nil {
return fmt.Errorf("pubsub.NewClient: %v", err)
}
// Consume 10 messages.
var mu sync.Mutex
received := 0
sub := client.Subscription(subID)
cctx, cancel := context.WithCancel(ctx)
err = sub.Receive(cctx, func(ctx context.Context, msg *pubsub.Message) {
mu.Lock()
defer mu.Unlock()
// fmt.Fprintf(w, "Got message: %q\n", string(msg.Data))
fmt.Println("Got message: n", string(msg.Data))
msg.Ack()
received++
if received == 10 {
cancel()
}
})
if err != nil {
return fmt.Errorf("Receive: %v", err)
}
return nil
}
pullmsg函数使用订阅Id从发布服务器获取已发布消息。
假设模型有3个特定主题的订户。如果发布者发布该主题的消息。pullmsg函数必须执行3次才能为所有订阅者获取该消息。是否有任何方法可以一次向所有订阅者获取已发布的消息。我不明白您为什么要一次从3个订阅者获取消息。因为这些信息可能不会同时到达。因此,如果要合并这些消息,代码必须等到收到所有消息。这并不是Pub/Sub的真正目的。另一方面,如果您不想合并这三条消息,我建议您为每个订阅创建一段单独的代码 也就是说,您可以使用同步拉取机制或异步拉取机制来拉取所有消息。如果您不希望代码被阻塞,以便它基本上同时侦听所有订阅,那么可以使用异步拉取 代码流可以是:
- 创建一个非阻塞订户函数
- 当x条消息到达时,让此pull函数停止(中断while循环)
- 创建传递三个主题ID的函数的三个实例
- 为您的处理创建另一个函数
可以找到更多信息。我不明白您为什么要一次从3个订阅中提取。因为这些信息可能不会同时到达。因此,如果要合并这些消息,代码必须等到收到所有消息。这并不是Pub/Sub的真正目的。另一方面,如果您不想合并这三条消息,我建议您为每个订阅创建一段单独的代码 也就是说,您可以使用同步拉取机制或异步拉取机制来拉取所有消息。如果您不希望代码被阻塞,以便它基本上同时侦听所有订阅,那么可以使用异步拉取 代码流可以是:
- 创建一个非阻塞订户函数
- 当x条消息到达时,让此pull函数停止(中断while循环)
- 创建传递三个主题ID的函数的三个实例
- 为您的处理创建另一个函数