【问题标题】:Faster state replication over TCP or better protocol通过 TCP 或更好的协议进行更快的状态复制
【发布时间】:2011-12-20 20:58:12
【问题描述】:

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

当前的 TcpClient 进程似乎有些低效。这是一种我可以在两个系统之间建立链接并在建立通道时从一个系统流式传输到下一个系统的方法吗?

出于性能原因,我不能使用 WCF 或 Remoting 之类的东西...我对较低级别的网络结构相对缺乏经验,但我非常愿意尝试任何新的东西。理想情况下,我可以使用本机 C# 4 完成解决方案,并且不需要任何新产品。

【问题讨论】:

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

标签: c# performance tcp replication tcpclient


【解决方案1】:

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

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

这对于您正在做的事情可能有点多,但无论如何,TCP 是要走的路。 顺便说一句,尽量避免new-ing。这很昂贵。

【讨论】:

  • 太棒了!我必须阅读更多关于 差分执行 的内容,但这听起来很简单。我现在正在尝试做一些测试。谢谢。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-22
    • 1970-01-01
    • 2014-03-06
    • 2011-12-17
    • 2013-03-24
    • 2013-03-21
    • 2011-08-15
    • 1970-01-01
    相关资源
    最近更新 更多