Google Cloud Pub / Sub因消息吞吐量低而触发高延迟

时间:2020-03-23 17:17:23

标签: javascript node.js google-cloud-platform google-cloud-functions google-cloud-pubsub

我正在运行一个项目,该项目将消息发布到PubSub主题并触发后台云功能。

我读到,如果消息量很大,它的性能很好,但是对于每秒发送几百甚至几十条消息的消息量较少,Pub / Sub可能会产生较高的延迟。

发布单个消息的代码示例:

 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-9s 或更多)。

>

是否有一种方法或解决方法可以使PubSub在每次传入消息很少的情况下也能每次( 50ms 或更短的延迟)表现良好?

1 个答案:

答案 0 :(得分:2)

如果您始终发布相同的主题,则最好保留pubSubClient.topic(topicName)返回的对象并重新使用它,无论消息数量少还是少。如果要最大程度地减少延迟,则还需要设置maxMilliseconds设置的batching属性。默认情况下,这是10毫秒。就像现在有了代码一样,这意味着每个发布都将等待10ms来发送一条消息,以希望填充该批处理。假设您在每次发布时都通过topic调用来创建新的发布者,那么可以保证始终等待至少10毫秒。您可以在致电topic时进行设置:

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

如果在重新使用从pubSubClient.topic(topicName)返回的对象并更改maxMilliseconds之后,您仍然遇到这种延迟,那么您应该联系Google Cloud Support,以便他们可以查看特定的项目和您正在使用的主题,因为绝对不会出现这种延迟。