2009-06-10 39 views
1

我想知道在处理返回XML的Web服务API时,是否更好(更快)每次调用外部服务并解析XML(使用ElementTree)以显示在您的网站上或将记录保存到数据库(解析一次或每天需要多次),然后进行数据库调用,以获取相同的信息。解析外部XML或命中数据库更高效吗?

回答

4

在回答这个问题时,每个人都很有礼貌:“这取决于......”“你应该测试......”等等。

的确,这个问题没有详细讨论涉及的应用程序和网络拓扑结构,但如果问题甚至被问到,那么可能是a)数据库对于应用程序是“本地”的(在同一子网上,或者同一台机器,或者内存中),以及b)web服务不是。毕竟,OP使用短语“外部服务”和“在自己的网站上显示”。短语“解析它一次或无论你每天需要多少次”也表明一组数据不会每秒都发生改变。

传统的SOA神话是网络总是可用的;更进一步,我认为网络始终可用于低延迟是个谬论。除非您自己的内部系统是废话,否则通过Internet发送HTTP查询将始终比对本地数据库或数据库集群的查询慢。造成这种情况的原因有很多:远程服务器的跳数,远程或远程无法控制的降级问题以及远程Web服务应用程序分析您的请求的内部处理时间,自己的持久性后端(又名数据库),并返回结果。

启动您的应用程序。对数据库执行一些延迟和响应时间。现在对远程Web服务也一样。除非您的数据库也在互联网上,否则您会注意到巨大的差异。

对于一个有能力的技术人员来说,扩展一个数据库或者使用memcached和其他模式完全从缓存中删除数据库并不难;在数据中心中彼此靠近的服务器之间的延迟比互联网上的机器之间的延迟小(并且更安全,可以启动)。即使实现这种规模需要一些思考,它是在你的控制之下,不像远程Web服务的缩放和延迟对你完全不透明。举个例子,我认为我网站的可用性和响应速度完全基于其他人的想法并不令人满意。

最后,如果远程Web服务不可用会发生什么?设想一个世界,每个请求到您的网站涉及通过互联网到其他网站的请求。如果其他网站不可用,会发生什么情况?你的用户是否在观看几个小时的旋转光标?他们喜欢错误5​​00,而您的网站在这种意外的外部依赖关系上发挥作用?

如果您发现自己采用的架构的基本功能取决于每个请求的远程Internet调用,请在决定是否可以承受后果之前仔细考虑您的应用程序。

+0

您是否仔细阅读过这个问题?听起来主要结果总是来自外部Web服务,所以网络中断已经是需要处理的事情了。 另外它听起来像是有问题的Web服务只是客户端主机的外部,但可能在本地事务的宏伟计划。 – StaxMan 2009-06-11 02:29:12

3

消费Web服务更有效率,因为您可以通过更多的事情来扩展Web服务和Web服务器(通过缓存等)。通过消费中间层,您还可以选择更改返回的数据格式(例如,您可以决定使用JSON而不是XML)。缩放数据库要困难得多(涉及复制等),所以一般来说,如果可以的话,减少对数据库的命中。

6

首先关闭的措施。不要只假定一个比另一个更好或更差。第二,如果你真的不想测量,我猜数据库要快一点(假设数据库相对于Web服务而言是相对本地的)。除非我们谈论一个非常复杂的数据库或非常复杂的XML,否则网络延迟通常不仅仅是分析时间。

1

在一般情况下没有足够的信息可以肯定地说。你为什么不做一些测试并找出答案?因为它听起来像你正在使用Python,你可能会想使用timeit模块。

有些事情会影响结果:

  • 性能您所使用的Web服务的
  • 可靠性的网络服务使用的是
  • 服务器之间的距离数据的
  • 金额是的返回

我猜如果它是可缓存的,缓存版本的数据将会速度更快,但这并不一定意味着使用本地RDBMS,它可能意味着像memcached或应用程序中的内存缓存中的内容。

+0

也许更重要的是:远程站点更新的频率与本地站点的访问频率。 – 2009-06-11 00:09:03

1

这取决于谁在调用Web服务?每次用户点击页面时都会调用Web服务?如果是这种情况,我建议引入某种缓存层 - 许多Web服务API都会节省每小时可以产生的点击量。

无论您选择快速解析缓存的XML还是从数据库中调用数据,都可能无关紧要(除非我们在此讨论企业扩展)。就个人而言,我宁愿做一个简单的SQL调用,而不是编写一个DOM解析器(这更容易出现异常情况)。

0

它依情况而定,你必须测量(或至少作出有教育的猜测)。

你必须考虑几件事情。

Web服务

  • 它可能击中数据库本身
  • 它可以被缓存
  • 将推出网络延迟,并可能导致不可靠的
  • ,也可能是在本地网络和比访问速度更快即使是本地磁盘

DB

  • ,因为它需要访问磁盘(尽管数据库有内部缓存,但那些通常没有针对性)
  • 应该是可靠的

技术本身并没有多大的意义在速度方面可能很慢 - 在一种情况下,数据库解析SQL,在其他XML解析器中解析XML,并且数据库通常也通过套接字进行处理,因此无论在哪种情况下都有解析和网络。

在您的应用程序中缓存数据(如果适用)可能是一个好主意。

0

正如少数人所说,这取决于,你应该测试它。

通常外部服务速度很慢,并且将它们本地缓存(在内存中的数据库中,例如使用memcached)会更​​快。但也许不是。

幸运的是,它很便宜且易于测试。

0

确定测试。作为一个经验法则,XML适用于应用程序之间的通信,但是一旦将数据存储在应用程序中,一切都应该放入数据库表中。这可能不适用于所有情况,但95%的时间对我有用。任何时候,我曾试图以任何其他方式存储数据(例如内容管理系统中的XML),我最终希望自己能够使用好的旧版sprocs和sql server。

0

这听起来像你基本上想要缓存结果,并想知道它是否值得。但如果是这样,我不会使用数据库(我假设你正在考虑关系数据库):RDBMSs不适合缓存;尽管许多人使用它们。你不需要持久性,也不需要ACID。 如果在Oracle/MySQL和外部Web服务之间进行选择,我将从使用服务开始。

相反,考虑真正的高速缓存系统;本地或不是(memcache,简单的内存缓存等)。 或者如果你必须使用数据库,使用键/值存储,BDB运作良好。将响应消息以其序列化格式(XML)存储,尝试从缓存中获取,如果没有,则从服务中解析。或者如果有一个方便和更紧凑的序列化,存储和获取它。

+0

为什么这会被拒绝?我认为这是很好的答案:) – rick 2009-06-18 01:20:56