Em um mongoDB grande, tenho 2 casos de uso diferentes para leitura e 2 tipos diferentes para gravação/atualização.
- leia 1: encontre por índice -> nenhuma pergunta sobre isso. isso funciona como um encanto - desde que o índice caiba na memória/ram.
- leitura 2: lê linha por linha, como um script em lote que está lendo um arquivo de log um por um.
- write 1: insert - anexa um novo conjunto de dados ou documento.
- gravação 2: dados de atualização, endereços diretamente ou encontrados por índice.
Agora eu me pergunto se o mongoDB é capaz de "priorizar" diferentes tarefas de gravação. Eu tenho uma coleção que não exige que os dados sejam gravados e disponibilizados instantaneamente em "tempo real". Basta usar um queque lento e processar essas tarefas de escrita sem pressa. No entanto, também existem instruções de gravação que devem ser processadas o mais rápido possível e estar disponíveis com um atraso mínimo (se houver).
O mongoDB permite que eu diferencie entre gravação/atualização de alto (asap) e baixo prio (queque)?
Atualmente, não há sistema de prioridade para gravações (ou leituras, embora você possa enviar leituras para secundários) - a coisa mais próxima que você obterá é ceder. Para operações de longa duração e para operações que ele prevê que paginarão dados do disco, o MongoDB liberará o bloqueio e permitirá outras operações, essencialmente intercalando operações:
Se você quiser ter certeza de que as gravações menos importantes são limitadas de alguma forma, você pode limitá-las garantindo que sejam replicadas W=2, REPLICAS_SAFE ou gravações semelhantes (dependendo do seu driver). Veja aqui o comando por trás de tais implementações no lado do MongoDB - dê uma olhada em seus documentos de driver para o equivalente relevante lá.
http://www.mongodb.org/display/DOCS/getLastError+Command#getLastErrorCommand-%7B%7Bw%7D%7D
Haveria então um pequeno atraso enquanto a gravação aguarda a replicação para os secundários, permitindo que suas outras gravações mais importantes acertem o bloqueio de gravação.
http://www.mongodb.org/display/DOCS/How+does+concurrency+work
Em termos de futuro, com o lançamento do 2.2 em breve, você obterá bloqueio no nível do banco de dados, portanto, desde que seus 2 perfis/prioridades diferentes estejam em bancos de dados diferentes, você não deverá ter contenção de bloqueio (a contenção de IO/RAM ainda pode existir, é claro ).
Finalmente, em termos de outras coisas a serem observadas, para a leitura do tipo linha por linha, eu examinaria coleções limitadas e cursores ajustáveis - veja se eles se encaixam no seu caso de uso:
http://www.mongodb.org/display/DOCS/Tailable+Cursors