EJB - JMS - Filas ou tópicos?

5 respostas
B

Estou trabalhando/estudando em um projeto EJB que usa filas e tópicos (persistidos) e agora preciso retirar persistência do tópico.
Motivo: O MDB que lê do tópico persistido está muito lento pois muitos registros são gravados em pouco tempo.

Como funciona:
1 - Existe um processo que manda mensagens para uma fila…
2 - Essa fila encaminha a mensagem para um tópico persistido que será consumido por outro MDB.

Problema:
1 - Demora pra consumir os dados do tópico.

Proposta:
1 - Pensei em retirar o tópico persistido e colocar em filas (vão ser consumidas mais rapidamente).
- Problema: Se um ouvinte cair ou até mesmo o servidor vou perder os dados pois os mesmos não serão mais persistidos (vou ter que correr o risco).

Dúvidas:
1 - Se um ouvinte da fila cair vou ter como recuperar a mensagem?

  • O conceito de “Durable” serve também para queues?
    • Como armazenar as informações em memória até que o ouvinte retorne e consuma o dado da fila.
      2 - Qual o melhor a ser usado, filas ou tópicos (não persistidos, claro) e porque???

Desculpe-me se fui idiota em algumas perguntas/dúvidas mais estou estudando a pouco tempo e preciso fazer isso o mais rápido possível.
Obrigado a todos.

5 Respostas

A

braian:
Estou trabalhando/estudando em um projeto EJB que usa filas e tópicos (persistidos) e agora preciso retirar persistência do tópico.
Motivo: O MDB que lê do tópico persistido está muito lento pois muitos registros são gravados em pouco tempo.

Como funciona:
1 - Existe um processo que manda mensagens para uma fila…
2 - Essa fila encaminha a mensagem para um tópico persistido que será consumido por outro MDB.

Problema:
1 - Demora pra consumir os dados do tópico.

Proposta:
1 - Pensei em retirar o tópico persistido e colocar em filas (vão ser consumidas mais rapidamente).
- Problema: Se um ouvinte cair ou até mesmo o servidor vou perder os dados pois os mesmos não serão mais persistidos (vou ter que correr o risco).

Dúvidas:
1 - Se um ouvinte da fila cair vou ter como recuperar a mensagem?

  • O conceito de “Durable” serve também para queues?
    • Como armazenar as informações em memória até que o ouvinte retorne e consuma o dado da fila.
      2 - Qual o melhor a ser usado, filas ou tópicos (não persistidos, claro) e porque???

Desculpe-me se fui idiota em algumas perguntas/dúvidas mais estou estudando a pouco tempo e preciso fazer isso o mais rápido possível.
Obrigado a todos.

braian, vou tentar te responder algumas coisas. Se estiver falando bobagem o pessoal ai me corrige.]
Usar fila ou tópico? Depende. A fila notifica apenas um consumidor. Quando um consumidor consumir a mensagem ela será extinta e ninguém mais lerá. É algo assim: quem ler primeiro leva. Não é indicado caso você precise fazer notificações para consumidores diferentes, que fazem coisas diferentes com essa mensagem. Vamos supor que voce tenha um sistema de cadastro, e quer informar que foi efetuado um cadastro pro seus sistemas de envio de email e de cobranca. Cada um teria um proposito diferente. Entao ambos devem ler a mensagem. Nesse caso a fila não é indicada, pois se algum dos consumidores ler a mensagem primeiro ela será eliminada da fila e o outro não a lerá. O tópico vem para justamente resolver esse problema. Entao se voce tem apenas um tipo de consumidor, e espera ter apenas esse tipo de consumidor no futuro proximo, use filas. Caso contrário use tópicos.
Durable serve para filas também. Mas lembre-se do que eu disse: quem ler primeiro leva, entao a mensagem será considerada descartada.

Quanto a isso não se preocupe, o container fará isso pra voce. A mensagem ficará disponivel até que alguem leia. No caso de uma fila. No caso do tópico ela ficará disponivel para que todos os consumidores a leiam. Não estou certo mas acho que existe um tempo máximo em que essa mensagem fica no tópico. Se nao me engano isso depende da implementação do container.

braian:
Proposta:
1 - Pensei em retirar o tópico persistido e colocar em filas (vão ser consumidas mais rapidamente).
- Problema: Se um ouvinte cair ou até mesmo o servidor vou perder os dados pois os mesmos não serão mais persistidos (vou ter que correr o risco).

Quanto a seu problema de performance, de uma olhada no seu hardware, de uma olhada na implementacao do container. De uma olhada em como está configurando essa persistencia. Tente otimizar ao maximo.
Verifique esse tipo de coisa antes de tomar a decisao de não persistir as mensagens. Se o seu nengocio requer esse tipo de persistencia, utilize-a. Pense bem antes de “correr riscos”.

Espero ter ajudado!

B

