Подтвердить что ты не робот

Должны ли сигнальные серверные методы быть асинхронными при вызове Клиентов?

Я следую "SignalR Tutorial": http://www.asp.net/signalr/overview/hubs-api/hubs-api-guide-server

Итак, допустим этот простой метод чата:

public void Send(string name, string message)
{
     // Call the addNewMessageToPage method to update clients.
     Clients.All.addNewMessageToPage(name, message);
}

Предположим, что у меня есть чат с 50 000 пользователей. Будет ли какая-либо польза от изменения метода отправки async, например:

 public async Task Send(string name, string message)
 {
     // Call the addNewMessageToPage method to update clients.
     await Clients.All.addNewMessageToPage(name, message);
 }
  • Будет ли IIS иметь текущий запрос (пользователя, опубликовавшего чат) и ждать, пока все клиенты будут уведомлены?
  • Является ли вызов "Клиент" полностью асинхронным под капотом, и запрос выпущен на этом этапе?

Спасибо!

4b9b3361

Ответ 1

Единственная причина, по которой вы должны ждать выполнения задачи, - это использование масштабирования. По умолчанию шина сообщений в памяти возвращает завершенную задачу, потому что операция выполняется так быстро, что нет смысла делать ее асинхронной, но вы можете, если хотите. Чтобы ответить на ваши вопросы:

  • Мы не отправляем клиентам в тот же стек вызовов, что и вызов метода (например, Clients.All.addNewMessage не ждет ничего, кроме публикации на шине сообщений). Ни одна строка запроса не будет ждать, когда клиенты получат что-либо (мы не поддерживаем ожидание на клиенте, получая сообщение в SignalR для обычных вызовов).

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

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

Надеюсь, что поможет