C# 通过TCP或更好的协议进行更快的状态复制

C# 通过TCP或更好的协议进行更快的状态复制,c#,performance,tcp,replication,tcpclient,C#,Performance,Tcp,Replication,Tcpclient,我有一个两节点系统,我试图在节点之间复制内存状态。。。为了简化,只需考虑主从(主动-被动)。节点A有一个相对恒定的变更流,然后尝试将状态推送到节点B。目前,这是通过对状态进行批处理并使用TcpClient实例推送来定期发生的 当前的TcpClient进程似乎有点低效。这是一种我可以在两个系统之间建立链接的方法,并且只要通道建立,状态就可以从一个系统流到下一个系统 出于性能原因,我不能使用WCF或远程处理之类的功能。。。我对较低层次的网络结构相对缺乏经验,但我非常愿意尝试任何新的东西。理想情况下,

我有一个两节点系统,我试图在节点之间复制内存状态。。。为了简化,只需考虑主从(主动-被动)。节点A有一个相对恒定的变更流,然后尝试将状态推送到节点B。目前,这是通过对状态进行批处理并使用TcpClient实例推送来定期发生的

当前的TcpClient进程似乎有点低效。这是一种我可以在两个系统之间建立链接的方法,并且只要通道建立,状态就可以从一个系统流到下一个系统


出于性能原因,我不能使用WCF或远程处理之类的功能。。。我对较低层次的网络结构相对缺乏经验,但我非常愿意尝试任何新的东西。理想情况下,解决方案是我可以用原生C#4实现的,并且不需要任何新产品。

TCP是一种低级别的基于连接的流协议。这似乎是正确的选择

关于TCP的唯一问题是延迟问题


您可以使用UDP,但从它的声音来看,您最终会在UDP上模拟TCP。

TCP是一种低级的基于连接的流协议。这似乎是正确的选择

关于TCP的唯一问题是延迟问题

您可以使用UDP,但从它的声音来看,您最终将通过UDP模拟TCP。

您使用TCP是正确的。 您应该建立连接并保持打开状态,直到完成连接。 你真的无法在速度上打败它

如果更改不太大,最好只发送增量更改,而不发送数据的完整副本。 我过去做这件事的方式是使用。 这可能比您想要尝试的要多,但基本思想是编写一个函数来遍历数据。将其视为同步序列化器/反序列化器。 在该控制结构下,它自动检测自上次行走以来的所有变化。 您可以抓取这些更改并将它们发送到另一端的接收器,该接收器的工作方式相同,但会在更改中折叠

这可能对您正在做的事情有点过分,但无论如何,TCP是一条前进的道路。 顺便说一句,尽量避免
new
-ing。这很昂贵。

您使用TCP是正确的。 您应该建立连接并保持打开状态,直到完成连接。 你真的无法在速度上打败它

如果更改不太大,最好只发送增量更改,而不发送数据的完整副本。 我过去做这件事的方式是使用。 这可能比您想要尝试的要多,但基本思想是编写一个函数来遍历数据。将其视为同步序列化器/反序列化器。 在该控制结构下,它自动检测自上次行走以来的所有变化。 您可以抓取这些更改并将它们发送到另一端的接收器,该接收器的工作方式相同,但会在更改中折叠

这可能对您正在做的事情有点过分,但无论如何,TCP是一条前进的道路。
顺便说一句,尽量避免
new
-ing。这很昂贵。

根据您的描述,不清楚问题出在哪里。如果TCP效率不高,您是如何衡量它的?您的要求是什么?如果您编码正确,TCP应该能够以您的线路能够处理的速度推送数据。TCP可能存在的一个问题是在数据包丢失时主动回退,但这不应该是内部网的问题。@Zepplock抱歉。。。这是我缺乏经验的表现。我并不是说“TCP”效率低下。我的意思是说TcpClient过程似乎效率低下。例如,在发送方,每次传输时,我都会更新一个新的客户端实例。我认为有一种方法可以建立链接,然后继续使用它更长的时间。更清楚吗?@JoeGeeky:我会在同步时检查你的链接饱和情况。我认为对于你的链接来说,数据量可能太大了。根据您的应用程序,您可能会有很多状态,对于您使用的任何NIC来说都太多了。我想知道的事情有很多:#1)状态传输期间NIC的利用率#2)传输的总数据#3)链路速度。我们需要找到瓶颈在哪里。TCP不应该是个问题。这是您将获得的最佳性能,并且在服务器/工作站硬件上具有高度的硬件加速。@JoeGeeky:我错误地使用了“异步”一词。我的意思是缓冲/排队状态更改并立即推送它们,这似乎是您在上一篇评论中所说的。通常,“批处理”包括等待一定数量的数据或等待一段时间。虽然您仍然希望更改是原子的,并且需要对某些状态进行批处理/分组,但您不希望对状态组进行批处理。我将使用生产者-消费者模式和一个队列,该队列立即推送状态的原子组。如果可以,请保持连接打开。最后一个问题。推压之间的时间间隔是多少?从你的描述来看,不清楚问题是什么。如果TCP效率不高,您是如何衡量它的?您的要求是什么?如果您编码正确,TCP应该能够以您的线路能够处理的速度推送数据。TCP可能存在的一个问题是在数据包丢失时主动回退,但这不应该是内部网的问题。@Zepplock抱歉。。。这是我缺乏经验的表现。我并不是说“TCP”效率低下。我的意思是说TcpClient过程似乎效率低下。例如,在发送方,每次传输时,我都会更新一个新的客户端实例。我认为有一种方法可以建立链接,然后继续使用它更长的时间。更清楚吗?@JoeGeeky:我会在同步时检查你的链接饱和情况。我认为对于你的链接来说,数据量可能太大了。根据您的应用程序,您可能会有很多状态,对于您使用的任何NIC来说都太多了。我好奇的事情列表:#1)状态转移期间的NIC利用率#2)