У нас есть специальный Golang скрипт для публикации sh сообщений в PubSub.
client, err := pubsub.NewClient(ctx, GOOGLE_CLOUD_PROJECT))
Затем мы используем тот же клиент, чтобы опубликовать sh до 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,
}
.
.
.
, а затем на основе определенного условия опубликовать sh до 1 из топи c. Наш издатель l oop выглядит следующим образом
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 Goroutines для публикации sh сообщений в темах и синхронно ожидаем подтверждения сообщений, а это означает, что за раз только 3000 полет / ожидание подтверждения на клиенте.
Наш текущий уровень публикации близок к 5K RPS, но наши задержки составляют 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
Когда я написал небольшой скрипт-тест для публикации sh сообщений в одной топи c средняя задержка для этой машины составляла 147 мс.
Я пытался настроить параметры издателя для каждой топи c, но это не помогло.
Теперь у меня есть пара вопросов.
- Это правильный способ использовать один экземпляр клиента для публикации sh в нескольких темах?
- Есть ли в библиотеке какие-то встроенные конструкции для поддержки такого сценария разветвления ios?