Para agentes de IA: um índice de documentação está disponível em https://www.mongodb.com/pt-br/docs/llms.txt — as versões de markdown de todas as páginas estão disponíveis anexando .md a qualquer caminho de URL.
See how MongoDB 9.0 delivers up to 2x higher throughput.
MongoDB Branding Shape
Register now >
Menu Docs

$throttle Estágio de agregação (processamento de fluxo)

$throttle

O estágio $throttle limita a taxa na qual um processador de stream passa dados para os estágios seguintes. Use $throttle para proteger os sistemas downstream de explosões de tráfego e para permanecer dentro dos limites de taxa que esses sistemas impõem.

As intermitências podem ocorrer quando um processador de stream tira um snapshot inicial de um grande conjunto de dados, se recupera após uma interrupção ou reprocessa dados históricos. Sem um limite de taxa, essas intermitências podem sobrecarregar o sistema de destino, forçá-lo a escalar ou exceder uma cota de API de terceiros.

Um estágio $throttle tem o seguinte formato de protótipo:

{
$throttle: {
bytesPerSec: <integer>,
messagesPerSec: <integer>
}
}

O estágio $throttle recebe um documento com os seguintes campos:

Campo
Tipo
necessidade
Descrição

bytesPerSec

inteiro

Opcional

Número máximo de bytes por segundo que o estágio passa para os estágios downstream. Deve ser um número inteiro positivo.

messagesPerSec

inteiro

Opcional

Número máximo de mensagens por segundo que o estágio passa para os estágios downstream. Cada documento conta como uma mensagem. Deve ser um número inteiro positivo.

Você deve especificar pelo menos um entre bytesPerSec ou messagesPerSec. Se você não especificar nenhum dos dois, o Atlas Stream Processing retornará o seguinte erro:

$throttle requires at least one of 'bytesPerSec' or 'messagesPerSec'

O Atlas Stream Processing rastreia um limite de taxa separado para cada campo que você define. Cada limite recupera a capacidade continuamente na taxa que você configura, e o Atlas Stream Processing rastreia cada limite independentemente dos outros.

As mensagens podem passar por um estágio $throttle somente quando cada limite configurado tiver capacidade disponível para elas. Se você definir ambos os campos, ambos os limites deverão ter capacidade. Quando mais de um limite está esgotado, o estágio espera o tempo que o limite mais esgotado exige. Todos os limites recuperam a capacidade durante essa espera, portanto, um limite com um fracasso menor se recupera antes que a espera termine.

O estágio não espera um segundo inteiro antes de passar mais dados. Ele processa as próximas mensagens assim que cada limite configurado tiver capacidade suficiente para elas.

Se um único documento for maior que o limite bytesPerSec, o estágio não reterá o documento até que capacidade suficiente acumule. Em vez disso, o estágio passa o documento para o próximo estágio e espera um segundo antes de passar mais dados.

Você pode usar mais de um estágio $throttle em um único pipeline. Cada estágio limita apenas os dados que fluem por ele, o que permite aplicar limites diferentes a diferentes partes do pipeline.

Você pode usar $throttle somente no pipeline principal. Você não pode aninhar $throttle dentro de outro estágio.

A limitação desacelera o fluxo de dados pelo pipeline, o que cria uma backpressure nos estágios que precedem o estágio $throttle. Se sua origem produzir dados mais rápido do que o limite de aceleração permite, o processador ficará atrás da origem e o atraso aumentará com o tempo.

Para evitar atrasos ilimitados, defina limites que correspondam à taxa de transferência sustentada de sua origem em vez de apenas seu pico. Monitore stats.changeStreamTimeDifferenceSecs e as estatísticas de aceleração descritas em Monitoramento para confirmar que seu processador acompanha sua origem.

O Atlas Stream Processing informa as seguintes estatísticas para processadores de stream que usam $throttle:

Estatística
Descrição

throttle.throttledTimeMs

Tempo cumulativo em milissegundos que o processador passou ativamente acelerando.

throttle.throttleEvents

Número de vezes que o estágio atrasou as mensagens para permanecer dentro dos limites de taxa configurados.

O Atlas Stream Processing relata as estatísticas no nível do processador e para cada estágio. Quando um pipeline contém mais de um estágio $throttle, os valores no nível do processador são a soma dos valores por estágio. As estatísticas por estágio são stats.operatorStats.throttle.throttledTimeMs e stats.operatorStats.throttle.throttleEvents.

Para saber mais sobre estatísticas de processador de fluxo, consulte Monitoramento e Métricas de Atlas Stream Processing .

O pipeline a seguir limita os dados que um processador de fluxo grava em um tópico do Kafka a 5 MiB e 50 mensagens por segundo:

{
$throttle: {
bytesPerSec: 5242880,
messagesPerSec: 50
}
},
{
$emit: {
connectionName: "ordersTopic"
}
}

Considere um lote de 20 documentos totalizando 2 MiB. O tráfego recente usou parte da capacidade de ambos os limites:

Limite
Capacidade necessária
Capacidade disponível
Deficiente
Taxa de recuperação
Tempo de espera necessário

messagesPerSec

20

15

5

50/seg

100 ms

bytesPerSec

2,097,152

1,048,576

1,048,576

5,242,880/sec

200 ms

O estágio não pode prosseguir até que ambos os limites tenham capacidade suficiente, então ele espera 200 ms, o mais longo dos dois tempos de espera. Como ambos os limites recuperam a capacidade durante a espera, o limite messagesPerSec, que precisava de apenas 100 ms, já se recuperou quando a espera termina.