Pergunta

I''m atualmente girando com um aplicativo que tem uma configuração correspondente a seguinte analogia bate-papo:

  • um bate-papo é um objeto que é mantido na memória e contém uma lista de bate-papo mensagens
  • um bate-papo é processado em várias janelas do navegador e as atualizações são puxado com a4j: impulso

Os olhares instalação programática como este: uma instância de um objeto de bate-papo com ele é mensagem é compartilhada entre a página de escopo componente costura em diferentes sessões. Agora, quando quaisquer mensagens de sessão uma nova mensagem, ou seja, modifica o objeto bate-papo, todos os componentes de costura deve ser notificado da nova mensagem para que o novo estado pode ser retransmitido para a interface do usuário em todos os clientes.

Eu posso pensar de três maneiras de conseguir isso:

  1. eventos de costura com o ID de chat como um parâmetro e verificações, em seguida, cada componente da ID e ou atualizações ou ignora a mensagem
  2. JMS Filas ou um JMS tópico onde cada componente listenes sobre com um filtro para apenas é de chat
  3. um mecanismo puro ouvinte Java no objeto de bate-papo compartilhada, ou seja, cada componente Seam registra a ele e a notificação é java puro e direto

Por uma questão de argumento assumir o número de bate-papo do é grande (dezenas de milhares) e o número de usuários de bate-papo é pequeno (digamos 2-10).

Como é que cada performance escala sábio? Você tem outras sugestões de como fazer isso com Seam e um bom desempenho?

A meu ver, (1) seria integrado e limpo, mas eventualmente você iria notificar dezenas de milhares de componentes, onde apenas alguns realmente necessitam. Por isso provavelmente não irá escalar.

(2) seriam integrados e depende apenas do desempenho do provedor JMS (que pode ser trocada) e também trabalho em um ambiente de cluster, sem modificações. Eu não tenho certeza sobre o desempenho de JMS aqui, ou seja, são algumas centenas de mensagens por segundo e milhares de ouvintes com diferentes filtros muito ou não?

(3) seria rápido, porque apenas os componentes necessários seria notificado ea notificação é java puro e direto. No entanto, podem surgir problemas de concorrência / acesso porque algo cruz sessão / componente / thread é feito.

Para (1) e (3) uma solução que suporta agrupamento teria de ser adicionado manualmente, se necessário, em algum ponto.

Foi útil?

Solução

Eu recomendo 2). Eu também recomendaria o corte JMS fora da equação - mesmo que ele vai permitir-lhe mudar de mensagens provedores também farão lhe impedir de usar os recursos mais avançados do seu sistema de mensagens. Se você estiver usando um banco de dados Oracle AQ faria uma escolha sensata (suporta JMS btw.). Caso contrário, eu recomendo usar AMQP que deve estar disponível através JBoss Messaging ou uma solução de terceiros como RabbitMQ .

Uma vez que você tem claramente um problema de mensagens que você deve optar por usar uma solução de mensagens.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top