首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将google PubSub与云运行gRPC服务结合使用

将google PubSub与云运行gRPC服务结合使用
EN

Stack Overflow用户
提问于 2022-07-25 07:29:14
回答 1查看 275关注 0票数 1

我有一个云运行的gRPC服务,我希望它能收听PubSub主题。从官方文件执行此操作的唯一方法是使用触发器,但这只适用于接受http请求的REST服务器。在web上,我找不到任何关于如何在云运行的grpc服务中使用pubsub的好例子。我的服务是按照官方的grpc 使用说明构建的Go。

main.go:

代码语言:javascript
复制
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云运行服务吗?

EN

回答 1

Stack Overflow用户

发布于 2022-07-28 15:40:51

您试图在客户端库上使用的sub.Receive方法是用于拉讯息传递而不是推送的。你可以读到关于如何比较这两种交付类型以作出选择的文章。

如果希望以传入请求的形式接收消息,则必须使用推送,并且可以遵循云运行Pubsub使用指南。注意,Cloud /Sub只以具有指定JSON有效负载的HTTPS发布请求的形式传递消息。要处理来自gRPC服务器的这些请求,您可以使用gRPC网关插件生成一个反代理,该代理公开HTTP。

一旦您的Cloud实例使用反向代理接受HTTP通信,它将与传入的请求一起自动计算,因此您不需要始终保持一个实例运行。请注意,这可能意味着冷启动上的消息处理延迟高达10s。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73105438

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档