具有多个发送者的 C# 单个 UDP 侦听器提供数据问题
C# single UDP listener with multiple senders giving data problems
我有一个程序(windows 服务)从多个发送者(目前约 20 个)接收来自 UDP 的数据。每个发件人 "bursts" 每 10 秒大约 30 行 CSV 数据。每天总共发送大约 12.000.000 行。
所有传入数据都存储在文本文件中,每天一个。每个文件的大小约为 1 GB。但有时我们每天的文件只有 ~180 MB。它是非常一致的——要么是一个,要么是另一个,从不介于两者之间。 所以有些时候我们丢失了大约 80% 的传入数据。
我已经验证过,发件人总是发送大约相同数量的数据。所以它位于我们接收器的某个地方。
UDP 接收器基本上是这样构建的:
using (UdpClient client = new UdpClient(listenPort))
{
client.Client.ReceiveBufferSize = 8388608;
while (!cancellationTokenSource.Token.IsCancellationRequested)
{
var result = await client.ReceiveAsync().ConfigureAwait(false);
var textData = Encoding.ASCII.GetString(result.Buffer);
await dataHandler.Handle(textData);
}
}
dataHandler 是一个 class 将所有行附加到文本文件中
public async Task Handle(string data)
{
using (StreamWriter writer = File.AppendText(Path.Combine(this.outputPath, GetFilename())))
{
await writer.WriteLineAsync(data);
}
}
private string GetFilename()
{
return DateTime.Now.ToString("yyyy-MM-dd") + ".csv";
}
在我调查其他任何事情之前:上面的代码中是否有任何东西可能导致我所看到的问题? UDP 侦听器还是文件写入?
编辑:数据丢失在白天是均匀分布的,所以我想知道是不是写文件的问题?由于新文件是在午夜创建的。为每一行实例化一个新的 StreamWriter 是否足够有效?
事实证明,我看错了问题的一端。数据通过 UDP 套接字传入,数据写入文件。
关于重启程序解决数据丢失的观察是不正确的。而且也不是我做的 - 你不能相信任何人.... :-)
程序运行在VMWare虚拟机中,存储是SAN。我发现问题出在正在写入的文件上。某些文件放置在 SAN 中的错误位置。如果我重命名或删除文件,自动创建一个新文件,所有数据都被保存,没有数据丢失。
非常感谢所有为 UDP 部分提供想法的人。
我有一个程序(windows 服务)从多个发送者(目前约 20 个)接收来自 UDP 的数据。每个发件人 "bursts" 每 10 秒大约 30 行 CSV 数据。每天总共发送大约 12.000.000 行。
所有传入数据都存储在文本文件中,每天一个。每个文件的大小约为 1 GB。但有时我们每天的文件只有 ~180 MB。它是非常一致的——要么是一个,要么是另一个,从不介于两者之间。 所以有些时候我们丢失了大约 80% 的传入数据。
我已经验证过,发件人总是发送大约相同数量的数据。所以它位于我们接收器的某个地方。
UDP 接收器基本上是这样构建的:
using (UdpClient client = new UdpClient(listenPort))
{
client.Client.ReceiveBufferSize = 8388608;
while (!cancellationTokenSource.Token.IsCancellationRequested)
{
var result = await client.ReceiveAsync().ConfigureAwait(false);
var textData = Encoding.ASCII.GetString(result.Buffer);
await dataHandler.Handle(textData);
}
}
dataHandler 是一个 class 将所有行附加到文本文件中
public async Task Handle(string data)
{
using (StreamWriter writer = File.AppendText(Path.Combine(this.outputPath, GetFilename())))
{
await writer.WriteLineAsync(data);
}
}
private string GetFilename()
{
return DateTime.Now.ToString("yyyy-MM-dd") + ".csv";
}
在我调查其他任何事情之前:上面的代码中是否有任何东西可能导致我所看到的问题? UDP 侦听器还是文件写入?
编辑:数据丢失在白天是均匀分布的,所以我想知道是不是写文件的问题?由于新文件是在午夜创建的。为每一行实例化一个新的 StreamWriter 是否足够有效?
事实证明,我看错了问题的一端。数据通过 UDP 套接字传入,数据写入文件。
关于重启程序解决数据丢失的观察是不正确的。而且也不是我做的 - 你不能相信任何人.... :-)
程序运行在VMWare虚拟机中,存储是SAN。我发现问题出在正在写入的文件上。某些文件放置在 SAN 中的错误位置。如果我重命名或删除文件,自动创建一个新文件,所有数据都被保存,没有数据丢失。
非常感谢所有为 UDP 部分提供想法的人。