Criei um pequeno sistema web em .net aqui na minha empresa e a coisa está tomando uma proporção séria. Inicialmente era um pequeno sistema onde um funcionário lançava avaliações dos clientes. Coloquei login e um módulo que enviava emails ao boss toda vez que uma nova avaliação era lançada. Depois me pediram para criar uma ficha de cadastro para novos clientes. E como a solução tem sido vista com bons olhos, o pessoal está pensando em agregar mais funções a este sistema.
Entretanto, ocasionalmente preciso corrigir um bug ou melhorar algo no sistema de cadastro e, como é um sistema único, preciso compilar tudo e o sistema todo fica fora do ar.
Quero recomeçar tudo, usando Java e MVC. Já conheço razoavelmente Java por estar terminando a faculdade de sistemas de informação, comprei bons livros e estou lendo-os para montar um sistema organizado que no futuro pode se tornar grande, mas esta história de ser um único sistema me incomoda. Queria poder ter vários sistemas compartilhando login, sistema de mensageria, aparência visual e que se caso um sistema precisasse de manutenção, tirá-lo do ar não interferiria em outros que estão funcionando. Não acredito que grandes sistemas sejam assim. Ou são?
Alguém com mais experiência pode me dizer por onde devo seguir e o que pesquisar?
Uma opção interessante que você deve avaliar então é o OSGi, já que seu problema é o tempo que seu sistema fica fora do ar nas atualizações.
Com OSGi você projeta seu sistema como módulos (bundles), que podem ser carregados e recarregados em tempo de execução. Quando houver alguma novidade, basta adicionar um novo bundle ou substituir um existente sem que você precise reiniciar sua aplicação. No caso, o módulo pode até ficar fora do ar, mas vai ser um tempo mínimo e provavelmente não vai ser percebido pelos seus usuários finais.
Se você tiver um sistema de redundância para as aplicações web, enquanto você estivesse atualizando uma das instâncias, a outra estaria de pé servindo aos usuários. Já utilizei algo semelhante num sistema de grande porte com EJB. O load balance entre as aplicações web era administrado pelo HaProxy.
A opção que o kicoloco passou utilizando o OSGi é interessante , pois o módulos se plugam ao sistema , porém você também pode pensar em algo do tipo: você teria um sistema principal que controlasse os sistemas, acessos, perfil , menu, sub-menu , url, etc…
Neste sistema principal, bastaria você cadastrar seu novo sistema ou módulo , fazer o deploy , enfim é uma outra maneira de se fazer o que você precisa , lembrando que neste caso para cada módulo seria um sistema ou sub-sistema (módulo financeiro (contabilidade, faturamento), compras, rh e por ai vai) ou usar EJB, enfim tem bastante opção , mas te aconselho por experiência a não pensar em coisas mirabolantes , faça o que os usuários vão utilizar efetivamente … você esta correto em pensar na arquitetura agora…bons códigos …
[quote=Aleksandro]A opção que o kicoloco passou utilizando o OSGi é interessante , pois o módulos se plugam ao sistema , porém você também pode pensar em algo do tipo: você teria um sistema principal que controlasse os sistemas, acessos, perfil , menu, sub-menu , url, etc…
Neste sistema principal, bastaria você cadastrar seu novo sistema ou módulo , fazer o deploy , enfim é uma outra maneira de se fazer o que você precisa , lembrando que neste caso para cada módulo seria um sistema ou sub-sistema (módulo financeiro (contabilidade, faturamento), compras, rh e por ai vai) ou usar EJB, enfim tem bastante opção , mas te aconselho por experiência a não pensar em coisas mirabolantes , faça o que os usuários vão utilizar efetivamente … você esta correto em pensar na arquitetura agora…bons códigos …[/quote]
[quote=Aleksandro][quote=Aleksandro]A opção que o kicoloco passou utilizando o OSGi é interessante , pois o módulos se plugam ao sistema , porém você também pode pensar em algo do tipo: você teria um sistema principal que controlasse os sistemas, acessos, perfil , menu, sub-menu , url, etc…
Neste sistema principal, bastaria você cadastrar seu novo sistema ou módulo , fazer o deploy , enfim é uma outra maneira de se fazer o que você precisa , lembrando que neste caso para cada módulo seria um sistema ou sub-sistema (módulo financeiro (contabilidade, faturamento), compras, rh e por ai vai) ou usar EJB, enfim tem bastante opção , mas te aconselho por experiência a não pensar em coisas mirabolantes , faça o que os usuários vão utilizar efetivamente … você esta correto em pensar na arquitetura agora…bons códigos …[/quote]
uma correção kicolobo desculpe-me …[/quote]
Jamais o perdoarei…
Ou, interessante este tópico: no caso de uma aplicação clusterizada, como vocês garantem que no momento de atualização somente a versão nova do código seja executada e não a antiga acidentalmente no momento de atualização?
No meu caso o que não poderia acontecer era o codigo novo rodando em um server sem que antes todos estivessem atualizados…
O que faziamos era parar metade dos web containers e application servers (o chaveamento era realizado automaticamente pelo HaProxy e Win 2K3 respectivamente), atualizavamos a aplicação, subiamos os servidores atualizados, paravamos os com a aplicação antiga e realizavamos o processo de update delas.
Como o HaProxy transferia a sessao do usuario de um server para o outro durante o chaveamento, o alteração para os usuários logados era imperceptivel. O restante dos dados vinha da base de dados, logo a questão do chaveamento não influenciava em nada.
[quote=kicolobo]
Ou, interessante este tópico: no caso de uma aplicação clusterizada, como vocês garantem que no momento de atualização somente a versão nova do código seja executada e não a antiga acidentalmente no momento de atualização?[/quote]
O App Engine (PaaS) cuida pra mim. Ele disponibiliza uma lista de versões deploiadas e eu ativo a que eu quiser (default). Isso simplifica o processo de rollback caso eu tenha algum problema com o update do app. Além disso, é possível bater em uma versão não default colocando a tag da versão antes da url (v100.xxxx.appspot.com).
[quote=kicolobo][quote=Aleksandro][quote=Aleksandro]A opção que o kicoloco passou utilizando o OSGi é interessante , pois o módulos se plugam ao sistema , porém você também pode pensar em algo do tipo: você teria um sistema principal que controlasse os sistemas, acessos, perfil , menu, sub-menu , url, etc…
Neste sistema principal, bastaria você cadastrar seu novo sistema ou módulo , fazer o deploy , enfim é uma outra maneira de se fazer o que você precisa , lembrando que neste caso para cada módulo seria um sistema ou sub-sistema (módulo financeiro (contabilidade, faturamento), compras, rh e por ai vai) ou usar EJB, enfim tem bastante opção , mas te aconselho por experiência a não pensar em coisas mirabolantes , faça o que os usuários vão utilizar efetivamente … você esta correto em pensar na arquitetura agora…bons códigos …[/quote]
uma correção kicolobo desculpe-me …[/quote]
Jamais o perdoarei…
Ou, interessante este tópico: no caso de uma aplicação clusterizada, como vocês garantem que no momento de atualização somente a versão nova do código seja executada e não a antiga acidentalmente no momento de atualização?[/quote]
kkkk …boaaaa … então no nosso caso , nossas aplicações não eram clusterizadas e sim o banco de dados , no qual era oracle e havia o load balance …é claro que tinhamos alguns cuidados para saber as instâncias e sessões que estavam ativas no bd e tal …mas também tinhamos algumas pol[iticas nas atualizações das aplicações , exatamente para evitarmos algum constrangimento por parte dos usuários … é como eu disse é interessante pensarmos na arquitetura agora …porém devemos sempre pensar no trivial para o momento … porque evolução da arquitetura se aprende com experiências anteriores …opinião pessoal …rs…