Виртуальные темы / очереди и долговечность

Что произойдет с сообщениями, размещенными в виртуальной теме, когда не будет прослушивать никаких потребителей? Будет ли брокер удерживать их некоторое время, пока не будет доступен абонент?

Более конкретно: в T0 и T1 сообщения M0 и M1 размещены. В Т2 подключается потребитель С1, получит ли он М0 и М1? Очевидно, что сообщения M2 и M3, отправленные в T3 и T4, будут получены C1, но что получит новый потребитель, C2, который подключится к получателю T5? Все сообщения, М2 и М3 или нет?

3 ответа

Решение

Это зависит от характера темы: если тема является долговременной (на нее подписываются постоянные потребители), брокер будет хранить сообщения в теме, пока все постоянные потребители не будут использовать сообщения. если тема недолговечная (без постоянных потребителей), сообщение даже не будет отправлено в эту тему, так как не будет длительной подписки.

Для вашего примера я буду считать, что вы используете долговременные подписки / потребители: Случай 1:

  • Т-2 С1 и С2 делают долговременную подписку на тему
  • T-1 C1 и C2 отключить
  • T0: M0 размещен
  • T1: M1 размещен
  • T2: C1 соединяется. С1 получает М0 и М1
  • T3: M3 размещен. С1 получает М3
  • T4: M4 размещен. С1 получает М4
  • T5: C2 подключается, C2 получает M0, M1, M2, M3, M4

Это потому, что они поддерживают долговременные подписки. При использовании долговременных тем / очередей нужно быть очень осторожным: если потребитель не отписывается, брокер будет хранить сообщения до тех пор, пока хранилище сообщений не взорвется. Вам нужно будет убедиться, что этого не произойдет (установив политику выселения и / или добавив в сообщения время жизни). Конечно, предыдущий пример будет отличаться в зависимости от того, когда потребитель делает долговременную подписку.

Если вы используете недолговечные темы:

  • Т-2 С1 и С2 делают нормальную подписку на тему
  • T-1 C1 и C2 отключить
  • T0: M0 размещен
  • T1: M1 размещен
  • T2: C1 соединяется. С1 не получает ничего
  • T3: M3 размещен. С1 получает М3
  • T4: M4 размещен. С1 получает М4
  • T5: C2 подключается, C2 ничего не получает

Есть два способа разрешить отправку сообщений, опубликованных в виртуальной теме. Первый - через надежного подписчика, а второй - то, что издатель отправляет сообщения с режимом доставки "PERSISTENT". Когда сообщения публикуются с режимом доставки "PERSISTENT", сообщение будет сохранено на диске, в противном случае оно будет сохранено в памяти.

Почему не может быть наблюдателя / наблюдаемой модели - на примере выше:

Когда M0 публикуется, C1 и C2 (подписчики потребителей) просыпаются и могут использовать событие? Я вижу эту модель лучше, чем долговечную и недолговечную - гибридный подход.

Другие вопросы по тегам