Google Cloud Pub / Sub запускает высокую задержку при низкой пропускной способности сообщений - PullRequest
0 голосов
/ 23 марта 2020

Я работаю над проектом, который публикует сообщения в PubSub topi c и запускает фоновую облачную функцию.

Я читал, что при больших объемах сообщений он работает хорошо, но для меньших объемов, таких как сотни или даже десятки сообщений в секунду, Pub / Sub может привести к большим задержкам.

Пример кода для публикации sh отдельное сообщение:

 const {PubSub} = require('@google-cloud/pubsub');

 const pubSubClient = new PubSub();

 async function publishMessage() {
    const topicName = 'my-topic';
    const dataBuffer = Buffer.from(data);

    const messageId = await pubSubClient.topic(topicName).publish(dataBuffer);
    console.log(`Message ${messageId} published.`);
 }

 publishMessage().catch(console.error);

Пример кода функции, запускаемой PubSub:

exports.subscribe = async (message) => {
  const name = message.data
    ? Buffer.from(message.data, 'base64').toString()
    : 'World';

  console.log(`Hello, ${name}!`);
}

Облачная функция Подробная информация о среде:
Узел: 8
google-cloud / pubsub: 1.6.0

Проблема в том, что при использовании PubSub с низкой пропускной способностью сообщений (например, 1 запрос в секунду) он иногда испытывает трудности и показывает невероятно высокую задержку (до 7-9 с или более).

Есть ли способ или обходной путь, чтобы PubSub работал хорошо каждый раз ( 50 мс или меньше задержки) даже при небольшом количестве входящих сообщений?

1 Ответ

1 голос
/ 24 марта 2020

Если вы всегда публикуете на одну и ту же топику c, вам лучше оставить объект, возвращенный из pubSubClient.topic(topicName), и использовать его повторно, независимо от того, есть ли у вас небольшое количество или большое количество сообщений. Если вы хотите минимизировать задержку, вам также нужно установить свойство maxMilliseconds параметра batching. По умолчанию это 10 мс. Теперь, когда у вас есть код, это означает, что каждая публикация sh ждет 10 мс, чтобы отправить сообщение в надежде заполнить пакет. Учитывая, что вы создаете нового издателя с помощью вызова topic в каждой публикации sh, вы гарантированно всегда ждете не менее 10 мс. Вы можете установить его при вызове topic:

const publisher = pubSubClient.topic(topicName, {
      batching: {
        maxMessages: 100,
        maxMilliseconds: 1,
      },
    });

Если после повторного использования объекта, возвращенного из pubSubClient.topic(topicName) и изменения maxMilliseconds, вы все еще испытываете такую ​​задержку, то вам следует обратиться к Служба поддержки Google Cloud , чтобы они могли взглянуть на специфицированный c проект и топи c, которые вы используете, поскольку такая задержка определенно не ожидается.

...