Sugestão arquitetura

5 respostas
Guitar_Men

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

5 Respostas

pjota

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.

webdouglas

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.

Guitar_Men

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 ??

Guitar_Men

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.


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 ??

webdouglas

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:

Criado 10 de agosto de 2010
Ultima resposta 11 de ago. de 2010
Respostas 5
Participantes 3