如何解决在Azure中观看多个IRC频道的最佳方法
我正在尝试将我的应用程序连接到多个IRC通道,以读取传入的聊天消息并将其发送给我的用户。在一天中的任何时候,都可以添加新频道或删除现有频道,应用程序必须对此进行实时监控。我目前正在使用Microsoft Azure作为基础结构,并使用App Services进行面向客户端的计算,并使用App Service计划中的Azure功能来执行后台任务(不是消费计费模型)。
我当前的实现是在C#/。NET Core 3.1中,并且在TcpClient
上使用SslStream
来观看每个频道。然后,我使用StreamReader
和await reader.ReadLineAsync()
来监视新消息。我遇到的问题是App Services或Azure Functions似乎都不适合托管这样的观察程序。
首先,我尝试将其托管在Azure Function应用中,因为这显然是后台工作的一项任务,但是Azure Functions本质上希望由特定事件触发,运行一些代码,然后结束。在我的实现中,对await reader.ReadLineAsync()
的调用会暂停处理,直到收到消息为止。换句话说,运行观察程序的调用需要永久运行,这似乎与Azure函数的本质背道而驰。在我的尝试中,Azure Function服务最终崩溃,主机卸载,该服务上的所有功能停止,然后在主机重新加载几分钟后重新启动。我无法找到任何方法来说明导致崩溃的原因。这显然不是我想要的解决方案。如果我可以找到一个IrcmessageTrigger
Azure函数触发器,那可能是最好的选择。
从理论上讲,我可以将监视程序托管在我的App Service中,但是当我进行横向扩展时,由于同时有多个服务器连接到每个通道,我会遇到问题。新消息将发送到每个服务器,我的用户将收到重复消息。我可能可以解决这个问题,但是解决方案可能会很笨拙,我觉得真正的解决方案是首先要对它进行更好的架构。
有人知道吗?我愿意更改代码或使用其他Azure服务(假设它不太昂贵),但是我将在此项目的Azure基础结构上坚持使用C#和.NET Core。
下面是我的观察者代码的一部分,以提供一些上下文。
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;
}
}
}
谢谢!
解决方法
结果是初步的,但看来正确的方法是使用连续运行的Azure WebJobs来完成我试图实现的目标。最初,我没有考虑过WebJob,因为它们是比Azure Functions更旧的技术,并且本质上在较低的抽象级别上可以完成相同的工作。但是,在这种情况下,WebJobs似乎处理了功能不打算支持的用例。
要了解有关WebJob(包括连续WebJob)及其功能的更多信息,请参阅Microsoft documentation
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。