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

Posted

技术标签:

【中文标题】在 Azure 中观看多个 IRC 频道的最佳方式【英文标题】:Best way to watch multiple IRC channels in Azure 【发布时间】:2020-08-24 22:31:27 【问题描述】:

我正在尝试将我的应用程序连接到多个 IRC 频道以读取传入的聊天消息并将它们发送给我的用户。可以在一天中的任何时间添加新频道或删除现有频道,并且应用程序必须近乎实时地了解这一点。我目前将 Microsoft Azure 用于我的基础架构,并使用应用服务进行面向客户端的计算,并在应用服务计划中使用 Azure Functions 来处理后台任务(不是消费计费模型)。

我当前的实现是在 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 Function 触发器,这可能是最好的选择。

理论上,我可以在我的应用服务中托管观察程序,但是当我横向扩展时,由于有多个服务器同时连接到每个通道,我会遇到问题。新消息将发送到每个服务器,我的用户将收到重复消息。我可能会处理这个问题,但解决方案可能会很老套,我觉得真正的解决方案是首先更好地构建它。

有人有想法吗?我愿意更改代码或使用不同的 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;
        

    

提前致谢!

【问题讨论】:

【参考方案1】:

结果是初步的,但似乎正确的方法是使用连续运行的 Azure WebJobs 来完成我想要实现的目标。我最初没有考虑 WebJobs,因为它们是比 Azure Functions 更古老的技术,并且基本上在较低的抽象级别上完成相同的工作。然而,在这种情况下,WebJobs 似乎处理了 Functions 不打算支持的用例。

要了解有关 WebJobs(包括连续 WebJobs)及其能力的更多信息,请参阅Microsoft documentation

【讨论】:

以上是关于在 Azure 中观看多个 IRC 频道的最佳方式的主要内容,如果未能解决你的问题,请参考以下文章

在 Phonegap / Sencha 中观看 YouTube 的最佳实践

如何标记 IRC 频道的所有成员

禁止登录 IRC 频道,以 twitch 为例

以编程方式发送 IRC 命令

IRC 协议的 JOIN 命令

在网页中嵌入 IRC 客户端的最佳方式