服务器端处理还是客户端处理?

4
我已经为在印度销售的任何产品开发了一个比较网站。目前,该网站完全是客户端:-
  1. 接受用户输入。
  2. 进行20-30个AJAX请求并从所有主要在线商店获取结果。
  3. 使用一些客户端脚本对结果进行排序并以最合适的方式展示。
缺点:-
  1. 我的客户端代码可供所有人使用。它是JavaScript。
  2. 更容易出现浏览器错误。
  3. 不够健壮。
将其变为服务器端后的缺点:-
  1. 考虑到我的网站流量,服务器负载将增加,因为它将与客户端长时间占用。
  2. 从各个网站获取值可能需要多达10秒钟。服务器在此期间被占用。考虑高峰时每分钟有500名访客的负荷。
优点:-
  1. 我的代码是安全的。
  2. 客户端处理将最少化。即使在移动设备上也能轻松工作。
我想在实际实施之前分析这些问题。有人能建议我应该为我的网站选择什么?哪种方法对我来说更好?
如果我的问题不明确,请留言。

1
只是出于好奇……像eBay这样的网站抓取数据是否合法? - iJade
你正在进行网络爬虫,看看Snapdeal的服务条款吧。 - IdidntKnewIt
2个回答

3
首先,这是一个很好的问题。关于你的应用是否能够扩展,完全取决于你的网站处理的交易量。如果你真的想让你的应用程序扩展,那么我希望你从一开始就做得正确!
不要把业务逻辑放在客户端 不要期望用户在进行比较操作时会消耗大量网络带宽,并且不要期望用户拥有最好的带宽。
服务器负载均衡 确保你的服务器群集被正确地负载均衡,并且使用多个线程而不是单个线程进行比较操作。
缓存结果 如果你正在服务器端进行操作,并且用户A和用户B要求进行相同的比较,你可以从缓存中获取用户B的比较结果,而不是再次进行请求。
易用性 向用户显示比较进度,而不是仅显示加载图标。
希望以上信息对你有所帮助。

1
我正在努力将其转换为多线程设计。您能详细说明如何进行缓存吗?我们现在没有使用任何数据库,我们从目标网站抓取数据,处理并显示,全部在6-7秒内完成。 - Prashant Singh
@PrashantSingh,你们的服务器农场是什么样的?你们应用程序背后的技术是什么? - Chandra Sekhar Walajapet
这是一个简单的PHP程序,它使用CURL来获取网页内容。从获取到的数据中,我们抓取出结果。 - Prashant Singh
我建议将处理后的数据缓存,而不是缓存CURL的结果。你可以尝试查看这个链接来学习如何在PHP中使用缓存:http://php-html.net/tutorials/creating-a-simple-php-cache-script/ 但我建议你使用像Memcache这样的缓存提供者,这样你的扩展等问题也会更容易解决。 - Chandra Sekhar Walajapet

1

我不明白为什么你会认为“更容易出现浏览器错误”。如果你向浏览器发送正确的库/代码,Javascript将按照你想要的方式运行。

你可以看到浏览器正在请求什么,并发送正确的代码(即:如果你有一些在Firefox和Opera中可用但在IE中不可用的代码,请编写两个版本的代码,分别针对每组浏览器。)有一些库可以帮助你这样做。

此外,比较不应该在服务器端完成。因此,如果你的网站流量很大,客户端工作应该足够处理这种情况。

关于代码保护,你是正确的。服务器端不会让任何人读取你的代码。因此,你必须决定服务器负载是否比人们阅读你的代码更重要。

还要记住,你可以混淆你的代码。我知道这不是最好的解决方案,但它可以防止很多人阅读它。

编辑:

将其放在服务器端将使所有设备都按预期工作(正如你已经说过的那样)。 但是,你需要做一些事情来保持服务器的负载不超过100%。

Chandra Sekhar Walajap已经告诉您使用某种缓存结果的好处。我个人会更进一步,因为您只是在抓取所有这些页面。

我会创建一个爬虫,每24小时运行一次,并获取/ 抓取每个产品。然后我会将所有这些产品保存在某个地方(读作数据库或任何您想要的地方)。这样,当用户请求比较A和B产品时,您无需从所有网站获取/ 抓取所有内容,而只需在保存它们的位置查找这些产品并向用户显示它们。

请注意,仅当有很多用户比较很多产品时,才能节省大量带宽。

另一方面,如果您只有少数用户仅搜索少量产品,则制作此类解决方案对您没有任何好处,因为您知道,每24小时从所有网站获取所有内容都会消耗大量CPU和带宽。

关于服务器负载:我不能确定。这取决于许多因素,几乎不可能说。您需要考虑您正在“抓取”的网站有多大,每个网站有多少产品?您使用的是什么硬件设备?最好通过使用cURL制作一些简单的示例,从其中一个站点获取所有内容,然后查看其对性能的影响并进行决策。

1
我在IE浏览器中遇到了几个问题。例如,为了同时发出20-30个Ajax请求,我需要使用CORS来避免阻塞。但这种方法并不被许多旧版浏览器支持。而按顺序调用将会大幅降低我的引擎性能。 - Prashant Singh
如果你想支持非常老的浏览器(FYI,IE8有一些基本的CORS支持),你唯一的选择是在服务器端进行。 - alexandernst
你能给我一个关于服务器负载的估计吗?并在更新你的答案时提供一些在进行服务器端实现时需要遵循的提示吗? - Prashant Singh

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