解析外部XML或命中数据库是否更有效?

时间:2009-06-10 23:09:41

标签: python mysql xml django parsing

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

9 个答案:

答案 0 :(得分:6)

首先关闭 - 测量。不要只是假设一个人比另一个好或坏。

其次,如果你真的不想测量,我猜数据库会更快一些(假设数据库与Web服务相比是相对本地的)。网络延迟通常不仅仅是解析时间,除非我们说的是一个非常复杂的数据库或非常复杂的XML。

答案 1 :(得分:4)

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

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

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

启动你的应用。对数据库执行一些延迟和响应时间。现在对远程Web服务执行相同操作。除非您的数据库也在互联网上,否则您会发现存在巨大差异。

对于有能力的技术专家来说,扩展数据库,或者使用memcached和其他范例从缓存中完全删除数据库并不困难;数据中心内彼此靠近的服务器之间的延迟远远低于Internet上的机器之间的延迟(并且更安全,启动)。即使实现这种规模需要一些思考,它也在您的控制之下,与远程Web服务不同,远程Web服务的扩展和延迟对您来说完全不透明。举个例子,我不会对我的网站的可用性和响应性完全基于其他人的想法感到高兴。

最后,如果远程Web服务不可用会发生什么?想象一下这样一个世界:您网站的每个请求都涉及通过Internet向其他网站发出的请求。如果其他网站不可用会发生什么?您的用户是否会观看几个小时的旋转光标?当您的网站因这种意外的外部依赖性而烦恼时,他们是否喜欢错误5​​00?

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

答案 2 :(得分:3)

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

答案 3 :(得分:1)

在一般情况下,没有足够的信息可以确定。你为什么不做一些测试并找出答案?因为听起来你使用的是python,所以你可能想要使用timeit模块。

可能影响结果的一些事情:

  • 您正在使用的网络服务的性能
  • 您正在使用的网络服务的可靠性
  • 服务器之间的距离
  • 返回的数据量

我猜想如果它是可缓存的,那么数据的缓存版本会更快,但这并不一定意味着使用本地RDBMS,它可能意味着应用程序中的memcached或内存缓存。< / p>

答案 4 :(得分:1)

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

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

答案 5 :(得分:0)

这取决于具体情况,你必须衡量(或至少做出有根据的猜测)。

你必须考虑几件事。

网络服务

  • 它可能会打到数据库本身
  • 可以缓存
  • 它会引入网络延迟并且可能不可靠
  • 或者它可以在本地网络中,甚至比访问本地磁盘更快

DB

  • 可能会很慢,因为它需要访问磁盘(尽管数据库有内部缓存,但通常不是目标缓存)
  • 应该可靠

技术本身在速度方面没有多大意义 - 在一种情况下,数据库解析SQL,在其他XML解析器中解析XML,并且数据库通常也通过套接字进行访问,因此在任何一种情况下都需要解析和网络。

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

答案 6 :(得分:0)

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

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

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

答案 7 :(得分:0)

绝对测试。根据经验,XML适用于应用程序之间的通信,但是一旦您拥有应用程序内部的数据,一切都应该进入数据库表。这可能不适用于所有情况,但95%的时间对我而言。每当我试图以任何其他方式存储数据时(例如内容管理系统中的XML),我最终希望我能使用好的旧的sprocs和sql server。

答案 8 :(得分:0)

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

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