.NET
Cloud Native e Cloud Agnostic
para rodar .NET em qualquer Cloud
ou sem Cloud sempre de forma profissional!
Últimas publicações
O dado é do usuário, não é seu, nem do sistema!
Parece um conceito banal, mas vou contar uma história atual, muito recente e vou contar o reflexo disso operacionalmente. É mais um daqueles casos em que a "boa vontade" é traduzida em processo e procedimentos equivocados que geram mais problemas do que soluções. O contexto Recentemente lancei um...
Do WCF para ASP.NET Core Web API com Docker no Linux 2/2
Agora é hora de mostrar como podemos tirar proveito dos contratos (interfaces) existentes para promover essa migração. Esse é o momento em que a "SOPA de LETRINHAS" ou melhor, os design patterns fazem sentido. Graças a eles, essa migração que poderia ser dolorosa e desastrosa, se torna algo fácil....
Do WCF para ASP.NET Core Web API com Docker no Linux 1/2
Não sei se você conhece WCF, rodando uma enquete eu percebi que uma parcela considerável sequer conhece WCF. Hoje vamos costurar o assunto com um outro post para que eu possa mostrar como fazer uma migração de WCF pra Web API no ASP.NET Core, rodando em containers Linux. Nosso cenário de teste é...
Sobre 1° de Agosto e o Fim do Hangouts On Air – Como resolvemos com Docker, NGINX e RTMP no Azure Container Instances
1° de agosto de 2019 foi um dia agitado. Fomos surpreendidos com a ausência do Google Hangouts On Air, mas logo reagimos às mudanças com uma solução baseada em Azure Container Instances, NGINX, Docker para fazer streaming a 60FPS em 1080p!!! Streaming gamer para live de código 😎!!! Confira...
Docker Definitivo – Janela de Inscrição – JAN/2020
Todo os dias tomamos decisões das mais variadas. Dormir mais 5 minutos, pegar o celular antes de dar bom dia, fazer café? Será que dá tempo? Tomar café na rua? Ah! Maldito café de máquina! Que caminho tomar? Carro, metro, trem ou ônibus? Prestar atenção na paisagem ou ler um livro? Escutar uma...
Troubleshooting Comentado – Docker – ASP.NET Core – NGINX
Já faz muito tempo que eu queria fazer esse formato. Documentar uma ação qualquer de troubleshooting na comunidade para poder transformar em conteúdo, fazendo pausas didáticas e interrupções para poder contextualizar no formato de quebra da 4ª parede. O Felipe Bossolani, que também é moderador de...
Angular + Docker no Heroku
Heroku é um daqueles serviços de hospedagem à frente do seu tempo. É pioneiro em desenhar um modelo com foco total no desenvolvedor. Uma Heroku é uma plataforma que te dá a possibilidade de hospedar aplicações a um preço muito competitivo. Exploramos o uso de Docker no heroku para mostrar como...
Habilidades do futuro?
De um lado as guerras dos frameworks e tecnologias, de outro as guerras de skills e culturas. Cultura DevOps, Agile. Então serverless ou containers? Fullstack é um pato que não corre bem, não nada bem, e não voa bem? Aproveitei essa noite para reler as pesquisas que eu faço anualmente, onde coleto...
Rebranding
Hora de acertar a casa, rever os nomes, marcas, páginas, perfis, grupos, tudo! Fim de ano chega e está na hora de rever o que está certo, o que está errado, hora de planejar o próximo ano. No meu caso também errei e também fiz uma lambança com marcas, projetos. Impulsionei alguns, negligenciei...
Comprometa-se a tomar a melhor decisão
Todos os dias, ou quase todos, no suporte à comunidade vemos um estereótipo: Muita informação para absorver, muitos assuntos para estudar, pouco conhecimento e a busca pela "a solução ideal" em busca de um atalho para o sucesso. Essa ideia se pauta na esperança de que se fizer a escolha certa, a...
DevWeek 2019 | Canal .NET
O Canal .NET apresenta pelo 5° ano consecutivo o DevWeek. O evento começa hoje, segunda-feira e termina nessa quarta. Convidados São 4 convidados que falarão sobre Desenvolvimento Móvel, ASP.NET Core, Blazor e Prometheus! Canal .NET #completo Dessa vez, nosso time do Canal .NET está completo, sem...
Microsoft Orleans 3.0
Sobre esse lançamento vemos algumas novidades, mas eu não abordarei elas. Referenciarei alguns posts e apresentarei o projeto de demonstração que criei no github. Ainda é cedo para aprofundar no tema e lançar um texto profundo sobre Orleans. Além disso acabaria floodando o assunto pois já tem uma...
Projetos Open Source
projetos ativos e projetos antigos disponíveis para estudo
Nenhum resultado encontrado
A página que você solicitou não foi encontrada. Tente refinar sua pesquisa, ou use a navegação acima para localizar a postagem.
Entender | Analisar | Projetar | Desenvolver | Implantar | Manter
A segurança que você busca não está em um tutorialPara entender uma tecnologia é importante entender o que influenciou sua criação, o que ela faz de fato, como ela faz. Para que então se sinta seguro e confiante a respeito das decisões que está prestes a tomar.
De um lado precisamos compreender o que está sendo feito por baixo dos panos para descobrir como extrair o máximo de uma tecnologia ou, ao menos, não atrapalhar o bom funcionamento dela.
O Cloud Native .NET é uma jornada de descoberta sobre tecnologias e patterns que fazem parte da maioria dos softwares que usamos, que somos usuários e que suportam e toleram altas cargas de trabalho, de forma eficaz, eficiente e sustentável.
É primeiro entendendo o que eles fazem, que podemos descobrir oportunidades e evoluir no que fazemos…
Conheça nosso Podcast
DevShow PodcastEm 2019 resolvemos criar um podcast, o DevShow Podcast, desde lá são mais de 40 episódios com muito assunto legal, sempre com essa pegada pessoal, falando coisas sérias, mas sem o menor compromisso com a formalidade.
.NET
Nenhum resultado encontrado
A página que você solicitou não foi encontrada. Tente refinar sua pesquisa, ou use a navegação acima para localizar a postagem.
Arquitetura
[deprecated]Roadmap da Reestruturação do Oragon Architecture
[deprecated]
Olá, como vai você?
Espero que esteja tudo bem! Nesse post vou falar das mudanças previstas para o Oragon Architecture nas próximas semanas. No post Oragon Architecture – A evolução e os novos desafios eu falo da evolução ao longo dos anos e do que pretendemos fazer focando no big picture do projeto. Agora é hora de especificar os detalhes que envolvem a construção do projeto. Enfim, transformar uma ideia em resultado, para isso é necessário planejar. Abaixo vamos abordar a estratégia de migração do Oragon Architecture. Espero que goste!
[deprecated]Oragon Architecture – Por que? Pra que?
[deprecated]
Olá, tudo bom?
Vou falar um pouco do meu projeto pessoal o Oragon Architecture. Se você me acompanha, sabe que falo bastante dele, e vou aproveitar para responder algumas perguntas que já me fizeram nos últimos dias.
Já fui questionado algumas vezes porque criar um framework de aplicação, uma arquitetura relativamente gorda, baseada em geração de código com base em banco e muita configuração com Spring.Net.
Bom, primeiro, o Oragon Architecture me viabilizou criar projetos que jamais seriam possíveis sem ele, no prazo que foram realizados. Esse é o principal motivador! Com ele alguns projetos de anos, conseguem ser realizados em meses, pelo simples fato de eliminar necessidade de codificação repetitiva. Quando você se preocupa apenas com o negócio deixando de lado aspectos não funcionais, tudo fica mais fluente no dia-a-dia de desenvolvimento. Gestão de Exceptions, Tratamento de erro, gestão de conexões, leak de conexões, sessões não finalizadas, tudo isso deixa de fazer parte do seu código na medida que você passa a usar os aspectos de AOP do Oragon Architecture.
O acesso a dados é bem facilitado, usando NHibernate e FluentNHibernate. Há quem questione o modelo. Bom, tive poucas chances na vida de trabalhar com bases de dados criadas do Zero, ou chances de realizar code-first. Muitas das vezes as empresas possuem equipes de DBA`s ou AD`s que são responsáveis pela modelagem do banco. Essa foi a melhor forma de me adaptar a estes cenários. Do ponto de vista do código gerado, há uma boa riqueza de detalhes na geração de código, como a criação de padrões que podem gerar facilmente nomes fluentes para bancos cheios de regras. Como uma coluna USUA_CD_USUARIO, virar CodigoUsuario, ou apenas Codigo, da mesma forma que USUA_DT_CRIACAO pode virar DataCriacao, com o case correto também. Pluralização em PT-BR e EN-US também são features interessantes da geração de código. Isso permite gerar código de uma forma bem inteligente, muito próximo do que nós mesmo modelaríamos manualmente, contemplando relações 1xN, Nx1, NxN e 1×1.
Quanto ao Spring.Net, bom, o primeiro fator que motiva na utilização dele é o fato de injetarmos modelos de dependências completas e a riqueza de features, como AOP e seus diversos helpers para outros muitos frameworks, como Quartz, RabbitMQ. Uso o Spring.Net desde 2006, uma pesquisa no google pode mostrar isso, nesse período ainda não existia WCF, e o Spring.Net já fazia abstração completa de protocolo para WebServices, Enterprise Services (COM+), Remoting e InProcess.
Aliás, essas abstrações de protocolo`me ajudaram a ver um mundo diferente, e desde então tudo que faço abstrai sempre o protocolo de comunicação. No Oragon Architecture, temos um conjunto de abstrações para plugar serviços em filas RabbitMQ, seguindo os mesmos princípios. Você implementa suas regras de negócio, o resto fica com a arquitetura. Como será a hospedagem, envelope de mensagem In/Out, tratamento de exceções, timeout, isso tudo fica a cargo da arquitetura.
O modelo desconectado do protocolo, permite que possamos desenvolver soluções com múltiplas distribuições, e permite mudar a estratégia de deploy em minutos, saindo de WCF, para WebServices, embedded, ou usando filas RabbitMQ. São muitas possibilidades com um código apenas. Nenhuma dessas mudanças exigem mudanças nos códigos e essa é a mágica dessa arquitetura: Abdicar das decisões mais complexas pelo tempo necessário para que elas obtenham o maior grau de maturidade possível. O pipeline em cima do RabbitMQ também é excelente, permite que um fluxo completo seja dividido em steps com filas de erro e filas de processamento, viabilizando uma grande escalabilidade horizontal.
Mas não são só flores, foram muitos anos construindo o projeto, evoluindo a cada parceiro e empresa que eu passava.
Muito mudou ao longo dos anos, os aspectos de AOP não trabalhavam em conjunto, agora cooperam entre si. A cada demanda nova, novas features nascem, novos conceitos são aplicados. Me orgulho de ter feito, para a BRQ um modelo de MVC, bem próximo do que há no Web API. Quando comecei a estudar Web API, joguei muito código fora, assim como quando encontrei o TopShelf. Me orgulho muito disso pois sempre que eu puder usar algo pronto, para me fornecer uma infraestrutura robusta, vou fazê-lo.
O papel do Oragon Architecture não é recriar a roda, mas coordenar as engrenagens para que se construa software mais fácil.
Muitas vezes sou questionado sobre a performance e escalabilidade da arquitetura:
A arquitetura provê uma infraestrutura robusta para o desenvolvimento corporativo, conta com soluções mais e menos performáticas/escaláveis, mas se usarmos as soluções corretas, como cache, por exemplo, podemos escalar bem mais que soluções que usam ADO.NET para acesso a dados e código 100% inline. Ganhando infinitamente no tempo de desenvolvimento. Não há mistério, cada escolha implica necessariamente em uma renúncia, mas para cada dificuldade, há um facilitador ao lado, e com um pouco de conhecimento de arquitetura, é possível chegar ao infinito!!
Grande abraço,
espero que gostem!
Roadmap de Arquitetura – Um exemplo real
As vezes sou questionado sobre meus desenhos de arquitetura e porque criar tantas abstrações, tanta configuração e tantas dependências e frameworks de terceiros, alguns que só eu e um tibetano conhecemos. No post Como definir Arquitetura de Software, cito quais são os pensamentos primários necessários para se desenhar um arquitetura, mas vamos aplicar isso a um contexto real para exemplificar.
Tudo começa com minha chegada na atual empresa, onde encontrei um cenário extremamente complexo e difícil de se trabalhar.
- Umas 8 bases de dados (não é exagero), entre SQL Server e MySQL, cada uma seguindo dois ou mais padrões antagônicos (sim, na mesma base), diversos padrões nomenclatura. As bases não possuíam um responsável. Eram “da empresa”, não havia um dono. O acoplamento do modelo de dados era entre database/tecnologia
- Esse banco é da galera de PHP
- Já esse aqui era da galera de .NET,
- Esse outro é da galera de JAVA.
- Na prática muitos dados só faziam sentido se mesclados entre databases, entre tecnologias. Era comum precisar consultar 3 ou 4 bases para ter uma entidade completa, quando falávamos de mídia.
- Alto acoplamento entre as diversas aplicações e suas bases de dados.
- Acesso a dados
- Um parque de aplicações baseadas em .net framework 2.0, usando ADO.NET puro para escrever o acesso a dados: Manualmente.
- Uma quantidade infinita de código de acesso a dados realizando N+1 Anti-Pattern por causa da forma como o acesso a dados era escrito.
- Gerência de configuração inexistente,
- Havia um SVN, mas mal era usado para versionar de código.
- Dezenas de pequenas aplicações resultantes de copy and paste de projetos inteiros.
- Forks de uma aplicação inicial que realizava um processo batch de importação de conteúdo, extremamente importantes para o business.
- Muitas delas só rodavam na IDE, em modo debug pois um dev trocava algumas strings e executava em modo supervisionado.
- Isso não era ao acaso, ou exceção, era a forma como processávamos dados de produção no dia-a-dia.
- Nenhuma gestão de releases.
- Centenas (não é exagero) de micro-aplicações responsáveis por micro-tarefas,
- sem documentação
- sem identificação
- Algumas também sem os fontes.
- Enquanto de um lado havia uma massa de projetos que nunca haviam sido versionados antes, existia também diversos projetos que mesmo sendo versionados, não eram mais atualizados. O código ficava entre máquina do dev e servidor de produção. As vezes nem servidor de produção, porque muitas tarefas de produção eram realizadas a partir da máquina do dev.
- Todo o conhecimento tecnológico dependia exclusivamente da memória do time ou daqueles que passaram pela equipe e ainda estavam na empresa.
Dá para ver que há muito a se trabalhar nesse lugar. Né?! Ok, assim começamos.
Step 1 – Gerência de Configuração
Primeiro passo foi definir um fluxo geral de gerência de configuração e para isso foram definidas algumas regras:
Nova regra: A partir de então 100% do que fazíamos de novo deveria ser versionado.
Nova regra: 100% do que conhecemos também precisa ser versionado.
Quando eu digo 100% do que conhecemos: É porque havia um conjunto de aplicações, que não sabiam onde estavam rodando, quem controlava, quem agendava, não sabíamos quem estava de posse dos fontes, qual servidor ou equipe era responsável. Sabíamos que algo era executado, mas não sabíamos por quem e onde. Não sabíamos que alguém gerenciava aquilo ou se estava largado.
A operação da empresa dependia de algumas dessas aplicações mágicas.
Agora com algum alívio, por não ter mais medo de que HD’s queimados me tirassem o sono, poderíamos partir para a identificação e melhoria da vida das pessoas.
Step 2 – Identificação do cenário atual
Um dos processos da minha equipe, que considero dos mais importantes da empresa é a ingestão de conteúdo, por ele recebíamos milhares de XML’s e mídias(WAV, AVI) todos os dias, são diversos formatos e padrões de integração, o que nos demandava uma quantidade razoável de storage, alguns petabytes. Esse processo era composto por diversas micro-aplicações, onde cada uma era um fork de um projeto. Nesse novo projeto tínhamos um desenvolvedor gerindo esse código, uma loucura para uma pessoa só. Óbvio que daria merda em algum momento. Fiz o trabalho de entender o cenário de negócio e compreender quais são os gaps do processo atual. Entre eles estão:
- Alta segmentação das versões da base de código, cada uma com ligeiras mudanças para atender ligeiras diferenças entre parceiros.
- Alta complexidade em cada uma das aplicações que possuíam formatos de XML diferentes.
- Baixa completude no processamento do conteúdo recebido (boa parte das aplicações, ou precisava de tapas na hora de processar, ou só processava parte do XML que recebíamos)
- Alta complexidade na gestão do processo
- Falta de visibilidade do estágio de processamento e até mesmo de etapas do processo
- Nenhuma escalabilidade
- Paralelismo Moleculá (o moleco lá tentava paralelizar com braço esquerdo e direito) #piadoca
- Equipe tecnicamente desatualizada, que vivia uma Era inteira apagando incêndios
- Equipe reduzidíssima
Step 3 – Desumanizando e despersonificando o processo de ingestão de conteúdo
Como o dia-a-dia dependia de tarefas manuais, como consultar arquivos que estavam no disco em 16 storages, fazia sentido pensar em meios de eliminar o fator humano dessa equação. O fator humano aqui era o conhecimento sobre a probabilidade de encontrar um arquivo em específico, no último storage usado pelo FTP para receber conteúdo.
Eu não poderia depender da memória de um humano para tomar alguma decisão, eu precisava de dados em um ou vários bancos que pudessem ser processados para produzir outras atividades. É o princípio do processo de automação.
3.1 Unificar o formato de processamento
Durante discussões com a equipe sobre os formatos de XML que recebemos, vimos que muitos parceiros, e o mercado fonográfico em si, estava convergindo para um padrão chamado DDEX. Esse standard serve para qualquer integração de mídia imaginável (programas, músicas, vídeos, ringtones, wallpapers etc). Apostar nesse formato foi uma escolha ousada, mas trouxe muito resultado. Como o padrão é extremamente amplo e aberto, servindo a diversas finalidades, há campos demais para dados de menos. O resultado é a possibilidade de interpretação particular de cada parceiro sobre cada uma das áreas do XML.
São 8 formas diferentes de se tirar um conteúdo do ar (remover o direito de comercializar ou reproduzir uma música/vídeo em um determinado país, tempo, ou outras condições) de forma implícita ou explícita entre outras variações bem peculiares.
Apesar dessa complexidade, unificar o modelo de processamento nesse formato nos trouxe a segurança para criar uma única aplicação para processar esse conteúdo, então conseguimos ter uma visão unificada do processo, automático e escalável.
Como disse, embora a maior parte do mercado estivesse convergindo para o DDEX, ainda havia uma parcela significativa do mercado usando XML’s proprietários. Em muitos casos nós éramos vezes menor que o parceiro. Nos momentos em que éramos maiores, estávamos diante de parceiros que usavam freelancers para criar suas integrações. Isso significava de forma prática, que quem já não trabalhasse com DDEX, continuaria enviando seu formato proprietário, e era nosso papel lidar com isso.
Isso sempre esteve claro, e para lidar com isso, o processo de importação tinha a capacidade de determinar o formato original daquela integração. E nós mesmos cuidávamos dos templates XSLT para transformar formatos proprietários em DDEX.
Gerou um esforço a mais, que foi perfeitamente justificável em função da unificação do pipeline de ingestão de conteúdo.
3.2 Transformar consulta em disco em query em um database
Primeiro pensei em um database SQL para armazenar o conteúdo do XML, modelando tabela-a-tabela, mas quando estávamos próximos de modelar 100 tabelas, e não estávamos sequer na metade do mapeamento, pedi que parassem a atividade para que pudesse repensar. Já haviam empenhado algum esforço nessa mesma iniciativa alguns meses antes, mas ignorei. Julguei que o erro era meu por não estar 100% focado na atividade. Acreditei que com alguém focado no problema e com alguma supervisão técnica seria possível: Não. não era! Subestimei o padrão “dos infernos”. Era surreal, se modelássemos, seriam pelo menos 300 tabelas para gerir. Era necessário encontrar uma alternativa.
Após a desistência de bases SQL, pensei em usar uma base XML, mas nada me agradou: nem bancos baseados em XML, nada.
Então pensando muito na possibilidade, optei por usar o MongoDB para realizar essa tarefa. Como MongoDB não suporta XML, geramos conjunto de classes com base no XSD, fazendo o parser direto de XML para .NET, que em seguida é persistido diretamente no MongoDB.
O resultado foi um sucesso:
- extremamente eficiente
- agora permitindo consultas nos dados do XML.
- Indexável
- Trocando uma consultas de horas por alguns millisegundos
Foi uma excelente decisão, poupando muito tempo e facilitando muito o trabalho. Pelo fato das classes terem sido geradas com base no XSD, as garantias de formato estão todas presentes, então tenho o melhor dos mundos!
3.3 – Eliminar consultas ao FileSystem
A falta de visibilidade dos pacotes (pacotes são entregas de 1 XML de metadados com suas N mídias, mp3, mp4 etc..) e a pulverização do FileSystem era problema do passado e do presente, um agravante e complicômetro para a automação do processo de ingestão.
Analisar diretórios de servidores de produção era tarefa diária. Entenda, eram pelo menos 16 storages, onde cada pacote poderia estar em qualquer um deles, ou simultaneamente em vários deles: Fragmentado.
O processo de gestão de espaço em disco era apontar o FTP para O MESMO path relativo EM OUTRO DISCO. Todos os 16 storages possuíam as mesmas estruturas de diretórios, e o endpoint do FTP hora apontava para qualquer um desses 16 storages, de acordo com a disponibilidade de discos.
Essa disponibilidade era produzida a partir da aquisição de novos discos, novos storages, descarte de conteúdo morto.
Gerir esse caos, era complicado, pois o acesso a disco é muito custoso. Nesses storages onde petabytes eram armazenados em poucas pastas, era surreal fazer qualquer busca ou leitura. Não havia eficiência na leitura desses discos, portanto, eu precisava de alguma representação desse file system, mais rápida e eficiente. Algo como um file system virtual que consolidasse o file system físico. Pois diversas análises precisam ser feitas com base na estrutura, nos nomes do arquivos, para que pudesse tomar uma decisão sistêmica. Na prática eu precisava consolidar os pacotes fragmentados, para que no final do processo, fosse eliminada a fragmentação.
PS: Quando esse processo entrou no ar, um efeito não planejado foi que quanto mais processávamos, mais espaço em disco sobrava. Isso porque quando um FTP era movido de disco, o fornecedor reenviava os arquivos que haviam sido recebidos pela metade. Isso gerava 2 envios, um quebrado e outro completo. Bastava meu algoritmo identificar qual era o completo e qual era o quebrado. Uma simples comparação de tamanho, e uma checkagem simples de execução seria o suficiente.
Criei uma base SQL para gerir o processo com uma visão semelhante à do File System (Diretórios, arquivos, tamanho), tudo, exceto o conteúdo do arquivo em si, permitindo com queries determinar exatamente o que cada disco possui. Agora não precisamos estar em contato direto com o File System, queries em um banco SQL mostravam toda a estrutura do File System. Um processo simples fazia a sincronização periodicamente. Uma característica legal é que por mais que o pessoal de infraestrutura cuidasse do FTP da mesma forma como sempre fizeram, meu trabalho poderia ser feito de forma coesa, reduzindo os impactos dessas decisões. Por outro lado, para o processamento das tarefas, havia uma escolha de prioridade entre os discos, isso permitia que eu mesmo não sofresse com as necessidades específicas de gerir storages tão grandes.
4 – Criando um monolito projetado para a escala
A ideia aqui era criar uma infraestrutura de arquitetura robusta que facilitasse e promovesse o refactoring contínuo. Ou seja. Eu queria acabar com a ideia de puxadinhos, e de não fazer a coisa certa. Era cultural. Não fazer aquilo que precisava ser feito porque alguma dependência obscura.
O bater de asas de uma borboleta no projeto PHP (loja de músicas) fazia uma importação inteira parar.
Isso não podia acontecer mais.
4.1 Geração de Código
O Oragon Architecture foi fundamental para a criação desse modelo. Com ele geramos código de acesso a dados, para todas as bases necessárias, gerando código e configuração para NHibernate e FluentNHibernate. Como sempre: seguindo CQS, trabalhando com MySQL e SQL Server side-by-side, com múltiplos databases, hora em contexto transacional, hora somente read-only.
Agora, a ausência de um owner de cada database, não representa mais um problema tão grande assim. O banco muda, mas periodicamente geramos código a partir do banco, e é comum ver coisas mudando. O que nos afetar, diretamente e for incompatível, gera uma quebra no build: automaticamente, aumentando a segurança e resiliência na solução. Da mesma forma que geramos código com uma grande riqueza de detalhes, estamos aptos a regerar os bancos a qualquer momento, e identificar o que mudou estruturalmente no banco, bastando analisar nosso mapping com a ajuda de históricos do scm.
A briga por mudar a forma como consumiam banco era uma batalha perdida. A empresa trabalhava há anos daquela forma. Meu time era o Backoffice, ou seja, eu não era exatamente a galinha dos ovos de ouro da empresa. Quem encantava o Carlos Slim (ou seu filho, não lembro) era a loja de músicas que cuidadosamente era nutrida de features para agradar seu futuro dono.
Tudo era mais fácil do que fazer essa mudança.
4.2 AOP
Sob o framework de AOP do Spring.Net, o Oragon Architecture implementa uma série de aspectos que torna viável trabalhar com Redis, MongoDB, MySQL, DB2 e SQL Server de forma transparente e simples. Um único template é necessário para todos os bancos SQL citados. Para os NoSQL’s, não havia como gerar código, mas os aspectos (AOP) ainda eram úteis por definir a conectividade da mesma forma para todas as soluções. Do ponto de vista do código, nenhum OpenSession ou Connect é visível, apenas precisa-se marcar os métodos com os atributos corretos para que a infraestrutura cuide de todo o resto. Outro ganho direto é a resolução de connection leaks.
O descuido humano não atrapalhava mais. Agora de fato, se está funcionando, está certo, porque a arquitetura garante que só funciona se estiver certo.
4.3 Agendamento
Ainda falando do Spring.Net, jobs agendados foram criados com Quartz.Net para iniciar operações de negócio agendadas, como emissão de relatórios que anteriormente eram criados manualmente periodicamente entre outras operações recorrentes agendadas. A sincronização do File System com o banco SQL que citei acima, também era agendada aqui.
4.4 Mensageria e Exception Handling
Para escalar a solução, um pipeline foi criado em cima do RabbitMQ para processar todo o fluxo de trabalho das importações, desde a gestão (monitoramento) do file system, até a ingestão propriamente dita. Nesse modelo o Oragon fornecia as abstrações para que você só implemente as operações necessárias em cada passo do pipeline, sem que seu código saiba sequer que faz parte de um. Assim basta programar uma operação de negócio e plugar no pipeline, caso haja erro no processamento, lance suas exceptions e o próprio orquestrador (Oragon) se encarregará de colocar a mensagem na fila de erro, para que a mensagem não seja reprocessada infinitamente, com o mesmo status de erro. Geralmente os erros são de duas naturezas, ou o cliente errou no contrato ou o código encontrou uma situação não prevista, há um terceiro cenário, pouco comum que é uma falha em validação de negócio. Para essa temos um fluxo de tratamento diferenciado.
Em todos os casos, as exceptions são logadas, automaticamente, pelos aspectos Oragon Architecture, em filas RabbitMQ, isso com ajuda do pacote Spring.NET AMQP, posteriormente são armazenadas no Sentry sem causar gargalos na aplicação. Mais tarde, após inúmeros problemas, substituímos o Sentry por ElasticSearch.
4.5 Worker Process
Agora, estávamos aptos a iniciar diversos hosts de processos, para consumir uma infinidade de filas, segmentando cada operação por parceiro se assim nos interessasse (e interessava muito). Conseguimos trabalhar com diversos processos em diversas máquinas, escalando até quanto o hardware e os databases suportassem.
A arquitetura, cheia de abstrações viabilizou tomar as decisões que envolviam estratégia de deploy o mais tarde possível. Sem mudança no código.
Apenas com configurações.
Esse é o ganho trazido por uma aplicação extremamente configurável. Mas não há almoço grátis. As configurações são tão relevantes quanto o código e eram extensas. No código, não precisamos ver sequer um try-catch, e não há nada de errado nisso. Os Aspectos eram responsáveis por pela gestão e tratamento das mensagens. As operações transacionais, são geridas pelos aspectos e eles são responsáveis pelo rollback em caso de erro. As configurações eram muito mutáveis e maleáveis, mas eram de extrema importância para o fluxo (havia uma relação de dependência aqui).
Enfim, toda escolha, uma renúncia.
4.6 Continous Integration e Continuous Deploy
Para o processo de build e deploy, eu havia configurado o Jenkins, mas agora estava apanhando um bocado do TeamCity. A intenção era migrar do Jenkins para o TeamCity. Eu não me recordo se esse movimento foi concluído ou abortado.
Esse foi o roadmap do meu primeiro ano de trabalho alí. É realmente muito excitante trabalhar com essas tecnologias, não pelas tecnologias em si. Mas pela capacidade de resolver grandes problemas de forma profissional. Conseguir atender e endereçar todas essas demandas é incrível.
No final desse ano de trabalho a maior dificuldade estava no Negócio. Compreender e estabilizar as expectativas quanto ao business, que no caso de um processo de importação de metadados, é preencher as devidas tabelas, garantindo retro-compatibilidade com um parque de aplicações complexo e infinito.
Resumo
Bom, novamente, os frameworks utilizados foram utilizados para sanar necessidades reais.
Spring.Net para IoC, DI e AOP
Oragon Architecture para AOP (implementação)
Quartz.Net para Agendamentos
TopShelf para Serviços Windows (joguei um monte de código fonte fora, depois que achei esse framework)
T4 para os templates de geração de código
Spring AMQP para abstrações com RabbitMQ
Jenkins para Integração Contínua
MongoDB para armazenar XML convertido em BSON.
Nhibernate e FluentNHibernate para acesso a dados.
Redis para Lock Distribuído
RabbitMQ para controlar e distribuir processamento com resiliência.
Lembre-se das premissas:
Equipe:
Equipe reduzida.
Contexto:
GAP técnico, falta de Gerência de Configuração, e segmentação do código. Falta de padronização de recebimento de conteúdo e dificuldade de gestão de código, plataforma e manutenção.
Enfim, Arquitetura
A correlação entre as diversas peças que irão compor a solução, cada uma oferecendo uma feature de negócio.
Espero que tenha gostado!
[03/04/2018] – Revisão do Texto para melhorar a explicação sobre algumas necessidades.
[12/07/2022] – Adição de novas informações úteis para entendimento do momento. Revisão do tempo verbal adotado no texto.
Legado Versus Design – Database First e Code First
Bom, quem acompanha o Oragon Architecture ao longo dos anos, mesmo que de forma despretensiosa, em algum momento me questiona sobre algumas decisões tomadas. Vou tentar ser breve para relatar alguns dos problemas e soluções que motivaram minhas decisões. Nesse tópico, vou falar de gestão de base de dados, Code First e Database First.
Esse assunto merecia um post inteiro, mas vou ser breve e tentar resumir em poucos parágrafos.
É comum ver nas empresas aplicações sendo construídas e desligadas, a cada ciclo de troca de diretores e gerentes. A máxima é que as aplicações vão, mas os dados ficam. Dificilmente temos ou o descarte ou a total remodelagem dos dados. Sob essa ótica, em algum momento você vai se deparar com algum cenário em que precisa construir uma nova solução em cima de um banco legado. Na minha carreira dificilmente encontrei cenários diferentes destes. Outra situação comum, é encontrar grandes empresas com regras para criação de aplicações isoladas das regras de criação e gestão de banco de dados. Geralmente empresas contam com alguns DBAs e possuem uma área de banco bem estruturada, no entanto, há muito pensamento arcaico por traz de DBAs e administradores de dados. Geralmente ou hora eu era responsável pela definição do padrão de arquitetura das aplicações ou fazia parte de um time que o fazia. Nos dois casos, o dilema de trabalhar com bases legadas ou de ter uma área que estruturava banco de dados trazia dificuldade para qualquer modelagem que não se baseasse e Database First.
As aplicações vão, mas os dados ficam!
Para suportar melhor esses ambientes, a geração de código, com base em banco, foi um aliado fenomenal. Ao longo dos anos a geração de código foi melhorando e chegamos ao ponto de não precisar de nenhuma intervenção humana no processo. Basta configurar regras e pronto, todo o código nasce a partir de um banco legado. Esse é o motivador para a ênfase em database first. Pode parecer retrógrado, mas se você não está em uma startup, com certeza fará todo o sentido pensar em algo assim.
Grande abraço!
[deprecated] Oragon Architecture – A evolução e os novos desafios
[deprecated]
Para quem trabalhou comigo no BTG Pactual viu no Oragon Architecture o início do Oragon Architecture Services, que consistia em uma camada de abstração para a criação de serviços baseados em WCF, ainda configurado side-by-side com a configuração de WCF do .Net Framrwork.
Para atender às demandas da B2W Viagens, não tivemos muita evolução, mas para atender à BRQ, o host WCF do Spring foi estendido para no Oragon Architecture Services, e nesse ponto, não era mais necessário usar configurações padrão do .Net Framework para hospedar serviços WCF. Migrei a solução toda para do framework 3.5 para o framework 4.0 e criei uma infraestrutura de hospedagem dinâmica de processos, para que você não tenha de ficar criando diversos projetos, um para cada deploy. Agora você construía uma única biblioteca de serviços e um executável padrão, externo, era capaz de interagir com sua biblioteca, hospedando seus Service Facades em diversos protocolos. O deploy passava a ser apenas uma escolha entre configurações.
Sempre nessa linha de viabilizar a tomada de decisão mais tardia possível, seguimos com novas features. Cada empresa demandou algum esforço nesse projeto, visto que já faz algum tempo que aposto na visão de serviços como chave para o sucesso no quesito design.
No iMusica esse modelo atendeu muito bem, estamos usando muito toda essa infraestrutura, mas não foram só flores. Estamos hospedando aplicações gigantescas, com uma quantidade de processamento substancial. Muitas threads, muitos serviços, muitas operações simultâneas. Estamos consumindo muitos recursos de infraestrutura e aplicação, embora ainda não estejamos no máximo, vamos em alguns meses ou mesmo anos, chegar ao nível de processamento em que poucas máquinas não suportarão a necessidade de processamento demandada pelo parque.
Chegou o momento de pensar em escalar ainda mais, pensando em grid de máquinas, pensar em alocar máquinas dinamicamente, e escalar ao infinito! #SQN Claro que temos limitações, na prática se reduzirmos a quase Zero os recursos compartilhados, sim, seria possível sim.
Pensar em suprir essa demanda é algo extremamente excitante e divertido. A paixão pelo que se faz não vem por acaso, a conclusão de uma tarefa dessa magnitude é realmente um grande feito pessoal e profissional. Lado-a-lado com essa infraestrutura um marco importante para o meu trabalho no iMusica: Pensando exclusivamente em ingestão de conteúdo, estas features melhoram muito nossa perspectiva de futuro.
Fato é que estou muito excitado com o rumo do projeto e já estou desenhando um modelo de federação de processamento baseado em Worker Process distribuídos em máquinas. Não pensei com carinho suficiente, mas talvez possa até ser cross domain (para que possamos usar o melhor dos mundos, ambiente cloud local, side-by-side com cloud pública).
O modelo atual, embora tenha ajudado muito, é eficiente e eficaz quando pensamos em poucas instâncias, com gerenciamento manual. Quando pensamos em grid, e cross domain, pensamos em escalar inclusive o deploy. Por esse prisma, vejo hoje pontos de atenção quanto à utilização do modelo atual.
Hoje por exemplo precisamos nos preocupar com:
- Cuidar de cada deploy, máquina-a-máquina
- Gerenciar quantas instâncias do mesmo processos vamos rodar em cada uma dessas máquinas
- Existem processos que não podem rodar em mais de uma instância, pois ou duplicam processamento ou agridem a performance do parque
- Gerenciamento de dependência de serviços entre máquinas
Todas essas preocupações não existem quando pensamos em deploys em uma ou duas máquinas, mas quando pensamos em um parque com dez, ou vinte máquinas executando processamento pesado, esses cuidados de gestão passam a ser algo crítico. Levando em consideração que estamos consumindo muitos recursos para conseguir entregar uma solução robusta e escalável, gerenciamento não poderia em momento algum ser algo negligenciado. E admito, desde o JBoss 5, tenho o interesse em construir um servidor de aplicação, acredito que ao final desse projeto, tenha no Oragon Architecture, algo bem parecido com um Applciation Server.
Esse é um projeto que deve demandar alguns muitos meses, e muitas noites mal dormidas, e não poderia faltar, contratempos! Bom, terei muito esforço pela frente, mas é necessário, pois quero entregar com esse projeto:
- Hospedagem e gerenciamento dinâmico de serviços, com aumento e redução de Workers dinamicamente (entre máquinas)
- Hospedagem e gerenciamento dinâmico de escutas de filas (entre máquinas)
- Hospedagem e gerenciamento dinâmico de agendamentos
- Permitir deploy centralizado e distribuição automatizada entre os diversos servidores
- Permitir fácil gerenciamento entre ambientes (Quais máquinas processam quais ambientes)
- Gerenciamento facilitado de informações de log e debug.
A primeira tarefa a ser realizada é mapear os requisitos e analisar as possibilidades. Já esbocei um target, mas ainda não tracei um caminho. Ainda assim, algumas promessas já podem ser feitas:
- Continuaremos usando Spring.Net
- O código do Oragon Architecture continuirá no GitHub, open source.
- Vai possuir uma bonita e funcional interface gráfica
- Só será entregue quando estiver realmente funcional
- Continuaremos usando muito AOP
Aos que tiverem a intenção de participar da concepção e/ou desenvolvimento, as portas estão abertas!
Grande abraço!
Containers
Nenhum resultado encontrado
A página que você solicitou não foi encontrada. Tente refinar sua pesquisa, ou use a navegação acima para localizar a postagem.
Mensageria
Nenhum resultado encontrado
A página que você solicitou não foi encontrada. Tente refinar sua pesquisa, ou use a navegação acima para localizar a postagem.
Conteúdo e Posicionamento
.NET + Cloud Native + Cloud Agnostic
.NET | DevOps | Microservices | Containers | Continuous Delivery
.NET muito além do .NET
O mínimo de infra que todo dev e/ou arquiteto deveria saber
Aplicações distribuídas e comunicação entre serviços (RabbitMQ / gRPC)
Containers, Docker e Kubernetes
RabbitMQ e Mensageria e comunicação assíncrona entre aplicações e serviços
Arquitetura de Software e Arquitetura de Solução com foco no melhor aproveitamento em projetos .NET
Nossos números
Desde 2002 trabalhando com desenvolvimento de software
Desde 2002 ajudando outros devs
Desde 2010 trabalhando exclusivamente como arquiteto
Contas atingidas no telegram/facebook
Alunos
Microsoft MVP
Conteúdo Gratuito
Tudo que está aqui no gaGO.io é conteúdo gratuito, feito para ajudar desenvolvedores dos mais variados níveis.
Cursos
Tenho também alguns programas de acompanhamento. Esses programas tem a função de ajudar desenvolvedores em áreas específicas ou de forma mais abrangente na jornada do arquiteto.