Node.js Подписчик Google PubSub не получает НЕКОТОРЫЕ сообщения - PullRequest
0 голосов
/ 19 апреля 2020

Резюме:

В моем приложении Node.js есть функция чата, и я хочу отправлять сообщения клиентам через socket.io. Я запускаю emit для клиента через PubSub. Теперь, при запуске подписки PubSub все работает (то есть печатает сообщения) примерно в 70% случаев, но иногда просто останавливается и ничего не делает (в частности, это также не выводит ошибку). Я могу подтвердить, что недостающие 30% (сообщения) публикуются в topi c, хотя, поскольку другая подписка на тот же topi c получает сообщения.

Любая помощь с отладкой это будет высоко ценится

Подробности

Это мой стек:

  • Node.js
  • socket.io
  • express. js
  • паспорт. js
  • MongoDB
  • реакция. js

Процесс:

  • Анна отправляет сообщение в чате (пишет в базу данных, а также публикует в PubSub topi c "messages")
  • Node.js express app запускает подписку и затем на основе содержимого сообщения отправляет сообщение тому, кто еще должен получить сообщение.
  • BoB , который находится на том же канале, что и Анна, в этом случае получит сообщение.

Почему я не посылаю напрямую от Анны Бобу? Причина в том, что я хочу иметь AppEngine между сообщениями и потенциально добавлять туда логи c, это казалось хорошим способом сделать это.

Подписка

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);

Пример вывода на консоль

Следующий вывод на консоль был получен при локальном запуске приложения с двумя браузерами [один в режиме инкогнито], общающимися друг с другом. Видно, что только последнее сообщение было фактически получено слушателем (и распечатано). Как ни странно, из-за асинхронной природы вызовов c распечатка полученного сообщения пришла до того, как журнал был отправлен (то есть задержка, конечно, не может быть проблемой здесь).

[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 Ответ

1 голос
/ 21 апреля 2020

Есть несколько вещей, которые вы можете сделать, чтобы проверить, что происходит:

  1. Go до topi c страница , выберите topi c чтобы увидеть детали, и посмотреть на публикуемый sh курс. Убедитесь, что сообщения, которые, по вашему мнению, публикуются, действительно публикуются успешно в отношении публикации / подписки. Если публикации не выполняются, возможно, они могут быть доставлены одному из ваших подписчиков, а не другому.
  2. Go на страницу подписки , выберите подписку, чтобы просмотреть подробности, и посмотрите на графики «Количество непрочитанных сообщений» и «Возраст самых старых непрочитанных сообщений». Если они ненулевые, это означает, что есть сообщения, которые не доставляются вашему подписчику. Если они равны нулю, это означает, что сообщения доставляются и подтверждаются вашим подписчиком.

Если количество неупакованных сообщений равно нулю, то вероятной причиной является мошеннические процессы, действующие в качестве подписчика в подписке, получающей сообщения. Возможно, предыдущий экземпляр вашего сервиса все еще работает неожиданно? Или, возможно, другая задача, которая должна использовать другую подписку, использует ту же подписку.

Также следует помнить, что подписчики будут получать сообщения только по тем подпискам, которые были созданы до публикации сообщений. Поэтому, если вы запустили издателя и опубликовали несколько сообщений, а затем создали подписку, скажем, во время запуска подписчика, то подписчик не получит эти более ранние сообщения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...