翻译:改进.NET应用程序的性能和可伸缩性(三)-Remoting性能

摘要:对remoting了解的不深,这次翻译的一些地方可能不对,欢迎大家指点。

设计上的考虑

Use .NET remoting for communicating between application domains in the same process.
在同一进程内使用.NET Remoting为应用程序域间通信。
Choose the right host.
选择正确的宿主(译注:应该是指IIS,windows service等)。
Choose the right activation model.
选择正确的激活模型(译注:客户端激活,服务端激活等)。
Choose the right channel.
选择正确的通道(译注:TcpChannel,HttpChannel等)。
Choose the right formatter.
选择正确的Formatter。
Choose between synchronous or asynchronous communication.
在同步和异步通信之间选择。
Minimize round trips and avoid chatty interfaces.
最小化不必要的来回及避免啰嗦的接口(译注:可能翻译的不准确)。
Avoid holding state in memory.
避免在内存里保持状态。

激活
Use client-activated objects (CAO) only where you need to control the lifetime.
仅在当你需要控制生命周期的时候使用客户端激活对象。
Use SingleCall server activated objects (SAO) for improved scalability.
使用SingleCall的服务端激活对象来改进可伸缩性。
Use singleton where you need to access a synchronized resource.
当你需要访问一个同步的资源的时候使用Singleton激活模式(译注:singletion是说无论多少次请求服务端都是一个对象在执行调用)。
Use singleton where you need to control lifetime of server objects.
当你需要控制服务端对象的生命周期的时候使用Singletion方式(译注:可以重写MarshalByRefObject的InitializeLifetimeService方法)。
Use appropriate state management to scale the solution.
使用适当的状态管理以提高你的解决方案的可伸缩性(译注:scale不知道在这儿咋翻译)。

生命周期的考虑
Tune default timeouts based on need.
在需要的时候调整默认的超时时间(译注:based不知道需不需要翻译出来)。

宿主
Use Internet Information Services (IIS) to authenticate calls.
使用IIS来验证请求(译注:IIS自带关闭匿名访问并启用集成身份验证的功能,所以可以直接用来进行客户端身份验证,该方法只适用于HTTP通道。如果不使用IIS,就得实现自定义通道来实现客户端验证了。)。
Turn off HTTP keep alives when using IIS.
在使用IIS做宿主的时候关闭HTTP的keep alives选项(译注:在IIS承载一半web应用的时候打开保持链接选项会提高性能,因为一个网页上的多个图片的下载可能用一个连接就能下载,避免多次创建网络链接,而IIS承载remoting会为每个remoting请求使用一个连接,所以关闭保持连接选项IIS就不用考虑是否要保持连接了,从而提高了性能)。
Host in IIS if you need to load balance using network load balancing (NLB).
如果你需要使用网络负载平衡来实现负载均衡用IIS来宿主你的remoting应用(译注:使用IIS和HttpChannel可以让每次的方法调用都是单独的连接,并且和机器无关,而使用TcpChannel就不能在一个服务器场里实现负载均衡,因为TcpChannel使用的是TCP长链接,每次调用一个对象的方法都到同一台机器,不能自动在一个服务器场的多台机器上均衡请求)。

通道
Use TcpChannel for optimum performance.
使用TcpChannel来达到最优化的性能。
Use the TcpChannel in trusted server scenarios.
在信任的服务器场景中使用TcpChannel(译注:因为自定义宿主,如控制台程序,windows服务等没有内置的身份验证机制,而且自定义宿主为了提高性能一般都用TcpChannel,所以你一半应该在不考虑身份验证的时候使用自定义的宿主,一般是在内网服务与服务之间的调用。如果要实现自定义宿主的身份验证,需要你自己开发自定义的Sink来实现安全机制,关于扩展remoting,可以参看idior的有关remoting的帖子)。

Formatters
Use the BinaryFormatter for optimized performance.
使用BinaryFormatter达到最好的性能。
Consider Web services before using the SoapFormatter.
在使用SoapFormatter前考虑使用Web服务。
 
按引用(Marshal)封送还是按值封送
Use MBR (marshal by reference) when the object state should stay in the host application domain.
当对象状态保存在主机应用程序域的时候使用按引用封送(marshal by reference)(译注:比如一个对象引用本地的一个文件或者数据库连接,或者网络连接,它们的状态只在本机的应用程序域里,这时候要用MBR,让别人用代理访问它们,如果按值封送的话就是拷贝一份状态传送给客户端,但这些状态只在本机有效,就会出错)。
Use MBR when you need to update data frequently on the server.
当你需要在服务器上经常更新数据的时候使用MBR(marshal by reference)(译注:如果用按值封送的话,每次调用都会对整个对象进行序列化和反序列化,这很耗费性能,而用按引用封送就会提高性能,代理会在服务器的应用程序域里marshal数据)。
Use MBR when the size of the object is prohibitively large.
当对象的大小不会太大的时候使用MBR(译注:如果对象很大,使用MBV就因序列化而耗费很大的性能,相反,用MBR就可以只通过网络获取需要的数据下来,而不是整个很大的对象,从而提高了性能)。
Use MBV (marshal by value) when you need to pass object state to the target application domain.
当你需要传递对象状态到目标应用程序域的时候使用MBR (marshal by value)。(译注:如果对象很小而且很容易的在应用程序域间传递,就用MBV,这样就没有必要每次调用方法都会通过透明代理跨越进程边界或者应用程序域边界去改变真实对象,这样减少了边界之间的来回交互)
Use MBV when you do not need to update data on the server.
当你不需要在服务端更新数据的时候使用MBV(marshal by value)(译注:这个很容易理解,真实对象都是只读的,那就把对象都传递给客户端,让它用呗,否则每次获取对象的状态都会跨越边界通信)。
Use small MBV objects when you need to update data frequently on the server.
当你需要经常在服务端上更新数据的时候使用小的MBV(marshal by value)对象(译注:把大的服务端对象拆分成多个小的MBV对象来更新服务端的数据,可以减少marshal和unmarshal的资源消耗,特别是那种non-blittable(表示在封送的时候需要对象的内存存储,http://msdn.microsoft.com/en-us/library/75dwhxf7(VS.80).aspx)类型的数据。该条和本节第二条要权衡考虑,要权衡对要更新的数据不断的序列化反序列化耗费的性能大,还是对要更新的数据进行不断的marshal和unmarshal耗费性能。)。
 
序列化和封送。
Consider using a data facade.
考虑使用数据的外观(译注:facade模式大家应该都理解,一个对象可能有多个状态,可以把这些状态分成几组,只给客户端返回客户端关心的那组状态就行,这样比序列化整个对象的所有状态性能好)。
Marshal data efficiently and prefer primitive types.
有效的封送数据尽量使用基元类型(译注:跨越remoting边界的调用昂贵而且很慢,所以尽量只传递你需要的数据,如果这个数据你自己本地简单计算一下就能得到,就别去远程调用了。尽量使用基元类型或结构,因为对他们的序列化和封送耗费的性能都相对较小)。
Reduce serialized data by using NonSerialized.
使用NonSerialized特性来减少序列化的数据(译注:可以把一定对象里不需要序列化的字段用该特性标记)。
Prefer the BinaryFormatter.
尽量使用BinaryFormatter(译注:性能好)。

你可能感兴趣的:(.net)