簡體   English   中英

Node.js Google PubSub 訂閱者未收到某些消息

[英]Node.js Google PubSub Subscriber does not receive SOME messages

概括:

我的Node.js應用程序中有一個聊天功能,並希望通過 socket.io 向客戶端發送消息。 我通過 PubSub 觸發向客戶端發送。 現在,當運行 PubSub Subscription 時,大約 70% 的情況下一切正常(即打印出消息),但有時會停止而不做任何事情(特別是它也不會打印出錯誤)。 我可以確認丟失的 30%(消息)正在發布到主題,因為對同一主題的不同訂閱會收到消息。

任何有關調試的幫助將不勝感激。

細節

這是我的堆棧:

  • Node.js
  • socket.io
  • express.js
  • 護照.js
  • MongoDB
  • 反應.js

過程:

  • Anna在聊天中發送消息(這會寫入數據庫並發布到 PubSub 主題“消息”)
  • Node.js express 應用程序運行訂閱,然后根據消息內容發送給其他應該接收消息的人。
  • 在這種情況下,與 Anna 在同一頻道上的BoB會收到消息。

為什么我不直接從 Anna 發射到 Bob? 原因是我想在消息之間有一個 AppEngine 並可能在那里添加一些邏輯,這似乎是一個好方法。

訂閱

const pubSubClient = require('./client');

const errorHandler = function(error) {
    console.error(`ERROR: ${error}`);
    throw error;
};

module.exports = listenForMessages =(subscriptionName="messageReceiver",io) => {
    const subscription = pubSubClient.subscription(subscriptionName);

    // Listen for new messages until timeout is hit
    subscription.on("message", (message) => {
        console.log(`Received message ${message.id}:`);
        const parsedMessage = JSON.parse(message.data)
        parsedMessage._id = message.id
        console.log(parsedMessage)

        if (parsedMessage.to === "admin") {
            io.to(`admin:${parsedMessage.from}`).emit("NewMessage", parsedMessage);
        } else {
            io.to(`${parsedMessage.to}`).emit("NewMessage", parsedMessage);
        }
        message.ack();
    });

    subscription.on('error', errorHandler);
}

服務器.js

...
const listenForMessages = require("./message_processing/listen");
listenForMessages("messageReceiver", io);

樣品台 output

以下控制台 output 是通過在本地運行應用程序並使用兩個瀏覽器 [一個隱身] 相互聊天生成的。 可以看出,只有最后一條消息實際上被偵聽器拾取(並打印出來)。 有趣的是,由於調用的異步特性,接收到的消息的打印輸出出現在消息發送的日志之前(即延遲肯定不會成為問題)。

[0] went into deserialize user
[0] Message 875007020424601 published.
[0] went into deserialize user
[0] Message 875006704834317 published.
[0] went into deserialize user
[0] Message 875006583857400 published.
[0] went into deserialize user
[0] Message 875006520104287 published.
[0] went into deserialize user
[0] Message 875006699141463 published.
[0] went into deserialize user
[0] Received message 875006881073134:
[0] {
[0]   from: '5e949f73aeed81beefaf6daa',
[0]   to: 'admin',
[0]   content: 'i6',
[0]   seenByUser: true,
[0]   type: 'message',
[0]   createdByUser: true,
[0]   createdAt: '2020-04-20T07:44:54.280Z',
[0]   _id: '875006881073134'
[0] }
[0] Message 875006881073134 published.

在其他一些情況下,較早的消息起作用,然后偵聽器似乎停止了。

您可以做幾件事來檢查正在發生的事情:

  1. Go 到主題頁,select 主題看詳情,看發布率。 確保就 Pub/Sub 而言,您認為正在發布的消息實際上已成功發布。 如果發布失敗,它們可能會交付給您的一個訂閱者,而不是另一個。
  2. Go 到 訂閱頁面,select 訂閱查看詳情,並查看“Unacked message count”和“Oldest unacked message age”圖表。 如果這些不為零,則意味着有消息未傳遞給您的訂閱者。 如果它們為零,則意味着消息正在傳遞給您的訂閱者並得到您的訂閱者的確認。

如果未確認消息的數量為零,則可能的原因是在接收消息的訂閱上充當訂閱者的流氓進程。 也許您的服務的先前實例仍在意外運行? 或者可能另一個應該使用不同訂閱的任務正在使用相同的訂閱。

要注意的另一件事是,訂閱者只會收到在消息發布之前創建的訂閱的消息。 因此,如果您啟動了發布者並發布了一些消息,然后創建了訂閱,例如在訂閱者啟動時,那么訂閱者將不會收到那些較早的消息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM