解析外部XML和查询数据库哪种更高效?

1 投票
9 回答
994 浏览
提问于 2025-04-15 12:10

我在想,当我们使用一个返回XML格式的网络服务API时,究竟是每次都直接调用这个外部服务,然后用ElementTree解析XML来显示在我们的网站上更快,还是把这些记录先解析一次后存到数据库里,然后再从数据库中获取同样的信息更好呢?

9 个回答

3

使用网络服务会更有效率,因为你可以做很多事情来提升网络服务和网络服务器的性能,比如使用缓存等。通过使用中间层,你还可以选择返回数据的格式,比如你可以选择使用JSON格式而不是XML格式。扩展数据库的难度要大得多(需要涉及到复制等复杂操作),所以一般来说,如果可以的话,尽量减少对数据库的访问。

6

首先,得先测量一下。别光凭感觉就认为哪个更好或更差。

其次,如果你真的不想测量的话,我猜数据库可能会稍微快一点(前提是数据库离你比较近,而不是远在网络另一头)。因为网络延迟通常比解析时间要长,除非我们在谈论非常复杂的数据库或者非常复杂的XML。

4

大家在回答这个问题时都很客气,比如说“这要看情况”... “你应该测试一下”之类的。

确实,这个问题没有详细说明应用程序和网络的具体情况,但如果有人问这个问题,可能有两个原因:a) 数据库是“本地”的,意思是它和应用程序在同一个网络里,或者在同一台机器上,或者在内存中;b) 而网络服务不是本地的。毕竟,提问者提到了“外部服务”和“在你自己的网站上显示”。“每天解析一次或多次”的说法也暗示了这些数据并不是每秒都在变化。

一个经典的误区是认为网络总是可用的;更进一步说,我认为还有一个误区是认为网络总是低延迟的。除非你自己的内部系统很糟糕,否则通过互联网发送HTTP请求的速度总是比查询本地数据库或数据库集群慢。这有很多原因,比如到远程服务器的跳数、你无法控制的远程端的故障或性能下降问题,以及远程网络服务应用程序分析你的请求、访问自己的数据库并返回结果所需的内部处理时间。

启动你的应用程序,测试一下数据库的延迟和响应时间。然后对一个远程网络服务做同样的测试。除非你的数据库也在互联网上,否则你会发现两者之间的差距非常大。

对于一个有能力的技术人员来说,扩展数据库并不难,或者你可以完全通过使用memcached等方法来移除数据库的缓存;在数据中心里,靠得很近的服务器之间的延迟远远小于互联网上的机器之间的延迟(而且更安全)。即使实现这种扩展需要一些思考,但这在你的控制之下,而远程网络服务的扩展和延迟对你来说完全是个黑箱。我个人不太喜欢我的网站的可用性和响应速度完全依赖于别人。

最后,如果远程网络服务不可用,会发生什么呢?想象一下,如果你的网站每个请求都需要通过互联网请求另一个网站。如果那个网站不可用,会发生什么?用户是不是要看着转圈圈等几个小时?还是会看到错误500,而你的网站因为这个意外的外部依赖而崩溃?

如果你发现自己采用了一种架构,其基本特性依赖于每个请求都要进行远程互联网调用,那在决定是否能接受这种后果之前,请仔细考虑一下你的应用程序。

撰写回答