《Effective C#》读书笔记——条目28:提供粗粒度的互联网API<使用C#表达设计>
在使用Web服务、.NET远程调用或给予Azure的程序时,最耗时的就是与远程服务器之间传输过程。如果只是简单的将本地API封装一下,就变成远程使用的API,这样做功能上不会有问题,但是效率低下。API的粒度越细所花费在等待数据返回的额外事件也就越多。
在创建基于Web的服务时,客户端和服务器的通信过程应该向发送传真一样:客户端可以独立、不需要与服务器取得联系的情况系下工作一段时间。然后在一次通信所需要的所有数据就位之后,再让客户端一次性把所有信息发送给服务器。服务器端也应该如此:将数据从服务器发送给客户端时,应该一次性的发送所有内容,让客户端能完成当前所有的任务。
现在让我们做一个假设:该系统仅有一个服务端,还有超过100万的客户。假设每个客户在去年一年中平均进行十五次订购。每个电话销售都在订购过程中操作一个客户端,且在接听电话的过程中需要查询或创建客户。我们该如何设计出一个最有效的客户端和服务器端传递的一系列对象呢?在这里一次性的将每个客户和每个订单发给客户端是不现实的:100万客户和1500万的订单记录对应的数据实在是太多了。
设计与远端计算机通信的Web服务时,我们希望同时降低通信的频率以及每次通信时传递的数据量。这两个目标是鱼和熊掌不可兼得的,我们必须在这二者之间取得平衡。我们应该进尽量不要走向两个极端,但可适当选择较少通信次数,并尽量一次传输更多的数据。