在.Net中进行RPC的优化方法

时间:2011-05-24 16:23:18

标签: .net wcf remoting rpc

我正在考虑将部分.Net应用程序移动到其他计算机上。显而易见的方法是使用带有二进制tcp协议的WCF,例如“Easiest way to get fast RPC with .NET?”中的描述符。

我将拨打大量电话,延迟是一个大问题。基本上一台计算机将运行一个物理模拟器,其他计算机将使用几百个命令的API与它进行交互。

我认为最好的方法是制作一个自定义二进制协议,其中API命令由int16和序列号标识,然后是必需的参数。硬连线发送和接收类将消除任何不必要的开销。

但是,由于我们正在谈论数百个API命令,所以这是很多工作。

有关实施它的最佳方法的任何想法吗?

修改 澄清一下:.Net中的AFAIK序列化没有得到优化。序列化和反序列化对象的惩罚相对较高,例如反射的内部使用。这是我想要避免的,因此我可以直接映射(硬连线)方法。

经过一番搜索,我找到了一个应用程序,我对http://www.protocol-builder.com/

进行了模糊的回忆

1 个答案:

答案 0 :(得分:8)

减少总流量(这将是自定义协议与使用WCF的主要好处)不会对延迟产生很大影响。主要问题是将“所需参数”的数据量保持在最低限度,因此每个请求都相对较小。 WCF中的默认序列化已经非常有效,尤其是在本地网络上使用TCP时。

在您所描述的场景中,许多客户端连接到中央服务器,消息传输本身不太可能成为瓶颈 - 处理特定消息可能是瓶颈,传输机制不会那么重要。

就个人而言,我只会使用WCF,而不是在尝试构建自定义协议。如果,一旦运行它,您发现存在问题,您可以轻松地将传输抽象为当时的自定义协议 ,并将其映射到相同的接口。这需要非常少的额外代码,而不仅仅是预先自定义协议堆栈,并且可能使代码更加清晰(因为自定义协议将被隔离到单个映射到“干净”API)。但是,如果您发现运输不是瓶颈,那么您将节省大量的劳力和精力。