Что вызывает недостижимые ошибки в Google PubSub? - PullRequest
0 голосов
/ 24 марта 2020

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

Проблема в том, что он может иногда сталкиваться с трудностями и показывать задержки при публикации сообщений до 9 или более. Я проверил Metrics Explorer и обнаружил, что при больших задержках он показывает следующие ошибки:

  • unreachable_5xx_error_500
  • unreachable_no_response
  • internal_rejected_error
  • unreachable_5xx_error_503
  • url_4xx_error_429

Вот диаграмма, показывающая задержки:
Cloud Monitoring Chart

Пример кода сообщения публикации Функция Google Cloud:

 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 Topi c:

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

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

И я думаю, что это приводит к задержкам. Я не нашел ничего по этому поводу в inte rnet, поэтому я надеюсь, что вы сможете объяснить, что вызывает эти ошибки и почему, и, вероятно, может помочь с этим.

1 Ответ

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

Как обсуждалось в комментариях, есть некоторые изменения и обходные пути, которые можно сделать, чтобы решить или уменьшить проблему.

Сначала, как можно найти в этом руководстве PubSub пытается собрать несколько сообщений перед доставкой. Другими словами, он пытается доставить много сообщений одновременно. В этом конкретном случае c для достижения более реалистичного сценария c реального времени должен быть указан размер пакета 1, что приведет к PubSub доставке каждого сообщения отдельно. Этот размер пакета можно указать с помощью свойства maxMessages при создании объекта издателя, как показано в приведенном ниже коде. Кроме того, свойство maxMilliseconds может использоваться для указания максимально допустимой задержки.

  const batchPublisher = pubSubClient.topic(topicName, {
    batching: {
      maxMessages: maxMessages,
      maxMilliseconds: maxWaitTime * 1000,
    },
  });

В ходе обсуждения также было отмечено, что проблема, вероятно, связана с холодным запуском Cloud Function. что делает задержку больше для этого приложения из-за его архитектуры. Обходным путем для решения этой части проблемы было добавление сервера Node JS в архитектуру для запуска функций с использованием PubSub.

...