Лучший способ просмотра нескольких каналов IRC в Azure

Я пытаюсь подключить свое приложение к нескольким каналам IRC, чтобы читать входящие сообщения чата и отправлять их своим пользователям. Новые каналы могут быть добавлены или существующие каналы могут быть удалены в любое время в течение дня, и приложение должно отслеживать это почти в режиме реального времени. В настоящее время я использую Microsoft Azure для своей инфраструктуры и использую службы приложений для клиентских вычислений и функции Azure в плане службы приложений для фоновых задач (а не модель выставления счетов за потребление).

Моя текущая реализация находится в C#/.NET Core 3.1 и использует TcpClient вместо SslStream для просмотра каждого канала. Затем я использую StreamReader и await reader.ReadLineAsync() для просмотра новых сообщений. Проблема, с которой я сталкиваюсь, заключается в том, что ни Службы приложений, ни Функции Azure не являются подходящим местом для размещения такого наблюдателя.

Сначала я попытался разместить его в приложении "Функция Azure", так как это явно похоже на задачу для фонового работника, однако функции Azure по своей сути хотят запускаться определенным событием, запускать некоторый код, а затем завершаться. В моей реализации вызов await reader.ReadLineAsync() останавливает обработку до получения сообщения. Другими словами, вызов, запускающий наблюдателя, должен выполняться бесконечно, что, похоже, противоречит сути функции Azure. В моей попытке служба функций Azure в конечном итоге дает сбой, узел выгружается, все функции в службе прекращаются, а затем перезапускаются через несколько минут после перезагрузки узла. Я не могу найти способ сказать, что вызывает сбой. Это явно не то решение, которое мне нужно. Если бы я мог найти триггер функции Azure IrcMessageTrigger, это, вероятно, был бы лучшим вариантом.

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

У кого-нибудь есть идея? Я готов изменить код или использовать другую службу Azure (при условии, что это не слишком дорого), но в этом проекте я буду придерживаться C# и .NET Core в инфраструктуре Azure.

Ниже приведена часть моего кода наблюдателя, чтобы обеспечить некоторый контекст.

while (client.Connected)
{
    //This line will halt execution until a message is received
    var data = await reader.ReadLineAsync();

    if (data == null)
    {
        continue;
    }

    var dataArray = data.Split(' ');

    if (dataArray[0] == "PING")
    {
        await writer.WriteLineAsync("PONG");
        await writer.FlushAsync();

        continue;
    }

    if (dataArray.Length > 1)
    {

        switch (dataArray[1])
        {
            case "PRIVMSG":
                HandlePrivateMessage(data, dataArray);
                break;
        }

    }
}

Заранее спасибо!


person Joe Newton    schedule 24.08.2020    source источник


Ответы (1)


Результаты являются предварительными, но кажется, что правильный подход заключается в использовании непрерывно работающих веб-заданий Azure для достижения того, чего я пытаюсь достичь. Сначала я не рассматривал веб-задания, потому что они являются более старой технологией, чем функции Azure, и, по сути, выполняют ту же работу на более низком уровне абстракции. Однако в этом случае веб-задания, по-видимому, обрабатывают вариант использования, для поддержки которого не предназначены функции.

Чтобы узнать больше о веб-заданиях (включая непрерывные веб-задания) и о том, на что они способны, см. типы" rel="nofollow noreferrer">Документация Microsoft

person Joe Newton    schedule 08.09.2020