[英]Error when use google pubsub emulator and Spring function.adapter.gcp.GcfJarLauncher
[英]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 的方法是将pubsubClient
和pubsubTopic
在结构中?
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.