Предварительные условия:
- У нас есть пустой топи c создан, с единой пул подпиской
- Нет активных подписок на подписку
- Мы публикуем sh около 200 тыс. Сообщений быстро, используя
@google/pubsub
библиотеку
Наблюдение:
Количество незапакованных сообщений
Большой скачок до 2,5 миллионов сообщений произошел, когда мы опубликовали сообщения с использованием приведенного ниже эквивалента кода. Из сообщения журнала мы видим, что он думает, что опубликовал 200 тыс. Сообщений.
Вторые небольшие удары были, когда мы взяли приведенный ниже код, но разделили вызовы Promise.all
с другим для l oop и дали только pubsub sdk 1000 сообщений за раз.
Код:
import {PubSub} from '@google-cloud/pubsub';
const pubsub = new PubSub()
const topic = pubsub.topic("some-topic");
async function publish(message) {
const dataBuffer = Buffer.from(JSON.stringify(data));
return topic.publisher.publish(dataBuffer, metadata);
}
async function processThing(thing) {
const parsed = parseThingToLotsOfThings(thing);
return (await Promise.all(
parsed.map(it => topic.publish(it))
)).length
}
async function processThings(things) {
let count = 0;
for (const thing of things) {
count += await processThing(thing);
}
console.log(`published ${count} messages`);
}
Прочитав исходный код nodejs sdk и просмотрев ссылку на API, я не Не понимаю, как это происходит.
Я понимаю, что это гарантия хотя бы одной доставки, но это на порядок больше, и внутренне клиент включает только 100 сообщений на публикацию sh rp c, поэтому я не понимаю, почему пакетирование его в нашем коде изменило бы поведение.
Это ошибка в sdk, или мы должны пакетировать вещи перед вызовом sdk?