Виртуальные темы / очереди и долговечность
Что произойдет с сообщениями, размещенными в виртуальной теме, когда не будет прослушивать никаких потребителей? Будет ли брокер удерживать их некоторое время, пока не будет доступен абонент?
Более конкретно: в 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 (подписчики потребителей) просыпаются и могут использовать событие? Я вижу эту модель лучше, чем долговечную и недолговечную - гибридный подход.