Как выбрать правильный подход к общению в реальном времени: длинный опрос или Redis Pub/Sub

Как выбрать правильный подход к общению в реальном времени: длинный опрос или 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# может предоставить пользователям отличный опыт общения в реальном времени.


:::информация Также опубликовано здесь

:::


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE