Я надеюсь, что кто-то может помочь мне с проблемой, с которой я сталкиваюсь в приложении Qpid C ++, которое использую. По сути, у нас есть одно приложение, публикующее состояние в last_value_queue с частотой около 10 Гц, и пара других приложений постоянно обрабатывают этот статус. Получатели также используют статус как своего рода сердцебиение и будут жаловаться, если сообщение о состоянии не обновляется в течение определенного периода времени (точнее, 500 мс.)
Это работает нормально в течение дня, после чего мы начинаем видеть проблемы. Каждые пару часов один вызов извлечения получателем будет блокироваться на период более 500 мс (иногда до 900 мс). Это поведение будет продолжаться до тех пор, пока мы не перезапустим посредника.
Я не эксперт, но я не думаю, что делаю что-то особенно глупое. Мне удалось повторить это поведение с парой небольших приложений, которые подключаются к брокеру. Каждые 100 мс отправитель отправляет объект std :: chrono :: time_point, установленный на текущее время. Получатель получает сообщение и рассчитывает задержку до миллисекунды. Задержка всегда составляет 0 мс или 1 мс, за исключением одного скачка каждый час или около того после первого дня, когда все будут счастливы. Соединение создается так:
qpid::messaging::Connection c("host1:5672","{ reconnect: true}");
и отправитель и получатель оба созданы со строкой
"testQueue; { mode: browse, create: always, node: { type: queue, x-declare:{ arguments:{'qpid.last_value_queue_key':'key','qpid.replicate':'none'}}}}"
Репликация высокой доступности включена на брокере, но я явно отключил ее для всего моего тестирования. Я не вижу различий в поведении, когда брокер и приложения работают на одном хосте или разных хостах в локальной сети. Используя qpid-stat, я вижу, что очередь репликации посредника по-прежнему передает довольно много данных, но счетчик сообщений всегда равен 0, поэтому я не думаю, что он отправляет больше, чем может обработать. Может ли кто-нибудь придумать что-нибудь, чего мне не хватает, что может вызвать такое поведение? Мы используем Qpid 0.26 и брокер C ++.
Задача ещё не решена.