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

#azure #azure-functions #irc #azure-appservice

#azure #azure-функции #irc #azure-appservice

Вопрос:

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

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

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

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

У кого-нибудь есть идея? Я открыт для изменения кода или использования другой службы 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;
        }

    }
}
  

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

Ответ №1:

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

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