在流量激增时查询远程Web API和本地MySQL数据库有何区别?

5
我们正在首页上实现一些代码,这些代码依赖于对每个唯一访客进行地理位置查找,我们可以选择查询地理位置Web服务(Maxmind)或下载数据库并在本地查询。服务器目前是512MB的Linode实例,并且每天只接收约1500个独立访客,但我们担心在流量激增期间会发生什么情况。
我清楚地知道本地查找会更快,但是在负载高峰期,从数据库中检索数据可能比处理附加的HTTP请求需要更多的RAM/CPU资源。显然,如果选择本地方式,则升级服务器内存很容易实现。我想象中,在每秒连接数超过一定数量后,服务器更有可能因查询其本地数据库而变得不可用,而不是Web API(当然,假设Web API服务器能够处理HTTP请求)。
如何处理偶发的流量波动而不会发生拒绝服务?请给出哪种解决方案是长期的最健壮的,以应对偶发的流量波动,例如:服务器需要能够处理高达200个连接/秒,每个连接需要一个DB查询或HTTP请求。

有人觉得这更适合放在Serverfault上吗?我不确定哪里最合适。 - Michelle
我不会把通过HTTP进行网络IO称为一种轻量级的分配工作的方式。如果它比本地查找更昂贵,我会感到惊讶。数据库可以非常高效。 - goat
但是,如果我的服务器没有准备好承受大量的流量,进行本地查找将不是非常正确的解决方案。 - Gabriel Santos
1
@GabrielSantos,你假设非本地查找对你的服务器负担较小。在大多数情况下,我对此表示怀疑,特别是如果服务器具有足够的内存。网络IO比本地IO慢几个数量级。这意味着每个Web服务器线程/进程只是坐在那里,等待缓慢的网络IO完成。整个时间,这些Web服务器进程占用的内存和资源都没有为请求提供服务。这就是拥塞,它很快就会压垮你。 - goat
你能否评论一下数据库的大小以及它的变化频率? - dan b
4个回答

1
最好的方法是运行一次负载测试,亲自看看哪种方式表现最佳。但我的直觉是,每秒200个查询并不过多,可以轻松地以您喜欢的任何方式处理。
我倾向于使用带有gis数据库的本地服务器,因为本地更便宜(没有每个查询的成本),而且单个服务器更容易更新。另外,您可以通过添加第二个服务器或配置第三方服务器来进行扩展。
我在这里找到了一些关于此设置的实际测试数字: http://blog.jcole.us/2007/11/24/on-efficiently-geo-referencing-ips-with-maxmind-geoip-and-mysql-gis/ 这是一个网络设置,其中四个客户端查询单个服务器。对于单个客户端,他报告每秒2000个查询和低于1ms的延迟。请注意,他使用mysql中内置的gis功能来达到这些数字。此外,这是2007年,因此性能现在应该更好。

让你的代码模块化和可配置化。这当然取决于编程语言,但是创建一个LookupService接口,这样你就可以创建不同的实现,而不需要改变其余的代码。如果实现调用了一个Web服务,请使终端点易于配置。如果你的服务使用与maxmind相同的URI方案和响应JSON,你可以自由地在自己的本地服务器和maxmind之间切换。


1
给定每秒200次点击,您肯定希望使用本地数据库。我怀疑任何第三方网站提供此类服务都不会处理那么多的请求,但即使他们这样做,本地数据库访问也可能比它们慢得多。
当然,您需要显着增加本地服务器的内存。请记住,现在内存非常便宜。例如,大约1年半前,我用32GB RAM和最新的CPU构建了一台Linux机器,成本不到1000美元。
每秒200次点击可能需要一个集群数据库和多个服务器。您还可以考虑使用键值存储来处理潜在的每秒数千次点击。

0

您的服务提供商按查询收费其 Web 服务。根据其网站上公布的费率,在每秒 200 次查询的情况下,您将支付...每小时 $72。您可以用这种钱购买数十个巨型专用服务器!


并且根据goat的评论,在每秒200个查询的情况下,将数据库存储在内存中的成本变得微不足道。他们的CSV转储文件大约为200 MB,因此肯定可以放入内存中。由于数据库的极度简单性,查询预计会非常轻松和快速。 - RandomSeed
如果我有200GB的数据,并且同样的数据将用于许多网站,那么哪种情况更好,是一个主服务器提供API访问还是许多MySQL服务器?谢谢。 - user1642018
@AMB 你是指200GB还是200MB? - dan b
@danb 200 GB+,2500万+条记录。 - user1642018
这里似乎有些混淆。OP正在比较查询第三方远程HTTP API与直接访问自托管数据库。决定性因素是每秒查询率,数据库大小无关紧要。我们不了解您的要求,但您需要提出一个新问题。请注意,您的问题可能不适合在此处讨论。考虑在ServerFault上提问。 - RandomSeed

0
在我的工作中,我们使用本地版本的Maxmind数据库,它是一个.dat文件,并且我们不断地查询该文件(每天大约500,000次或更多),没有任何问题。然后,我们将信息缓存到会话中,这样我们就不必为同一用户反复查询该信息。我们还有一个广告工具,它使用Maxmind数据库,然后搜索在用户10、25或50英里半径内显示的广告。
我不建议过多地使用API请求,否则他们可能会毫无预警地切断你的连接,现在你就没有地理信息了。此外,如果他们的服务器崩溃,您也将无法获得地理信息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接