Сложная логика отправки сообщений в SignalR

232
02 мая 2017, 03:53

Добрый день.

Описание:

При подключении пользователя я получаю его id,

   var id = Context.User.Identity.GetUserId();

который соответствует id из БД, и сохраняю его в память.

 Таблица 1:
 |Connectionid|id_из_БД(UserId)|
 |    Guid    |      1         |
 |      *     |      2         |
 |      *     |      3         |
 |      *     |      4         |
 |      *     |      5         |

Каждый пользователя может состоять в нескольких событиях, информация о которых хранится в таблицах БД:

 Таблица 2:
 Таблица Meeting в БД     Таблица Event в БД
 |MeetingId|UserId|       |EventId|UserId|       
 |     1   |  1   |       |   1   |   1  |       
 |     1   |  3   |       |   1   |   2  |       
 |     2   |  2   |       |   1   |   5  |   

При подключении пользователя к Hub, он попадает в "Общую комнату" и должен отправить сообщение (автоматически по таймеру) всем пользователям в этой комнате, за исключением пользователей находящихся в "MeetingRoom" и "EventRoom" комнатах, если он с ними не состоит в этом событии(нет записи в таблице "Meeting" или "Event" БД). НО: Пользователи из "MeetingRoom" и "EventRoom" комнат также должны отправлять сообщения всем, кроме пользователей которые сейчас находятся в комнате "MeetingRoom" и "EventRoom" и не состоят в одном событии (нет записи в таблице "Meeting" или "Event" соответственно).

Пример: Предположим пользователи сейчас расположились в комнатах так.

   Таблица 3:
   Общая комната:        MeetingRoom           EventRoom
   [UserId]               [UserId]              [UserId]
      3                      1                     2
      4                      5

Список пользователей, который состоят в Event и Meeting см. в Таблице 2.

Пользователь 4 должен отправить сообщение только пользователю 3, т.к. пользователь 4 не состоит не в одном Meeting и Event (таблица в БД).

Пользователь 3 должен отправить сообщение пользователю 4 и 1, т.к. мы должны отправлять сообщения всем пользователям из общей комнаты и только тем пользователям, которые с нами в таблице "Meeting" или "Event" и находятся в этих комнатах.

Пользователь 2 должен отправить сообщение пользователям 3 и 4, пользователю 5 не отправляет т.к. пользователь хоть и состоит с пользователем 2 в одном "Event", но его нет в "EventRoom" и нет в общей комнате, также не отправляет пользователю 1 т.к. не состоит с ним в одном "Meeting"

Пользователи 1 и 5 должны отправить свои сообщения пользователям 2,3,4.

Каждый пользователь может быть только в 1 комнате в 1 единицу времени.

Решение, которое есть В Таблице 1 определили еще 1 поле в котором хранится сообщение. Для его получения, клиент с определённой периодичностью вызывает функцию на сервере, которая возвращает все сообщения, от пользователей с учетом фильтрации (список пользователей получается тяжелым запросом из БД).

То, что хочу (и уже долго пытаюсь) реализовать Оптимальное решение задачи, есть еще идея создать структуру в RAM (например, хеш-таблицу), чтобы пользователи отправляли сообщения другим с учётом фильтрации, которая бы позволила уменьшить количество обращений к базе. Возникает проблема со сложностью фильтрации.

Прошу от вас идей, намеков и хоть чего-то, что помогло бы решить такую задачу. Всем спасибо.

READ ALSO
Звук при нажатии горячих клавиш

Звук при нажатии горячих клавиш

Создал сочетание клавиш Ctrl+O и Ctrl+АПри нажатии все работает, как я хотел, но проигрывается стандартный звук «Восклицание»

264
Делать ссылки кликабельными в тексте

Делать ссылки кликабельными в тексте

Использую ListView для отображения логовИногда в логе бывают ссылки (напимер, "Некорректная ссылка: http://example

320
Рекурсия. Как происходит вход в условие

Рекурсия. Как происходит вход в условие

Имеется такая функция, которая вызывает сама себя, то есть рекурсивнаяДопустим n = 5

248
Как сделать простейший клиент для базы данных MSSQLS Express в Windows Forms приложении на C#

Как сделать простейший клиент для базы данных MSSQLS Express в Windows Forms приложении на C#

Сейчас я только понял как добавить в источники данных БДДальше не могу понять, как поступить дальше

254