JS中的Gcloud pubsub worker

时间:2019-04-15 15:11:15

标签: javascript google-cloud-pubsub

我正在用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);

2 个答案:

答案 0 :(得分:2)

以下是两种更好的方法,而不是每10秒删除和注册一次messageHandler侦听器:

  1. 对于进入的消息具有长时间运行的消息侦听器,直到创建侦听器以来的时间达到“ x”。
  2. 具有用于传入消息的长时间运行的消息侦听器,并且仅在自接收到最后一条消息以来已经过了“ x”时间的情况下关闭订户。

在极少数情况下,消息会延迟,订阅者可能会在收到所有已发布的消息之前关闭。但是,如果您将超时设置为大量(以分钟为单位),则将不太可能。

有关创建订户客户端的示例,请参见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);