Высокая задержка публикации с клиентом PubSub Golang

У нас есть собственный скрипт Golang для публикации сообщений в PubSub.

client, err := pubsub.NewClient(ctx, GOOGLE_CLOUD_PROJECT))

Затем мы используем один и тот же клиент для публикации до 40 тем.

topic1 := client.Topic(topicName)
    topic1.PublishSettings = pubsub.PublishSettings{
        DelayThreshold: 10 * time.Millisecond,
        CountThreshold: 1000,
        NumGoroutines:  70 * runtime.GOMAXPROCS(0),
        ByteThreshold:  1e6,
        Timeout:        60 * time.Second,
    }



topic2 := client.Topic(topicName)
    topic2.PublishSettings = pubsub.PublishSettings{
        DelayThreshold: 10 * time.Millisecond,
        CountThreshold: 1000,
        NumGoroutines:  70 * runtime.GOMAXPROCS(0),
        ByteThreshold:  1e6,
        Timeout:        60 * time.Second,
    }
.
.
.


а потом по определенному условию опубликуйте в 1 тему. Наш цикл издателя выглядит так

semaphore := make(chan int, 3000)
for i := 0; i < totalMessages; i++ {
            semaphore <- 1
            go func(topic *pubsub.Topic, semaphore chan int) {
                data := []byte(_RandStringBytes(messageLengthInBytes))
                msg := &pubsub.Message{
                    Data: data,
                }
                if _, err := topic.Publish(ctx, msg).Get(ctx); err != nil {
                    log.Fatalf("Could not publish message: %v", err)
                }
                <-semaphore
            }(topic, semaphore)
        }

Мы используем 3000 горутин для публикации сообщений в темах и синхронно ждем подтверждения сообщений, что означает, что одновременно находится только 3000 в полете / ожидании подтверждения от клиента.

Наша текущая скорость публикации близка к 5 000 запросов в секунду, но наши задержки достигают 30 секунд.

Ниже приведены статистические данные, которые я собрал с нашей панели инструментов Datadog.

Publish Latency.    Number of Messages
0-1                 1877
1-2                 1990
2-3                 2661
2-3                 2149
5-10                10323
10-15               4013
15-20               10322
20-25               3034
25-30               925
> 30                1901

Когда я написал небольшой тестовый скрипт для публикации сообщений по одной теме, средняя задержка с того же компьютера составляла 147 мс.

Я пытался настроить параметры издателя для каждой темы, но это не помогло.

Теперь у меня есть пара вопросов.

  1. Правильно ли использовать один экземпляр клиента для публикации в нескольких темах?
  2. Есть ли в библиотеке встроенная конструкция для поддержки таких сценариев разветвления?

person kaysush    schedule 02.04.2020    source источник
comment
Как вы измеряете задержку? Было бы полезно знать, где вы инструментируете код для определения задержки публикации. Таймер запускается непосредственно перед вызовом Publish и заканчивается сразу после него?   -  person Kamal Aboul-Hosn    schedule 07.04.2020
comment
Да, таймер запускается перед публикацией и заканчивается сразу после нее.   -  person kaysush    schedule 08.04.2020


Ответы (1)


Вы пробовали массовую публикацию?

опубликовать (тема, [] Сообщение {1,2,3,4, .....})

person ssskip    schedule 02.04.2020
comment
Нет, я не пытался это реализовать и вернусь с результатами. - person kaysush; 02.04.2020
comment
@kaysush и код, который вы прикрепили, недостаточно хорош, вам следует убедиться, что `‹ -semaphore` выпущен правильно. а что если паника? - person ssskip; 02.04.2020
comment
Да, это быстрый и грязный тестовый код скрипта, а не производственный. Я просто хотел показать общий шаблон того, как выглядит производственный код без всяких наворотов. - person kaysush; 03.04.2020