我在NodeJS中创建一个REST API,连接到MongoDB,执行MapReduce并将结果存储在不同的集合中。
代码非常简单。它需要一个用户ID,以某种方式使用某种算法获取与该用户相关的所有其他用户,然后为每个用户计算相似百分比。假设测试数据库中有50k用户,则此MapReduce大约需要200-800ms。这对我来说很理想。如果要成名并有数百个这样的并发请求,我很确定不再是这种情况了。我知道可能需要根据需要对MongoDB进行分片。
另一种情况是只做一个普通的find(),循环游标并做同样的逻辑。它需要与MapReduce相同的时间。但是,我只是想到这一点,试图在客户端(NodeJS)上进行繁重的计算,而不是像MapReduce那样在服务器端。这个想法是否有价值?我这么想,我可以在负载均衡器后面水平扩展API。
答案 0 :(得分:2)
最好是从处理每个请求并将其放入数据库的服务器中保留繁重的工作。
如果您有1000个请求,其中200个要求您执行计算,则服务器可以正常处理800个请求,只要mongo使用mapReduce或聚合进行计算。
如果您在节点服务器上手动运行计算,则所有请求都将受到必须执行繁重工作的服务器的影响。
Mongo在聚合方面也非常有效,我也可以想象mapReduce。
我最近从我的服务器上移动了大量的逻辑到mongoDB,尽我所能,它创造了一个与众不同的世界。