在 Azure 中观看多个 IRC 频道的最佳方式
Best way to watch multiple IRC channels in Azure
我正在尝试将我的应用程序连接到多个 IRC 频道以读取传入的聊天消息并将它们发送给我的用户。一天中的任何时间都可能添加新频道或删除现有频道,应用程序必须近乎实时地接收此信息。我目前正在将 Microsoft Azure 用于我的基础架构,并将 App Services 用于面向客户端的计算,并在 App Service 计划中将 Azure Functions 用于后台任务(不是消费计费模型)。
我当前的实现是在 C#/.NET Core 3.1 中,并使用 TcpClient
而不是 SslStream
来观看每个频道。然后我使用 StreamReader
和 await reader.ReadLineAsync()
来监视新消息。我 运行 遇到的问题是 App Services 或 Azure Functions 似乎都不适合托管这样的观察者。
起初,我尝试将它托管在 Azure Function 应用程序中,因为这显然像是后台工作人员的任务,但是 Azure Functions 本质上希望由特定事件触发,运行 一些代码,然后结束。在我的实现中,对 await reader.ReadLineAsync()
的调用会停止处理,直到收到一条消息。换句话说,调用 运行ning 观察者需要永久 运行,这似乎违背了 Azure Functions 的原则。在我的尝试中,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;
}
}
}
提前致谢!
结果是初步的,但似乎正确的方法是持续使用 Azure WebJobs 运行 来完成我想要实现的目标。我最初没有考虑 WebJobs,因为它们是比 Azure Functions 更老的技术,并且基本上在较低的抽象级别上完成相同的工作。然而,在这种情况下,WebJobs 似乎处理了 Functions 不打算支持的用例。
要了解有关 WebJobs(包括连续 WebJobs)及其功能的更多信息,请参阅 Microsoft documentation
我正在尝试将我的应用程序连接到多个 IRC 频道以读取传入的聊天消息并将它们发送给我的用户。一天中的任何时间都可能添加新频道或删除现有频道,应用程序必须近乎实时地接收此信息。我目前正在将 Microsoft Azure 用于我的基础架构,并将 App Services 用于面向客户端的计算,并在 App Service 计划中将 Azure Functions 用于后台任务(不是消费计费模型)。
我当前的实现是在 C#/.NET Core 3.1 中,并使用 TcpClient
而不是 SslStream
来观看每个频道。然后我使用 StreamReader
和 await reader.ReadLineAsync()
来监视新消息。我 运行 遇到的问题是 App Services 或 Azure Functions 似乎都不适合托管这样的观察者。
起初,我尝试将它托管在 Azure Function 应用程序中,因为这显然像是后台工作人员的任务,但是 Azure Functions 本质上希望由特定事件触发,运行 一些代码,然后结束。在我的实现中,对 await reader.ReadLineAsync()
的调用会停止处理,直到收到一条消息。换句话说,调用 运行ning 观察者需要永久 运行,这似乎违背了 Azure Functions 的原则。在我的尝试中,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;
}
}
}
提前致谢!
结果是初步的,但似乎正确的方法是持续使用 Azure WebJobs 运行 来完成我想要实现的目标。我最初没有考虑 WebJobs,因为它们是比 Azure Functions 更老的技术,并且基本上在较低的抽象级别上完成相同的工作。然而,在这种情况下,WebJobs 似乎处理了 Functions 不打算支持的用例。
要了解有关 WebJobs(包括连续 WebJobs)及其功能的更多信息,请参阅 Microsoft documentation