我正在用setInterval在JS中开发一个工作程序,每隔10秒检查一次是否有新消息。我想知道以下代码是否正确。您认为我会有一些性能问题吗?我在kubernete中将其作为单个pod运行。
const messageHandler = message => {
sendRequest(message, (message, error, response, body) => {
if (!error && response.statusCode == 200) {
message.ack();
}
});
};
subscription.on(`message`, messageHandler);
const timeout = 10;
setInterval(() => {
subscription.removeListener('message', messageHandler);
subscription.on(`message`, messageHandler);
}, timeout * 1000);
答案 0 :(得分:2)
以下是两种更好的方法,而不是每10秒删除和注册一次messageHandler侦听器:
在极少数情况下,消息会延迟,订阅者可能会在收到所有已发布的消息之前关闭。但是,如果您将超时设置为大量(以分钟为单位),则将不太可能。
有关创建订户客户端的示例,请参见client library。您可以将超时修改为更大的数字。客户端库使用StreamingPull,它维护开放的双向流并在消息可用时接收消息,以实现最大吞吐量和低延迟。
答案 1 :(得分:0)
我在这里可能会丢失一些东西,但是如果您希望您的订户正常运行并“永远”收听,那么我根本不明白为什么您需要删除您的收听者。
那为什么不这样呢?
const messageHandler = async message => {
try {
await doSomethingWith(message);
message.ack();
} catch (err) {
console.error(`Error handling message: ${message.id}: ${err.message}`);
message.nack();
}
};
// Listen for new messages
subscription.on(`message`, messageHandler);