Многие ко многим фильтрация в Message Broker - PullRequest
1 голос
/ 26 февраля 2020

У меня есть объект Person в системе. Когда человек выполняет какое-либо действие, появляется актер-администратор, который заинтересован в наблюдении за такого рода событиями.

Person
{
   Id: string
}
PersonAction
{
   ActionType: enum
   PersonId: string
}

В настоящее время эта подписка реализована посредством ServiceBus topi c и подписок: администраторы подписываются на действия все люди в системе:

  • Azure Сервисный автобус имеет брокера PersonActions topi c.
  • Каждый раз, когда Person выполняет какое-либо действие, в Topi c.
  • отправляется событие PersonAction. Каждый администратор создает собственную подписку на topi c и отслеживает все действия Persons. .

Теперь у меня есть новое требование, которое вводит группирование лиц, и мне нужен способ, позволяющий администраторам подписываться на события PersonActions на основе групп, которые они хотят отслеживать:

  • Люди могут быть частью одной или нескольких групп.
  • Администраторы заинтересованы в мониторинге групп лиц и, следовательно, получении всех событий PersonAction для групп, которые они отслеживают.
  • Администраторы могут подписаться на одну или несколько групп.

Вот мои мысли о том, как это сделать:

  • Добавить в PersonAction свойство маршрутизации, которое будет содержать информацию о группах, членом которых этот человек является
  • Когда администратор создает новую подписку, он будет указать набор групп, которые он хочет отслеживать, и он должен быть как-то использован в фильтре подписки для фильтрации сообщений PersonAction в Topi c.

Итак, сокращая дело, я хочу использовать возможности фильтрации Service Bus Topi c для доставки сообщений PersonAction специально для администраторов, которые заинтересованы в них, на основе групп.

В общем, это не кажется простой задачей для ServiceBus (или любой другой). другой брокер сообщений) потому что есть отношение многие ко многим on: один человек может входить в несколько групп, и администратор может захотеть подписаться на несколько групп. Обычно все фильтры поддерживают фильтрацию, когда событие имеет единственное свойство (например, «groupId = 1234»), и в моем случае это массив.

Пока что я придумал два решения, но мне не очень понравилось любой из них:

  1. Используйте LIKE SqlFilter. Объедините все группы Person в одну строку, разделенную запятыми (groups=1,2,5,8), и затем установите фильтр groups LIKE %1% OR groups LIKE %5% (в действительности идентификаторы групп будут путеводителями, поэтому не берите в голову проблему с одним идентификатором группы, являющимся подстрокой другого )

  2. Добавьте каждый идентификатор группы в качестве свойства с пустым значением, а затем используйте фильтр EXISTS, чтобы проверить, определено ли в событии этот идентификатор группы. Фильтр будет иметь свойства EXISTS(1) OR EXISTS(5) и PersonAction: {1:null, 2:null, 5:null, 8:null}

Есть ли лучший способ выполнить такую ​​фильтрацию и как выполняется правило фильтрации «многие ко многим» в брокерах сообщений?

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

1 Ответ

0 голосов
/ 03 марта 2020

Я не очень знаком с другими брокерами, но вот что приходит на ум для Azure Service Bus.

Вы можете иметь 2 (3 с бонусом) уровня сущностей вместо 1 для такой сценарий

  1. Первый уровень - это топи c, в который входят все сообщения PersonAction и в которых будут подписки для каждой группы с настройкой auto-forward на свои собственные темы
  2. На втором уровне каждая группа имеет свою собственную топику c, и администраторы подписываются на несколько тем, основываясь на группах, которые они хотят отслеживать , но придется дублировать сообщения

    Вы можете удалить этот уровень и иметь прямые подписки (по одной на группу на администратора), но, вероятно, достигнете предела в 2000 подписок на топи c

  3. (Бонус) Автоматическая пересылка сообщений из подписок в очереди администратора и включение Обнаружение дубликатов
* 102 9 *

Обратите внимание , что количество выставленных счетов будет увеличиваться, как указано в разделе Auto Forward документов


Здесь более подробное объяснение того же

1. Ввод Topi c
Это место, где сообщения PersonAction должны были бы поступить в первый раз.

В этой топи c будут подписки, которые фильтруют сообщения на основе группы (любой из ваших подходов). ; Я бы предпочел использовать Корреляционный фильтр , поскольку он более эффективен) и автоматически переадресовывал бы сообщений в соответствующие темы.

2. Topi c на группу
Здесь PersonAction сообщения, отфильтрованные по группе go в.

На этом этапе будут копироваться одни и те же сообщения в разных темах на основе все группы, в которые входит пользователь.

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

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

...