Добрый день.
Мы используем темы служебной шины в качестве движка для паба / подсистемы. Наша логика заключается в том, что наши сервисы C # подключаются к теме с подпиской. Мы удаляем $ Default (TrueFilter) и устанавливаем AutoDeleteOnIdle равным 5 минутам.
Поскольку другим частям системы нужны вещи, они говорят нашей службе C #: «Мне нужно это». Затем служба C # добавляет новые правила (обычно CorrelationFilter).
Поскольку те же самые части системы больше не нуждаются в вещах, они говорят нашей службе C #: «Мне это больше не нужно». Затем служба C # удаляет соответствующие правила.
Таким образом, подписка на тему все еще может быть подключена (в комплекте с объектом SubscriptionClient), но вообще не иметь правил.
Выпуск
Подписки «исчезают», и я не могу понять, почему. В конце концов, у меня есть активная подписка с экземпляром SubscriptionClient и подключенной функцией обратного вызова.
Затем, когда я собираюсь выполнить действие с моим объектом SubscriptionClient, он вызывает исключение MessagingEntityNotFoundException.
Мне показалось, что служебная шина произвольно и произвольно теряет или удаляет мои подписки.
Определение служебной шины "холостого хода"
Насколько я понимаю, подписка не является "бездействующей", если существует активное подключение к подписке (в моем случае, через экземпляр SubscriptionClient). Даже если не поступают сообщения с интересами, они все еще не простаивают и, следовательно, не удаляются. Если сообщение приходит днем позже, экземпляр SubscriptionClient получит его.
Это мой опыт работы с другими частями системы, которые динамически не добавляют / удаляют правила. Работает довольно хорошо.
Но потом я начал задаваться вопросом:
Несмотря на наличие подключения к подписке, видит ли служебная шина мою подписку бездействующей, поскольку в ней нет правил и, следовательно, она не может принимать сообщения? И будет ли служебная шина следовать свойству AutoDeleteOnIdle и удалять его?
Если вышеприведенное верно, тогда добавит ли FalseFilter в качестве $ Default сохранение подписки?
Любое понимание и помощь будут наиболее ценными.
Большое спасибо
- Шон
Обновление
Я провел элементарный тест в приложении WinForms, и, похоже, что-то не так с Service Bus. Или, по крайней мере, наш экземпляр Service Bus.
У меня 17 Тем, как указано ниже:
- d860ffbe-e9c6-4ede-b6e9-959be4373128 / уведомит-0
- d860ffbe-e9c6-4ede-b6e9-959be4373128 / notify-1
- ... (вы поняли)
- d860ffbe-e9c6-4ede-b6e9-959be4373128 / уведомит-е
- d860ffbe-e9c6-4ede-b6e9-959be4373128 / уведомит-е
- d860ffbe-e9c6-4ede-b6e9-959be4373128 / уведомит корень
notify-root пересылает все полученные сообщения другим темам уведомлений. Мы делаем это для шардинга.
Итак ...
Я создал 3 подписки на каждую из тем от 0 до f:
- Без правил (я удалил $ Default)
- TrueFilter (я оставил $ Default как есть)
- FalseFilter (я установил фильтр по умолчанию на FalseFilter при создании подписки)
Я создал экземпляр SubscriptionClient для каждой из этих 48 подписок и сохранил экземпляры в памяти. Я также использовал метод OnMessageAsync для передачи обратного вызова, который сообщает мне, когда пишется сообщение.
Для каждой подписки AutoDeleteOnIdle установлено значение TimeSpan.FromMinutes (5).
Я перебираю свои темы, подписки и правила каждую минуту, чтобы увидеть, когда подписки и правила появляются и исчезают.
Наконец, я публиковал сообщение каждую минуту на notify-root.
Каждая из 16 подписок с TrueFilter получала сообщение каждую минуту и отображала его в моем приложении WinForms, как и ожидалось.
Через 5 минут сервисная шина автоматически удалила все мои подписки на темы, заканчивающиеся на 0, 1, 2, 4, 5, 6, B, C и F.
Сервисная шина удалила эти подписки, несмотря на то, что они не заняты и активно получали сообщения менее чем за 1 минуту до удаления.
Примерно через 30 минут темы, оканчивающиеся на 3, 7, 8, 9, A и E, все еще получали сообщения без признаков удаления своих подписок.
Кроме того, служебная шина не удалила некоторые подписок, которые либо не получали сообщения из-за отсутствия правил, либо из-за наличия FalseFilter. Экземпляры SubscriptionClient did имеют обратный вызов, подключенный через OnMessageAsync. Следует отметить, что те, которые не были удалены, были в той же теме, что и подписки TrueFilter, которые также не были удалены.
Кажется, что он удаляет подписки из некоторых тем , несмотря на активность, но не других.
Я повторил тест, и это были те же самые темы, у которых были удалены их подписки (несмотря на активность).
После того как я прекратил публикацию, служебная шина удалила оставшиеся подписки через 5 минут (как и ожидалось).
Я повторю тест с другим набором из 17 тем.