繁体   English   中英

Google PubSub 和 Go:在发布功能外部还是内部创建客户端?

[英]Google PubSub and Go: create client outside or inside publish-function?

当谈到 Google PubSub(以及一般的 pubsub 应用程序)时,我是新手。 当谈到 Go 时,我也相对较新。

我正在开发一个相当繁重的后端服务应用程序,该应用程序已经承担了太多责任。 该服务需要为 Google PubSub 主题的每个传入请求触发一条消息。 它只需要“发射并忘记”。 如果出版出了问题,什么都不会发生。 这些消息并不重要(仅用于分析),但其中会有很多 我们估计一天中的大部分时间每秒有 50 到 100 条消息

现在到代码:

func(p *publisher) Publish(message Message, log zerolog.Logger) error {
    ctx := context.Background()
    client, err := pubsub.NewClient(ctx, p.project)
    defer client.Close()
    if err != nil {
        log.Error().Msgf("Error creating client: %v", err)
        return err
    }

    marshalled, _ := json.Marshal(message)
    topic := client.Topic(p.topic)
    result := topic.Publish(ctx, &pubsub.Message{
        Data: marshalled,
    })
    _, err = result.Get(ctx)
    if err != nil {
        log.Error().Msgf("Failed to publish message: %v", err)
        return err
    }
    return nil
}

免责声明: p *publisher仅包含配置。

我想知道这是否是最好的方法? 这会导致服务每秒创建和关闭客户端 100 次吗? 如果是这样,那么我想我应该创建一次客户端并将其作为参数传递给 Publish() 函数吗?

这就是调用 Publish() 函数的方式:

defer func(publisher publish.Publisher, message Message, log zerolog.Logger) {
    err := publisher.Publish(log, Message)
    if err != nil {
        log.Error().Msgf("Failed to publish message: %v", err)
    }
}(publisher, message, logger,)

也许 go 的方法是将pubsubClientpubsubTopic在结构中?

type myStruct struct {
    pubsubClient *pubsub.Client
    pubsubTopic  *pubsub.Topic
    logger       *yourLogger.Logger



}

func newMyStruct(projectID string) (*myStruct, error) {
    ctx := context.Background()
    pubsubClient, err := pubusb.NewClient(ctx, projectID)
    if err != nil {...}
    pubsubTopic := pubsubClient.Topic(topicName)
    return &myStruct{
    pubsubClient: pubsubClient,
    pubsubTopic: pubsubTopic,
    logger: Logger,
    // and whetever you want :D 
    }

} 

然后为该结构创建一个方法,该方法将负责编组 msg 并将其发送到 Pub/sub

func (s *myStruct) request(ctx context.Context data yorData) {
    marshalled, err := json.Marshal(message)
    if err != nil {..}
    res := s.pubsubTopic.Publish(ctx,  &pubsub.Message{
        Data: marshalled,
    })
    if _, err := res.Get(ctx); err !=nil {..}
    return nil

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM