Tópico JMS x filas


191

Eu queria saber qual é a diferença entre uma fila JMS e um tópico JMS.

A página ActiveMQ diz

Tópicos

No JMS, um Tópico implementa a semântica de publicação e assinatura . Quando você publica uma mensagem, ela é enviada a todos os assinantes interessados ​​- portanto, zero a muitos assinantes receberá uma cópia da mensagem. Somente assinantes que tinham uma assinatura ativa no momento em que o broker recebe a mensagem obterão uma cópia da mensagem.

Filas

Uma fila JMS implementa a semântica do balanceador de carga . Uma única mensagem será recebida por exatamente um consumidor. Se não houver consumidores disponíveis no momento em que a mensagem é enviada, ela será mantida até que um consumidor esteja disponível para processar a mensagem. Se um consumidor receber uma mensagem e não a reconhecer antes de fechar, a mensagem será devolvida a outro consumidor. Uma fila pode ter muitos consumidores com carga de mensagens equilibrada entre os consumidores disponíveis.

Eu quero ter 'algo' que enviará uma cópia da mensagem para cada assinante na mesma sequência em que a mensagem foi recebida pelo broker do ActiveMQ.

Alguma ideia?

Respostas:


147

Isso significa que um tópico é apropriado. Uma fila significa que uma mensagem vai para um e apenas um possível assinante. Um tópico vai para todo e qualquer assinante.


4
Alguma idéia de como o balanceamento de carga funciona para as filas em JMS ou WSO2 MB?
precisa saber é o seguinte

isso é interessante porque eu estava tentando depurar um assinante e, ao enviar um tópico, o assinante não foi chamado, mas ao enviar para a fila em que funcionava
vmrvictor

54

Os tópicos são para o modelo de publicador-assinante, enquanto as filas são para ponto a ponto.


30

Um tópico JMS é o tipo de destino em um modelo de distribuição de 1 para muitos. A mesma mensagem publicada é recebida por todos os assinantes consumidores . Você também pode chamar isso de modelo 'broadcast'. Você pode pensar em um tópico como o equivalente a um Assunto em um padrão de design do Observer para computação distribuída. Alguns provedores JMS optam eficientemente por implementá-lo como UDP em vez de TCP. Para os tópicos, a entrega da mensagem é "dispara e esquece" - se ninguém ouvir, a mensagem desaparecerá. Se não é isso que você deseja, você pode usar 'assinaturas duráveis'.

Uma fila JMS é um destino de mensagens 1 para 1. A mensagem é recebida por apenas um dos receptores consumidores (observe: o uso consistente de assinantes para 'tópico clientes e receptores' para o cliente da fila evita confusão). As mensagens enviadas para uma fila são armazenadas no disco ou na memória até que alguém as pegue ou expire. Portanto, as filas (e assinaturas duráveis) precisam de algum gerenciamento ativo de armazenamento, é preciso pensar em consumidores lentos.

Na maioria dos ambientes, eu argumentaria, os tópicos são a melhor escolha, porque você sempre pode adicionar componentes adicionais sem precisar alterar a arquitetura. Os componentes adicionados podem ser monitoramento, registro, análise, etc. Você nunca sabe no início do projeto como serão os requisitos em 1 ano, 5 anos, 10 anos. A mudança é inevitável, aceite-a :-)


27

É simples assim:

Filas = Inserir> Retirar (enviar para um único assinante) 1: 1

Tópicos = Inserir> Transmissão (enviar para todos os assinantes) 1: n

insira a descrição da imagem aqui


2
Um exemplo pode ser para uma rede social simples. Alguém 'gosta' de um post. O back-end publica um evento 'POST LIKE' no tópico. É consumido por três assinantes: notificationProcessor(envia uma notificação para o pôster), karmaProcessor(dá carma para liker e pôster), feedProcessor(move-se rapidamente para cima nos feeds das pessoas). Tudo de forma assíncrona, é claro.
Siddhartha

@ Sidarta, esta poderia ser uma resposta envolta em um exemplo, obrigado!
selem mn 20/02

8

Quanto à preservação do pedido, consulte esta página do ActiveMQ . Em resumo: o pedido é preservado para consumidores individuais, mas com vários consumidores, o pedido de entrega não é garantido.


7

Filas

Prós

  • Padrão de mensagens simples com um fluxo de comunicação transparente
  • As mensagens podem ser recuperadas colocando-as de volta na fila

Contras

  • Somente um consumidor pode receber a mensagem
  • Implica um acoplamento entre produtor e consumidor, pois é uma relação individual

Tópicos

Prós

  • Vários consumidores podem receber uma mensagem
  • Desacoplamento entre produtor e consumidor (padrão de publicação e assinatura)

Contras

  • Fluxo de comunicação mais complicado
  • Uma mensagem não pode ser recuperada para um único ouvinte

4

Se você tiver N consumidores, então:

Os tópicos JMS entregam mensagens para N de N As filas JMS entregam mensagens para 1 de N

Você disse que está "procurando ter uma" coisa "que enviará uma cópia da mensagem para cada assinante na mesma sequência em que a mensagem foi recebida pelo broker do ActiveMQ".

Então, você deseja usar um Tópico para que todos os N assinantes obtenham uma cópia da mensagem.


1

TÓPICO :: tópico é uma comunicação para muitos ... (multiponto ou publicação / assinatura) EX: -imagine que um editor publique o filme no youtub, todos os seus assinantes receberão uma notificação .... QUEVE :: queve é ​​one-to -uma comunicação ... Ex: -Quando publicar um pedido de recarga, ele passará para apenas um qreciever ... lembre-se sempre de que, se o pedido for para todos os qreceivers, ocorrerá uma recarga múltipla durante o desenvolvimento de analisar o que é adequado para um aplicativo


-1

Fila é o objeto gerenciado JMS usado para manter as mensagens aguardando o consumo dos assinantes. Quando todos os assinantes consumiram a mensagem, a mensagem será removida da fila.

O tópico é que todos os assinantes de um tópico recebem a mesma mensagem quando a mensagem é publicada.


2
As mensagens da fila serão consumidas apenas uma vez por um único consumidor, é por isso que uma fila implementa um balanceador de carga. As assinaturas de tópicos podem ser duráveis : o assinante pode receber a mensagem muito depois da publicação (se o assinante foi desligado e voltou a aparecer, por exemplo).
Gruber
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.