Golang Google Pubsub так медленно, когда публикует sh сообщение - PullRequest
0 голосов
/ 29 апреля 2020

Привет, я новичок в google pubsub, почему так медленно, когда publi sh сообщает topi c? Иногда это занимает всего 20-30 мс, но иногда может занимать 200 мс - 1 секунду. Я использую docker на GKE. Что-то не так в моем коде? Я не знаю, как это решить. Пожалуйста, помогите мне

Среда

golang: 1.13.1 Docker в GKE

cloud.google.com / go / pubsub v1 .3.1

Код

package publisher

import (
        "google.golang.org/api/option"
    "cloud.google.com/go/pubsub"
    "context"
    "errors"
    "google.golang.org/api/option"
    "fmt"
    "time"
)

type Publisher struct {
    Client *pubsub.Client
    Topic  *pubsub.Topic
    config Config
}

func (pub *Publisher) initClient(ctx context.Context, project string, opts ...option.ClientOption) error {
    pubSubClient, err := pubsub.NewClient(ctx, project, opts...)

    if err != nil {
        return err
    }
    pub.Client = pubSubClient

    return nil
}

func (pub *Publisher) initTopic(ctx context.Context, topic string) error {
    pubTopic := pub.Client.Topic(topic)

    if isExist, err := pubTopic.Exists(ctx); err != nil {
        return err
    } else if !isExist {
        return errors.New("Topic " + topic+ " is not exists in this project")
    }

    pub.Topic = pubTopic

    return nil
}

func InitializeWithConfig(project string, topic string, opts ...option.ClientOption) (*Publisher, error) {
    var ctx = context.Background()
    pub := Publisher{
        config: config,
    }

    if err := pub.initClient(ctx, project, opts...)); err != nil {
        return nil, err
    }

    if err := pub.initTopic(ctx, topic); err != nil {
        return nil, err
    }

    return &pub, nil
}

func (pub *Publisher) Publish(msg string, eventAttr map[string]string) (*string, error) {
    var ctx = context.Background()

    result := pub.Topic.Publish(ctx, &pubsub.Message{
        Data:       []byte(msg),
        Attributes: eventAttr,
    })

    id, err := result.Get(ctx)
    if err != nil {
        return nil, err
    }

    return &id, nil
}

func main() {
       pub, err := InitializeWithConfig("project-name","topic-name",option.WithGRPCConnectionPool(10))

    if err != nil {
        return err
    }

       startAt := time.Now()
       _, err := pub.Publish("testing", nil)

    duration := time.Now().Sub(startAt).Milliseconds()
    fmt.Printf("%vms", duration)

}

...