#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