我正在运行一个项目,该项目将消息发布到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 或更短的延迟)表现良好?
答案 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,以便他们可以查看特定的项目和您正在使用的主题,因为绝对不会出现这种延迟。