Lançado o MentaQueue - Alta-performance na transferência de mensagens entre dois threads

Baseado nas idéias do Disruptor (http://code.google.com/p/disruptor) um dos projetos mais interessantes que me deparei nos últimos tempos, estou lançando o MentaQueue.

http://mentaqueue.soliveirajr.com

Basicamente é o queue mais rápido para transferência de mensagens entre um trhead consumidor e um thread produtor com as seguintes características:

:arrow: sem lock
:arrow: sem garbage
:arrow: com batching

O resultado é baixa latência e alta performance. Não é atoa que o pessoal do Disruptor afirma que eles criaram a bolsa de valores eletrônica mais rápida do mundo: http://www.lmax.com

Quem quiser ajudar no projeto entre em contato via mensagem privada. Um bom comeco, para entender bem os conceitos, seria traduzir a documentacao para o portugues. É pouca coisa e o Kawai facilita muito.

Coisa linda !

Você tem uns projetos interessantes, e antes que me esqueça, parabens !!!

Assim que puder vou baixar e estudar.

Obrigado.

Prezado saoj, parabéns, sempre trazendo projetos bacanas e muito úteis pra gente…parabéns pelo trabalho! Já baixei a bagaça e vou dar uma olhada a fundo assim que puder.

Muito interessante saoj, parabéns por mais esse ótimo trabalho!

Quem tiver uma máquina com dois processadores físicos (ou mais) e quiser rodar o teste de performance e reportar os resultados seria ótimo. Outra coisa que acho que dá para fazer é melhorar o código do producer e do consumer para ser ainda mais rápido. Também um fator que vai influir no resultado é a estratégia de espera (http://mentaqueue.soliveirajr.com/Page.mtw?name=SampleCodeWithWaitStrategy). Deve ter como alterar as configuracoes das estratégias (e as estrategias em si) e conseguir resultados melhores. Planejo tentar codificar umas wait strategies que reportam estatísticas, mas só o fato de coletar essas estatísticas já deve influenciar no resultado.

O que tenho curiosidade de fazer é rodar isso num Linux com dois processadores e PINar cada thread num processador e ver o que acontece.

[quote=saoj]Baseado nas idéias do Disruptor (http://code.google.com/p/disruptor) um dos projetos mais interessantes que me deparei nos últimos tempos, estou lançando o MentaQueue.

http://mentaqueue.soliveirajr.com

Basicamente é o queue mais rápido para transferência de mensagens entre um trhead consumidor e um thread produtor com as seguintes características:

:arrow: sem lock
:arrow: sem garbage
:arrow: com batching

O resultado é baixa latência e alta performance. Não é atoa que o pessoal do Disruptor afirma que eles criaram a bolsa de valores eletrônica mais rápida do mundo: http://www.lmax.com

Quem quiser ajudar no projeto entre em contato via mensagem privada. Um bom comeco, para entender bem os conceitos, seria traduzir a documentacao para o portugues. É pouca coisa e o Kawai facilita muito.[/quote]

Curiosidade saoj, porque diz isso: [quote]Basicamente é o queue mais rápido para transferência de mensagens entre um trhead consumidor e um thread produtor com as seguintes características:[/quote] ?

Foram executados testes com outros modelos disponíveis ? Poderia postar esses testes ? No que se baseia essa informação ? A curiosidade é porque usamos bastante queue em nosso sistema e isso me deixou intrigado, mas uso o que o Glassfish 3.1.2 disponibiliza, nada fora disso.

> Foram executados testes com outros modelos disponíveis ? Poderia postar esses testes ? No que se baseia essa informação ? A curiosidade é porque usamos bastante queue em nosso sistema e isso me deixou intrigado, mas uso o que o Glassfish 3.1.2 disponibiliza, nada fora disso.

Foram realizados testes com varios modelos, mais precisamente 7 implementacoes diferentes. Os testes estão todos lá no site, com numeros, especificacoes e resultados.

http://mentaqueue.soliveirajr.com/Page.mtw?name=MessagesBench

http://mentaqueue.soliveirajr.com/Page.mtw?name=ProducerBench

Isso é ciencia exata e não achismo. :slight_smile:

[quote=saoj]> Foram executados testes com outros modelos disponíveis ? Poderia postar esses testes ? No que se baseia essa informação ? A curiosidade é porque usamos bastante queue em nosso sistema e isso me deixou intrigado, mas uso o que o Glassfish 3.1.2 disponibiliza, nada fora disso.

Foram realizados testes com varios modelos, mais precisamente 7 implementacoes diferentes. Os testes estão todos lá no site, com numeros, especificacoes e resultados.

http://mentaqueue.soliveirajr.com/Page.mtw?name=MessagesBench

http://mentaqueue.soliveirajr.com/Page.mtw?name=ProducerBench

Isso é ciencia exata e não achismo. :)[/quote]

Sim, eu sei. Não duvidei disso, só queria achar os fontes dos testes ! :smiley:
Ótimo, vou ler sobre o mesmo ! Valeu !

Dah uma olhada lah e me fala se pegar algo errado. Claro q posso ter cometido algum erro mas o RUN estah me dando uns numeros bem legais!

O único problema atual nosso é o possível refactory em remover a implementação baseada em Filas atuais para utilizar a do MentaQueue. Teria de analisar com calma, todavia, os números tem se mostrado bem interessantes, se eles fizerem jus também a confiabilidade da entrega de mensagens, será bem interessante.

Falando nisso, o que ocorre se uma mensagem é enviada e há uma queda do consumidor ? Ela permanece em fila até ser consumida posteriormente ?
Abraços.

Para obter performances elevadas o queue tem que ser batching. Se vc olhar os testes vai ver que eu testei tb os queues em modo non-batching, o que se assemelharia mais aos queues tradicionais, (interface Queue do Java). Mesmo em modo batching o AtomicQueue ganho dos queues tradicionais.

Os testes estão testando isso. As mensagens nos testes são sequenciadas e se alguma se perder ele joga uma exception. Testei com 100 milhões de mensagens e nenhuma se perdeu. A própria implementacao assegura isso.

O queue tb se protege contra overlap do buffer circular. Testei 100 milhões de mensagens num queue pequeno (1024 entries) e não houve nenhum problema. A própria implementacao assegura isso.

Sim, só sai quando o consumidor chama poll().

Muito show.

Não conhecia o “Disruptor” depois do post comecei a ler mais sobre o assunto.

Achei alguns links legais que vou compartilhar aqui.

http://www.sectioaurea.com.br/modificador-volatile/
http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html
http://jcp.org/en/jsr/detail?id=133

Por isso cada vez mais vem aparecendo outras linguagens rodando na Plataforma Java ela é muito madura.

Sergio seria interessante colocar esse projeto no github assim contribuir ficaria mais fácil.

Parabéns pelo trabalho.

[quote=Oliveira.caio]Muito show.

Não conhecia o “Disruptor” depois do post comecei a ler mais sobre o assunto.

Achei alguns links legais que vou compartilhar aqui.

http://www.sectioaurea.com.br/modificador-volatile/
http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html
http://jcp.org/en/jsr/detail?id=133

Por isso cada vez mais vem aparecendo outras linguagens rodando na Plataforma Java ela é muito madura.

Sergio seria interessante colocar esse projeto no github assim contribuir ficaria mais fácil.

Parabéns pelo trabalho.[/quote]

Vou colocar esses links lá no site. Falando em site, o que acharam do site do projeto? O que eu mais gostei é que para documentar código eu apenas tenho que fazer:

[svn url=“http://soliveirajr.com/svn/mentaqueue/trunk/src/main/java/org/mentaqueue/BrokenFastQueue.java” /]

E o código aparece na página, ou seja, a medida que o código vai evoluindo o site acompanha sem vc fazer NADA. Uma mistura de wiki com javadoc. :slight_smile: