У нас есть собственный скрипт 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 мс.
Я пытался настроить параметры издателя для каждой темы, но это не помогло.
Теперь у меня есть пара вопросов.
- Правильно ли использовать один экземпляр клиента для публикации в нескольких темах?
- Есть ли в библиотеке встроенная конструкция для поддержки таких сценариев разветвления?
Publish
и заканчивается сразу после него? - person Kamal Aboul-Hosn   schedule 07.04.2020