.NET:Message Queue vs直接插入MongoDB

时间:2012-04-03 13:53:48

标签: .net mongodb message-queue

我有以下用例:Web应用程序(实际上是客户端的浏览器)定期向Web服务器发送跟踪/ ping(通过XHR,JSON)。我将这些轨道存储在具有四个属性索引的MongoDB集合中。显然,这个系列会快速增长。

我有三个选择:

  1. 只需处理JSON消息并插入MongoDB即可。

  2. 获取 JSON消息并生成一个后台任务以插入MongoDB

  3. 处理JSON消息并将消息放入队列(RabbitMQ ?!) 然后让队列使用者插入MongoDB。
  4. 哪一个在大型互联网规模用例中表现最佳?我认为2-3)将有一个严重的开销,因此在开发模式下会更慢,但我无法预测2-3)真的会更好地扩展。由于会有很多行并且有一个巨大的索引,我会说如果达到某个限制,插入到MOngoDB集合中会非常慢。

    背景信息:保证每个消息/跟踪的处理并不是至关重要的,如果服务器发生故障,如果数据丢失则没问题。

2 个答案:

答案 0 :(得分:2)

我的观点 - 与#1一起去。 Singleton插入MongoDB非常快。不需要队列或后端进程。此外,基于您缺乏严格的数据持久性,如果您的MongoDB位于副本集中,您也可以在未启用SafeMode的情况下进行连接,以将开销保持在最低限度。

一些背景阅读 - 盒装冰的人甚至replaced their RabbitMQ implementation使用MongoDB。

答案 1 :(得分:2)

从我的角度来看,如果您的应用程序将承受很高的开销 并且需要扩展我会选择具有以下优点的选项#3:

  1. 由于它是一种异步方法,性能会更好。
  2. 是一种更成熟,更先进的解决方案,可以扩展(轻松构建分布式架构)
  3. 更适合支持开销(考虑到RabbitMQ是用Erlang编写的,它的一个优点是并发)。见http://en.wikipedia.org/wiki/Erlang_(programming_language
  4. RabbitMQ是一个经过验证的表演者,允许非持久的队列。这意味着当服务器停止时,消息不会持久存在并丢失。
  5. 当然,这种方法增加了开发的复杂性,因为需要更多的控制(错误处理等)