"Singleton" Distribuído

Olá Pessoal!

Tenho uma aplicação distribuída Java EE e tenho uma classe que é um singleton e armazena informações. No JBoss isto funciona bem, porém em outros servidores de aplicações que podem utilizar várias VMs isto pode dar problema (e por isto mesmo não é recomendado o uso de variáveis estáticas junto com EJBs).

Minha pergunta é: como fazer para colocar este objeto disponível via JNDI para que qualquer aplicação possa a ter acesso ao mesmo objeto (um singleton entre várias VMs)?

Qualquer outra sugestão é bem vinda!

[]s

Cara… é uma situação complicada… eu mesmo já li bastante sobre isso e não consegui chegar a uma conclusão.

Não temos como fugir do fato de que para existir um singleton para N JVMs ele deve estar em apenas uma delas. (A não ser que seja um “clustered-singleton” hehe)

Dai você pode seguir vários caminhos. Já li sobre implementar usando RMI. Acho que é um caminho que pode ser melhor avaliado e que é possível.

Acho que não tem problemas em ter variáveis estáticas em um servidor RMI porque ele não roda em um container.

Achei outra coisa interessante

Como colocar objetos na arvore JNDI


Use JNDI to share objects between different virtual machines

Já trabalhei em um Sistema Distribuído, que tinha vários sub-sistemas que trabalhavam em conjunto.
Havia a necessidade de saber os usuários logados em todos os outros subsistemas, sendo assim, foi definido uma Central de Usuários (Singleton), que ficava apenas em um Servidor “Central”.
Todos os subsistemas acessavam essa central através de um SessionBean que acessava o singleton e fazia as operações de inserção/remoção/alteração.

Um Singleton sendo acessado por um SessionBean não resolve ?

Isso precisa ser um singleton mesmo? Para ssitemas distribuídos escaláveis ter este tipo de recurso é extremamente complicaco, o ideal é uma arquitetura o mais stateless possível.

Que tal um cache distribuído como memcached?

para sistemas distribuidos, isso nao se torna um anti-pattern??

Disponibilizar 1 objeto em uma arvore JNDI para várias VMs é um anti-pattern?

Olá Pessoal!

Obrigado a todos por sugestões e comentários!

Meu problema é o seguinte: eu tenho um componente no servidor que envia remotamente (via JMS ou RMI Callback) notificações para listeners nos clientes quando ocorrem modificações em algum objeto (foi inserido, foi excluido, foi atualizado e etc…). Estes objetos se registram para receberem notificações e é justamente esta informação que eu quero armazenar…

Se eu utilizar um banco para colocar estas informações e tornar meu componente stateless, acho que eu acabaria perdendo muito em desempenho, mesmo pq os componentes se registram e desregistram toda hora… Cache distribuído? Talvez alguma coisa do tipo, mas não é bem um cache… A informação poderia ser distribuída e não ficar em apenas um singleton, mas acho que isto poderia trazer uma complexidade desnecessária. Alguém tem alguma referência para indicar neste sentido?

Já imprimi o artigo sobre registro de objetos no contexto JNDI, e acho que pode ser bem útil!!! Assim que conseguir algum resultado mando um feedback aqui no fórum!

Valeu!!!

[quote=felipecruz]Disponibilizar 1 objeto em uma arvore JNDI para várias VMs é um anti-pattern?

[/quote]

Acho que ele se referiu ao singleton… Acho que sua observação realmente faz sentido, porém se pensar bem, um banco de dados é um componente “singleton” em uma arquitetura (a não ser que use bancos distribuídos também).

Minha idéia é ter um componente de armazenamento de dados, só que em memória… Este componente também poderia distribuir seus dados entre vários componentes similares, porém isto traria uma série de possíveis erros (concorrência, falta de sincronização e etc)…

As vezes faz sentido ter um componente “singleton” em uma arquitetura distribuída, porém deve-se ter ciencia das limitações que isto acareta.