登录
首页 >  Golang >  Go问答

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

来源:stackoverflow

时间:2024-03-06 22:09:24 210浏览 收藏

一分耕耘,一分收获!既然都打开这篇《使用Google PubSub和Go:是在外部还是在内部创建发布客户端?》,就坚持看下去,学下去吧!本文主要会给大家讲到等等知识点,如果大家对本文有好的建议或者看到有不足之处,非常欢迎大家积极提出!在后续文章我会继续更新Golang相关的内容,希望对大家都有所帮助!

问题内容

对于 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,)

正确答案


也许可行的方法是将 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 
    }

}

然后为该结构创建一个方法,该方法将负责编组消息并将其发送到 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

}

到这里,我们也就讲完了《使用Google PubSub和Go:是在外部还是在内部创建发布客户端?》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于的知识点!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>