Sugestão arquitetura

Pessoal preciso da opinião de vocês…
Estou desenvolvendo um sistema que é um servidor de comunicação. Vários hardwares vão se conectar nele por socket (TCP) enviar mensagens em um protocolo específico e durante o período em que estiverem conectados, esses hardwares podem receber mensagens também.
A parte de comunicação em si eu ja implementei usando o Apache Mina e a parte de deserialização eu ja fiz também. Para a parte de deserialização dos pacotes eu adotei a estratégia de cada entidade saber como se serializar ou deserializar.
O Apache Mina funciona com sessões, ou seja, cada equipamento conectado tem uma sessão para si. Algumas mensagens podem ser geradas no lado do servidor para ser enviadas para os equipamentos. A pergunta é, como planejar essa parte de envio de mensagens do servidor para o cliente ?
Pensei em algumas estratégias:
[list] Transformar a entidade Equipamento em uma thread que fica fazendo pooling no Banco de dados, obtendo as mensagens que lhe é pertinente. No construtor desse objeto Equipamento eu iria passar como parâmetro uma referência a sessão responsável por tratar as suas mensagens. Assim ficaria fácil enviar as mensagens.[/list]
[list] Eu ja tenho uma classe que faz o controle dos equipamentos logados no sistema. Como essa classe ja é uma thread eu poderia colocar a complexidade de procurar as mensagens nessa classe, só precisaria pensar em alguma forma de “amarrar” um objeto Equipamento com a sua respectiva sessão. Hoje eu armazeno os equipamentos logados em um Map que a chave é o código do equipamento.[/list]
Esqueci de mencionar o fato de que, pode haver mais de uma mensagem para enviar para o equipamento, a regra de negócio deve ser desenvolvida da forma que eu envie uma mensagem, aguarde o ack, e envie a próxima mensagem (se existir).

Não sei se fui muito claro, mas qualquer dúvida só postar ai pessoal.

Valeww

Vê se faz sentido pq estou meio com sono… :slight_smile:

Imagine duas classes: Equipamento e Sessão (talvez sessão seja apenas uma chave String ou int na sua implementação).
Talvez inserir no construtor a chave da sessão seja forçar barra.

A primeira fase da comunicação é uma troca de credenciais, certo?
Que tal o construtor padrão ou com alguns argumentos mínimos para identificar o equipamento.
O estado inicial do Equipamento é NOVO.
Você passa algumas credenciais pra iniciar a comunicação em um método start() que retorna a Sessão e também a armazena em uma variável interna.
O estado agora é CONECTADO.
Comunica, comunica, comunica…
Chama finish(), que encerra a conexão e o servidor libera recursos
O estado agora é FECHADO.

Do lado servidor, que tal um HashMap<Equipamento, List>?
Para melhorar o desempenho, você poderia manter um buffer de mensagens em memória.
Apenas se o equipamento demorar a consumir ele persiste em BD.

Manter todos os equipamentos conectados ao servidor não parece ser uma boa idéia, logo a sugestão do pjota é uma boa saida, ou seja, fazer com que sempre os equipamentos verifiquem se existe mensagens para ele.

Guardar as mensagens somente no hash sem persisti-las não é uma boa tb, se o volume de transações for muito alto pode utilizar uma estratégia de utilizar uma base NoSql caso alta performance for um requisito.

As mensagens que vem do equipamento para o servidor, são deserializadas, validadas e persistidas no banco até pq preciso enviar um ACK para o equipamento. Agora as mensagens que são geradas no servidor tem uma interface web que cadastra elas no banco. Eu preciso ficar fazendo poolingo no banco (não sei se esta é a melhor opção) para enviar a mensagem o mais rápido possível para o equipamento (se este estiver online). Eu gostaria da opinião de vocês no sentido de a quem eu devo delegar essa funcionalidade de fazer o pooling na base, a própria entidade equipamento pode ser uma thread e ficar fazendo isso, ou devo ter um objeto que faz esse controle ??

[quote=douglaspaulino]Manter todos os equipamentos conectados ao servidor não parece ser uma boa idéia, logo a sugestão do pjota é uma boa saida, ou seja, fazer com que sempre os equipamentos verifiquem se existe mensagens para ele.

Guardar as mensagens somente no hash sem persisti-las não é uma boa tb, se o volume de transações for muito alto pode utilizar uma estratégia de utilizar uma base NoSql caso alta performance for um requisito.[/quote]
Pensei em utilizar mesmo uma base NoSql, mas ainda me sinto meio inseguro quanto a ela. Alguns outros sistemas vão precisar interagir com a base e acho que isso requer uma atenção maior. Mas não descarto a possibilidade de utiliza-la em uma versão 2 do aplicativo. Sabe se existe algum framework no estilo Hibernate para trabalhar com bases assim ??

O problema de outra aplicação utilizar a mesma base é que provavelmente sua implementação NoSQL pode ficar desatualizada com a base de dados. O ideal seria a aplicação 2 utilizar o serviço NoSQL tb.

Respondendo… Não conheço nenhum framework do estilo do hibernate para fazer isso nao. :frowning: