Как выбрать правильный подход к общению в реальном времени: длинный опрос или Redis Pub/Sub
17 марта 2023 г.Выбор правильного подхода к общению в реальном времени
Обмен данными в режиме реального времени необходим для современных веб-приложений, требующих быстрого обмена данными между клиентами и серверами. Ниже приведены два популярных подхода к обеспечению связи в реальном времени в веб-приложениях:
* Долгий опрос * Публикация/подписка Redis
Что такое длинный опрос?
Долгий опрос – это метод, при котором клиент отправляет запрос на сервер и ожидает ответа. Сервер удерживает запрос открытым до тех пор, пока не появятся новые данные для отправки обратно или пока не истечет время ожидания.
Длительный опрос – это подход с низкими издержками, который подходит для проектов с небольшим количеством клиентов и низкой частотой обновлений.
Базовая архитектура Long Polling показана ниже.
В C# длинный опрос можно реализовать с помощью ASP.NET Core. Сервер ожидает максимум указанное время новых данных от службы. Если новые данные получены до истечения времени ожидания, данные возвращаются в ответе.
Если время ожидания истекло до получения новых данных, действие возвращает ответ «Нет содержимого».
Пример базового кода C#
public async Task<ActionResult> LongPolling()
{
while (true)
{
// Wait for new data for a maximum of 30 seconds
var newData = await GetDataAsync(30);
if (newData != null)
{
// Return the new data to the client
return Json(newData);
}
// No new data received within the timeout, continue polling
}
}
private async Task<Data> GetDataAsync(int timeoutSeconds)
{
// Make an asynchronous call to retrieve data from the server
// This call will be held open until new data is available or until the timeout is reached
var data = await _dataService.GetDataAsync();
if (data != null)
{
// New data received, return it immediately
return data;
}
// No new data received, wait for the specified timeout period
await Task.Delay(TimeSpan.FromSeconds(timeoutSeconds));
// Check again for new data
return await GetDataAsync(0);
}
Приведенный выше фрагмент кода представляет собой простую реализацию длинного опроса, метода, при котором клиент ожидает новых данных от сервера. Если новые данные получены в течение 30 секунд, они возвращаются клиенту. Если нет, клиент продолжает опрос до тех пор, пока не будут доступны новые данные.
Важно отметить, что этот код является лишь базовым примером и может не подходить для всех случаев использования. Долгий опрос может быть ресурсоемким и плохо масштабироваться для многих клиентов. Альтернативные методы, такие как Redis Pub/Sub или другие системы обмена сообщениями, могут оказаться более подходящими.
Длинный опрос — это простой и недорогой подход, подходящий для небольших проектов. Это надежный метод, который гарантирует получение клиентом обновлений в режиме реального времени и совместим с большинством веб-браузеров.
Что такое Redis Pub/Sub?
Redis Pub/Sub – это масштабируемая система обмена сообщениями, обеспечивающая связь между клиентом и сервером в режиме реального времени. Он включает в себя подписку клиентов на каналы и получение обновлений всякий раз, когда новые данные публикуются в этих каналах. Redis Pub/Sub подходит для проектов с большим количеством клиентов и частыми обновлениями.
Redis Pub/Sub можно реализовать на C# с помощью библиотеки StackExchange — Redis. Библиотека предоставляет подключение к Redis, подписчика Redis и издателя Redis.
Подписчик подписывается на канал и выполняет функцию при получении сообщения. Издатель публикует сообщение в указанном канале.
Пример базового кода C#
using StackExchange.Redis;
public class RedisPubSubService
{
private readonly IConnectionMultiplexer _connectionMultiplexer;
private readonly string _channelName;
public RedisPubSubService(IConnectionMultiplexer connectionMultiplexer, string channelName)
{
_connectionMultiplexer = connectionMultiplexer;
_channelName = channelName;
}
public void Subscribe(Action<string> onMessageReceived)
{
var redis = _connectionMultiplexer.GetSubscriber();
redis.Subscribe(_channelName, (channel, message) =>
{
onMessageReceived?.Invoke(message);
});
}
public async Task PublishAsync(string message)
{
var redis = _connectionMultiplexer.GetSubscriber();
await redis.PublishAsync(_channelName, message);
}
}
Приведенный выше код определяет класс, который управляет связью Pub/Sub. Метод Subscribe принимает аргумент, который будет вызываться после получения сообщения на указанном канале. Метод PublishAsync отправляет сообщение в канал.
Создайте экземпляр ConnectionMultiplexer, который подключается к серверу. Затем он может создать экземпляр объекта RedisPubSubService и подписаться на канал с помощью метода Subscribe. Указанная функция обратного вызова будет выполнена при получении сообщения на канале.
// Create a ConnectionMultiplexer instance
var redis = ConnectionMultiplexer.Connect("localhost");
// Create a RedisPubSubService instance for the "my-channel" channel
var pubSubService = new RedisPubSubService(redis, "my-channel");
// Subscribe to the channel and handle incoming messages
pubSubService.Subscribe(message =>
{
Console.WriteLine($"Received message: {message}");
});
// Publish a message to the channel
await pubSubService.PublishAsync("Hello, world!");
Redis Pub/Sub — это масштабируемый подход, подходящий для крупномасштабных проектов с большим количеством клиентов и высокой частотой обновлений. Он обеспечивает связь между несколькими клиентами в режиме реального времени и позволяет им получать обновления в реальном времени без отправки запросов на сервер.
Заключение
Длинный опрос и Redis Pub/Sub — это два подхода к общению в реальном времени в веб-приложениях.
Long Polling подходит для проектов с небольшим количеством клиентов, а Redis Pub/Sub подходит для проектов с большим количеством клиентов и общением между несколькими клиентами в режиме реального времени.
Реализация Long Polling и Redis Pub/Sub на C# может предоставить пользователям отличный опыт общения в реальном времени.
:::информация Также опубликовано здесь
:::
Оригинал