Restringir a largura de banda / velocidade do arquivo de download no Servlet

temos aplicação java de alta carga que funciona em modo de cluster.

Eu preciso adicionar capacidade de baixar e fazer upload de arquivos para nossos clientes. Para armazenar arquivos eu estou indo para o usuário gridFs, não tenho certeza, é a melhor escolha, mas o mongo pode ser armazenado em cluster e o mongo pode replicar dados entre os nós do diff. Isso é exatamente o que eu preciso.

Um grupo diferente de usuários deve ser limitado com largura de banda diferente. Com base em algumas regras de negócios, devo restringir a velocidade de download para alguns usuários. Eu vi poucas soluções para isso

A maioria deles funciona da mesma maneira.

  • Leia bando de bytes
  • Fio do sono
  • Repetir

O Mongo simplesmente me fornece InputStrem e eu posso ler desse stream e gravar no stream de saída do servlet. Não tenho certeza se é uma abordagem válida. Também tenho medo de que os usuários possam criar muitos encadeamentos simultâneos durante o download e prejudicar o desempenho.

Poderia ser um problema para o contêiner servlet?

Se pode ser um problema, como pode ser evitado? provavelmente usando nio?

Eu prefiro usar a solução Java pura.

Qualquer ajuda será muito apreciada.

Os algoritmos de bucket com checkbox ou de token com vazamento podem ser usados ​​para controlar a largura de banda da rede.

EDIT: eu fiz alguns prototipagem rápida e implementou o algoritmo alavancando o processamento asynchronous de Servlet 3.0. Os resultados são muito bons. O código fonte completo pode ser encontrado no GitHub . Diverta-se!

Também tenho medo de que os usuários possam criar muitos encadeamentos simultâneos durante o download e prejudicar o desempenho.

Poderia ser um problema para o contêiner servlet?

Sim, poderia.

Se pode ser um problema, como pode ser evitado? provavelmente usando nio?

A NIO não ajudará por si . Certamente não impedirá que as respostas de baixa largura de banda atinjam segmentos por longos períodos de tempo.

Eu acho que o que você precisa fazer é implementar downloads em um contêiner de web especial. Não tenho certeza, mas acho que o Servlet 3.0 com o modo asynchronous pode fazer o truque.