andre2k2:
braian:
Estou trabalhando/estudando em um projeto EJB que usa filas e tópicos (persistidos) e agora preciso retirar persistência do tópico.
Motivo: O MDB que lê do tópico persistido está muito lento pois muitos registros são gravados em pouco tempo.

Como funciona:
1 - Existe um processo que manda mensagens para uma fila…
2 - Essa fila encaminha a mensagem para um tópico persistido que será consumido por outro MDB.

Problema:
1 - Demora pra consumir os dados do tópico.

Proposta:
1 - Pensei em retirar o tópico persistido e colocar em filas (vão ser consumidas mais rapidamente).
- Problema: Se um ouvinte cair ou até mesmo o servidor vou perder os dados pois os mesmos não serão mais persistidos (vou ter que correr o risco).

Dúvidas:
1 - Se um ouvinte da fila cair vou ter como recuperar a mensagem?

  • O conceito de “Durable” serve também para queues?
    • Como armazenar as informações em memória até que o ouvinte retorne e consuma o dado da fila.
      2 - Qual o melhor a ser usado, filas ou tópicos (não persistidos, claro) e porque???

Desculpe-me se fui idiota em algumas perguntas/dúvidas mais estou estudando a pouco tempo e preciso fazer isso o mais rápido possível.
Obrigado a todos.

braian, vou tentar te responder algumas coisas. Se estiver falando bobagem o pessoal ai me corrige.]
Usar fila ou tópico? Depende. A fila notifica apenas um consumidor. Quando um consumidor consumir a mensagem ela será extinta e ninguém mais lerá. É algo assim: quem ler primeiro leva. Não é indicado caso você precise fazer notificações para consumidores diferentes, que fazem coisas diferentes com essa mensagem. Vamos supor que voce tenha um sistema de cadastro, e quer informar que foi efetuado um cadastro pro seus sistemas de envio de email e de cobranca. Cada um teria um proposito diferente. Entao ambos devem ler a mensagem. Nesse caso a fila não é indicada, pois se algum dos consumidores ler a mensagem primeiro ela será eliminada da fila e o outro não a lerá. O tópico vem para justamente resolver esse problema. Entao se voce tem apenas um tipo de consumidor, e espera ter apenas esse tipo de consumidor no futuro proximo, use filas. Caso contrário use tópicos.
Durable serve para filas também. Mas lembre-se do que eu disse: quem ler primeiro leva, entao a mensagem será considerada descartada.

Quanto a isso não se preocupe, o container fará isso pra voce. A mensagem ficará disponivel até que alguem leia. No caso de uma fila. No caso do tópico ela ficará disponivel para que todos os consumidores a leiam. Não estou certo mas acho que existe um tempo máximo em que essa mensagem fica no tópico. Se nao me engano isso depende da implementação do container.

braian:
Proposta:
1 - Pensei em retirar o tópico persistido e colocar em filas (vão ser consumidas mais rapidamente).
- Problema: Se um ouvinte cair ou até mesmo o servidor vou perder os dados pois os mesmos não serão mais persistidos (vou ter que correr o risco).

Quanto a seu problema de performance, de uma olhada no seu hardware, de uma olhada na implementacao do container. De uma olhada em como está configurando essa persistencia. Tente otimizar ao maximo.
Verifique esse tipo de coisa antes de tomar a decisao de não persistir as mensagens. Se o seu nengocio requer esse tipo de persistencia, utilize-a. Pense bem antes de “correr riscos”.

Espero ter ajudado!

andre2k2, infelizmente eu tenho que correr o risco… o consumidor do tópico persistente é MUITO LENTO porque antes de buscar um outro registro ele passa por vários avaliadores de regras.

  • Outra dúvida, uma queue durable não significa dizer que ela é persistente correto?
  • Ela ficaria gravada em memória aguardando ser consumida?
A

Acho que a persistência você configura no container. Ela pode ser durável e persistir em memoria, disco, banco. Se será em memoria ou disco por exemplo você configura no conteiner. O Jboss por exemplo persiste em disco de uma forma muito bacana e bem otimizado já. Se o sistema for linux, melhora ainda mais.

J

Tenta ver se todas as mensagens recebidas sao validas, se devem ser realmente enviadas para esse topico.
Com certeza definindo um Message Selector melhor vae fazer que somente as mensagens importantes cheguem
a esse topico, evitando trafego desnecessario.

Desculpe a falta de acentuacao. Estou sem permissao de configuracao.

B

johnny quest:
Tenta ver se todas as mensagens recebidas sao validas, se devem ser realmente enviadas para esse topico.
Com certeza definindo um Message Selector melhor vae fazer que somente as mensagens importantes cheguem
a esse topico, evitando trafego desnecessario.

Desculpe a falta de acentuacao. Estou sem permissao de configuracao.

As mensagens recebidas pelo tópico são válidas.
O problema é a grande quantidade e a lentidão devido o tópico ser persistido.

Criado 30 de outubro de 2011
Ultima resposta 31 de out. de 2011
Respostas 5
Participantes 3