3

Во-первых, здесь есть состояние моего приложения:Использование SignalR подтолкнуть клиентов от долгого запущенного процесса

enter image description here

У меня есть запрос, поступающие из клиента (angularjs приложение) в мой API (веб api 2). Этот запрос обрабатывается, и запись хранится в базе данных. Затем ответ отправляется клиенту.

В настоящее время у меня есть опрос служб Windows и обработка этой записи. Обработка этой записи может быть продолжена. В качестве побочного эффекта для обработки этой записи могут возникнуть уведомления, которые будут отправлены обратно одному или нескольким клиентам.

Мой вопрос в том, как я могу это сделать, чтобы я мог использовать SignalR, чтобы иметь возможность перенаправлять уведомления клиенту.

Мой камень преткновения:

можно зарегистрировать и хранить (в памяти при поддержке БД) SignalR клиента ConnectionID наряду с собственным идентификатором пользователя приложения. Таким образом, я могу сопоставить созданное уведомление с клиентом signalr.

В настоящий момент у меня есть концентраторы SignalR в процессе IIS. Итак, как мне вернуться из службы Windows в IIS, чтобы уведомить клиента о получении уведомления?

Кроме того, я должен сказать, что я уже использую SignalR в другом месте приложения и использую объединительную плату SQL Server.

Проблема с текущей архитектуры:

  • Любая обработка выполняется в том же веб-запроса, и уведомления посылаются через SignalR перед ответом клиенту возвращается. К счастью, обработка минимальная и очень быстрая.

  • Я думаю, что это не очень хорошо с точки зрения производительности или обслуживания в долгосрочной перспективе.

Возможные решения:

  • Удалить SignalR концентраторы из IIS и размещать их где-то еще - окна обслуживания?
  • Вывести конечную точку API для того, чтобы служба Windows вызывала push-уведомление после создания уведомления?

Наконец, чтобы добавить больше ингредиентов в микс: используйте служебную шину для удаления компонента опроса службы Windows и перейдите к архитектуре pub/sub. Хотя это больше, чем я хочу сейчас жевать.

Любые идеи/рекомендации/конструктивная критика приветствуются.

Спасибо.

+0

Я думаю, что есть что-то не так с система реального времени, использующая базу данных в качестве средства связи. В идеале вы должны напрямую общаться с компонентами. Если это невозможно, вам нужен фоновый поток (или задача), который опросит базу данных и вытолкнет ответ, используя SignalR – thab

+0

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

ответ

1

Посмотрите на this sample for starters

Еще более продвинутое решение можно с помощью backplane для управления связью между передним концом и бэкэндом ...

HTH

+0

И вот еще одна интересная ссылка: https://github.com/particular/webinar.signalr –

+0

Это великолепно. Именно то, что я искал. –