Я пытаюсь подключить свое приложение к нескольким каналам 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;
}
}
}
Заранее спасибо!