在看《C++ Builder 6 SOAP/Web Service开发》中Web Service和执行效率一章中的“以一个包封装多个远程服务调用”一段,只有一小段,也没啥例子,实在不明白说得是啥。现把这段摘录下来,请高手帮偶SEE一下:
以一个包封装多个远程服务调用
虽然从前面的讨论中我们已经通过避免存取WSDL和使用THTTPRIO控件的URL特性来加快Web Service应用系统的执行效率,但是在前面的范例中,客户端从Web Service取得的真正数据使用率仍然是非常低。这当然是因为SOAP包是由XML封装的,所以在返回的结果包之中XML本身的信息便占据了一定的数量。对于前面返回信息的Web Service范例来说,返回的结果数据只是43个字节。因此不管如何调整执行效率以减少不必要的数据传递,整个结果仍然不尽理想。
对于这个情形,程序员就需要知道在设计Web Service的服务接口时,必须好好的设计其中的方法。除了不要让客户端应用程序多次调用Web Service以完成工作之外,在每一次调用Web Service的服务时也要尽量地把有用的信息在一次调用中完成,或是把多个远程Web Service调用封装在一个调用之中,以增加数据的使用率并且减少网络的Round-Trip。就像DCOM的QueryInterface一样,可以在一个远程调用的网络Round-Trip中取得多个COM对象的接口。
文章的后半段最不理解,偶把偶觉得是要点的用红色指出了。
猛禽:
这是李维的书? 他这一段的意思大致是说:在一个方法中做尽可能多的事,如将多个请求放在一起调用,并同时返回多个结果数据(通过OUT参数)。 基本上我不是太同意这个观点,因为它在一定程度上破坏了OO。 如果真的要考虑性能,就不应该用SOAP,否则如果如此文所说这样“优化”的话,将破坏系统结构的清晰性,处理不当,反而可能造成性能下降。 我的观点是优化必须适度,比如尽量避免多余的网络Round-trip,但不必过份。
令狐虫:
猛禽的话我倒不是很赞成。 诚然,如果整个系统里80%的内容需要经过这样的“优化”否则就不能使用的话,使用SOAP本身就是一个错误。 但是,在一个适合使用Web Service的场合中,考虑这样的优化还是有意义的。 事实上,这种减少IO的优化并非只是在Web Service里才需要。 以前我在东软的时候,我的老板跟我说,在数据库编程中,最重要的一点是尽量减少数据库的I/O操作,能在内存中完成的工作就在内存中完成。他展示给我们的PL/SQL语句里也有大量的结构数组。我对数据库没有太多的发言权,但是我觉得这一点还是有道理的,但是并不是说因为要在内存里操作就不需要数据库了。面对数百G的数据,数据库的作用还是很大的。 我只是想说,有些东西不能太完美化,必要的原则违反还是需要的(就像数据库里对范式的违反,有时也是必要的)。当然,破坏得满目苍痍也是不行的,那样,确实不如不用了。
猛禽:
大概是最近看《重构》看的:) 另一方面就是偶对SOAP的性能实在不是很受得了。 我也说了优化必须适度,我们的分歧应该是在这个度上: 我觉得:如果整个系统里30%的内容需要经过这样的“优化”否则就不能使用的话,使用SOAP就是一个错误。
再补充一下:SOAP和数据库是两回事。 SOAP只是一个非常非必要的选择,还有多的是其它的选择,但数据库中的性能问题,不在这种情况下优化,没有其它的选择。
再说一下范式:之所以提出范式,就是因为不用范式有很多的问题,所以一般来说还是要尽量满足范式,违反范式的唯一理由就是性能,但这样的话就同时还要考虑所带来的更新性能及数据一致性问题。这里也有一个度的权衡问题。
没有评论:
发表评论