我有一个云运行的gRPC服务,我希望它能收听PubSub主题。从官方文件执行此操作的唯一方法是使用触发器,但这只适用于接受http请求的REST服务器。在web上,我找不到任何关于如何在云运行的grpc服务中使用pubsub的好例子。我的服务是按照官方的grpc 使用说明构建的Go。
main.go:
func main() {
ctx := context.Background()
pubSubClient, err := pubsub.NewClient(ctx, 'project-id')
if err != nil {
log.Fatal(err)
}
pubSubSubscription := pubSubClient.Subscription("subscription-id")
go func(sub *pubsub.Subscription) {
err := sub.Receive(ctx, func(ctx context.Context, m *pubsub.Message) {
defer m.Ack()
log.Printf("sub.Receiv called %+v", m)
})
if err != nil {
// handle error
}
}(pubSubSubscription)
....
lis, err := net.Listen("tcp", ":"+port)
if err != nil {
log.Fatalf("failed to listen: %v", err)
}
s, _ := server.New(ctx, ...)
grpcServer := grpc.NewServer()
grpcpkg.RegisterReportServiceServer(grpcServer, s)
if err := grpcServer.Serve(lis); err != nil {
log.Fatalf("failed to serve: %s", err)
}
}只要至少有一个实例在上面并侦听,这就可以工作了。但是,如果没有活动实例,并且发布了新的pubsub消息,云运行就不会“唤醒”疯狂的人,因为它的自动标度是基于http请求使用的。使上面的代码工作的唯一方法是在云运行中设置min实例1,但是这对于很多用例来说是不有效的(即服务在夜间不活动)。
有这方面的工作吗?有任何方法从公共消息中触发grpc云运行服务吗?
发布于 2022-07-28 15:40:51
您试图在客户端库上使用的sub.Receive方法是用于拉讯息传递而不是推送的。你可以读到关于如何比较这两种交付类型以作出选择的文章。
如果希望以传入请求的形式接收消息,则必须使用推送,并且可以遵循云运行Pubsub使用指南。注意,Cloud /Sub只以具有指定JSON有效负载的HTTPS发布请求的形式传递消息。要处理来自gRPC服务器的这些请求,您可以使用gRPC网关插件生成一个反代理,该代理公开HTTP。
一旦您的Cloud实例使用反向代理接受HTTP通信,它将与传入的请求一起自动计算,因此您不需要始终保持一个实例运行。请注意,这可能意味着冷启动上的消息处理延迟高达10s。
https://stackoverflow.com/questions/73105438
复制相似问题