Во-первых, здесь есть состояние моего приложения:Использование SignalR подтолкнуть клиентов от долгого запущенного процесса
У меня есть запрос, поступающие из клиента (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. Хотя это больше, чем я хочу сейчас жевать.
Любые идеи/рекомендации/конструктивная критика приветствуются.
Спасибо.
Я думаю, что есть что-то не так с система реального времени, использующая базу данных в качестве средства связи. В идеале вы должны напрямую общаться с компонентами. Если это невозможно, вам нужен фоновый поток (или задача), который опросит базу данных и вытолкнет ответ, используя SignalR – thab
@thab. Я очень согласен. Вот почему я задал этот вопрос. Я могу исключить опрос и базу данных для обработки (возможно, с помощью служебной шины). Это сообщение обратно к SignalR обратно из обработки, о которой я не знаю. –