2011-08-24 4 views
6

다양한 스트리밍 소스에서 여러 JSON 문서를 가져 오는 MongoDB 컬렉션이 있습니다. 다른 말로하면 일련의 MongoDB 컬렉션에 계속해서 데이터를 삽입하는 여러 프로세스가 있습니다.MongoDb 실시간으로 (또는 거의 실시간으로) 삽입 된 데이터 스트리밍

MongoDB에서 다운 스트림 응용 프로그램으로 데이터를 스트리밍하는 방법이 필요합니다.

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

또는이 : 그래서 개념이처럼 보이는 시스템을 원하는

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

어떻게 지속적으로 데이터베이스를/폴링 쿼리하지 않고 몽고에서 데이터를 스트리밍 할되는 문제?

확실한 질문에 대한 대답은 "래빗, 제로 또는 액티브 MQ와 같은 대기열에 메시지를 보내려면 해당 앱 스트리밍 프로세스를 변경하지 말고 Mongo 스트리밍 프로세스와 몽고에 즉시 보내야합니다":

이상적인 세계에서는
    MONGODB 
        /|\ 
        | 
App Stream1 -->  |   ---> MongoD Stream1 
App Stream2 --> SomeMQqueue ---> MongoD Stream2 
App Stream3 -->    ---> MongoD Stream3 

예 그것은 좋은 것입니다,하지만 우리는, 메시지는 먼저 저장되도록 중복을 피하고 몽고는 지속성과 중간에 앉아있다 ID를 모두 등이 생성되어 있는지 확인 몽고 필요 층.

그럼 GridFTP를 사용하지 않는 Mongo 컬렉션에서 다운 스트림 앱으로 어떻게 메시지를 스트리밍합니까? 기본적인 사고 방식은 새 문서를 폴링하고 수집 된 각 문서를 처리하는 타임 스탬프를 저장하는 SQL 테이블의 프로세스 플래그와 마찬가지로 데이터베이스에 저장된 JSON 문서에 다른 필드를 추가하여 업데이트합니다. 나는. 처리 된 문서에 대한 1 초마다 == null .... add processed = now() .... 문서를 업데이트합니다.

더 계산 방법이 더 효율적입니까?

FYI - 이들은 모두 Java 프로세스입니다.

건배! 당신이 덮인 모음 (또는 컬렉션)를 작성하는 경우

답변

3

, 당신은 스트림에 새로운 데이터를 추진하기 위해 tailablecursor을 사용하거나이 밖으로 스트리밍 할 수있는 곳에서 메시지 큐에 있습니다. 그러나 이것은 제한되지 않은 콜렉션에서는 작동하지 않습니다.

+0

감사합니다. 안타깝게도 캡슐화 된 콜렉션을 사용하지는 않지만 메시징 서비스에서는 좋지 않습니다. 처리 된 플래그 및 폴링에 대한 인덱스와 같은 소리가 유일한 옵션입니다 ... 인덱스 항목이 여전히 인덱스에서 참조되는 경우 또는 null에 대한 쿼리가 여전히 컬렉션 스캔을 의미합니까? – NightWolf

+1

또는 나는 캐시처럼 고정 된 크기의 동작으로 제한 량이있는 콜렉션을 가질 수 있습니다. 그런 다음 아이템을 하나의 구매에서 꺼내 일반 콜렉션으로 되돌립니다. 문제는 앱 실행 사이에 위치 커서를 어떻게 저장합니까? 나는 우리가 Mongo 자동 생성 _id 필드를 사용하고 그 ID 필드보다 큰 모든 것을 선택한다고 가정하고있다. 모든 mongo가 _ID를 증가 순서로 생성 하는가? – NightWolf

+1

인덱스는 'null'에 대한 항목을 저장합니다. capped 콜렉션을 테일 링하는 경우, 마지막으로 보았던 엔트리를 저장해야한다. (원하는 경우 저장할 수 있으며 다른 몽고 콜렉션을 사용하면된다.)'$ min을 사용하여 그 요소에서 커서를 시작한다. '와'skip (1)'을 다시 시작합니다. http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24minand%24max – dcrosta

관련 문제