微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在Azure中观看多个IRC频道的最佳方法

如何解决在Azure中观看多个IRC频道的最佳方法

我正在尝试将我的应用程序连接到多个IRC通道,以读取传入的聊天消息并将其发送给我的用户。在一天中的任何时候,都可以添加新频道或删除现有频道,应用程序必须对此进行实时监控。我目前正在使用Microsoft Azure作为基础结构,并使用App Services进行面向客户端的计算,并使用App Service计划中的Azure功能来执行后台任务(不是消费计费模型)。

我当前的实现是在C#/。NET Core 3.1中,并且在TcpClient上使用SslStream来观看每个频道。然后,我使用StreamReaderawait 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 举报,一经查实,本站将立刻删除。