MongoDb实时(或接近实时)流式传输插入的数据

时间:2011-08-24 04:18:16

标签: java mongodb streaming real-time nosql

我有许多MongoDB集合,它们从各种流媒体源中获取大量JSON文档。换句话说,有许多进程不断地将数据插入一组MongoDB集合中。

我需要一种方法将MongoDB中的数据流式传输到下游应用程序中。所以我想要一个概念上看起来像这样的系统:

App Stream1 --> 
App Stream2 -->     MONGODB     --->  Aggregated Stream
App Stream3 -->

或者这个:

App Stream1 -->                 --->  MongoD Stream1
App Stream2 -->     MONGODB     --->  MongoD Stream2
App Stream3 -->                 --->  MongoD Stream3

问题是如何在不必连续轮询/查询数据库的情况下从Mongo流式传输数据?

明显的问题答案是“为什么不改变那些应用程序流式处理过程,将消息发送到像Rabbit,Zero或ActiveMQ这样的队列,然后让它们像你一样发送到Mongo Streaming进程和Mongo”:

                 MONGODB
                   /|\  
                    |
App Stream1 -->     |          --->  MongoD Stream1
App Stream2 -->  SomeMQqueue   --->  MongoD Stream2
App Stream3 -->                --->  MongoD Stream3

在一个理想的世界中,这将是好的,但我们需要Mongo确保首先保存消息,以避免重复并确保ID全部生成等.Mongo必须位于中间作为持久层。

那么我如何将消息从Mongo集合(不使用GridFS等)流式传输到这些下游应用程序中。基本思路只是轮询新文档,并且每个收集的文档都通过向存储在数据库中的JSON文档添加另一个字段来更新它,就像存储处理时间戳的SQL表中的进程标志一样。即每1秒轮询一次处理的文件== null .... add processed = now()....更新文件。

是否有更整洁/更有计算效率的方法?

仅供参考 - 这些都是Java进程。

干杯!

1 个答案:

答案 0 :(得分:3)

如果您要写入上限集合(或集合),则可以使用tailablecursor在流上推送新数据,或者在可以流出的消息队列中推送新数据。但是,这对于非上限集合不起作用。