.NET
Cloud Native e Cloud Agnostic
para rodar .NET em qualquer Cloud
ou sem Cloud sempre de forma profissional!
Últimas publicações
Aqui estão os últimos 12 posts de mais de 500…
Docker de A a Z – Primeiros vídeos em fase de produção
Há semanas anunciei o início de uma série de vídeos sobre Docker. Após muito atraso, alguns vídeos estão entrando na esteira de produção. Os primeiro dois vídeos apresentam o setup de máquinas. Ubuntu Server 16.04 LTS tanto no VirtualBox quanto na Amazon EC2. Nestes dois casos, a intenção é trazer...
Simplificando tudo
Esse é um post rápido, uma crítica a aqueles que querem sempre simplificar tudo, de forma indiscriminada, e no final criam frankensteins conceituais. A ideia que refuto é: Vamos implantar SCRUM, mas sem ... pq não precisamos. Vamos usar RUP, mas sem... pq não é necessário. Vamos implementar SOA,...
Introdução ao Docker @ Canal .NET
No início do mês, o Renato Groffe organizou um hangout do Canal .NET onde batemos um papo superlegal sobre Docker. Renato Groffe, Gustavo Zimmermann e eu, discutimos um pouco sobre Docker, contamos um pouco da história dos containers e traçamos um guia para que você entenda mais sobre como usar o...
Docker Images – Dicas e Truques
Você já criou suas primeiras imagens, mas algo não ficou bom e teve muito trabalho? Periódicas atualizações fizeram com que gastasse um tempo não previsto para atualizar imagens?! Deseja criar imagens mas não sabe como criar imagens de forma eficiente e de acordo com as melhores práticas. Esse...
Como Docker pode influenciar sua vida hoje
Se você usa ou pretende usar Redis, RabbitMQ, WordPress, MySql/MariaDB, Postgres, Memcached, MongoDB, ElasticSearch, LogStash, Kibana, e outras soluções, plataformas ou ferramentas e não sabe como Docker vai obrigatoriamente mudar sua vida nos próximos anos, preste bem atenção. Sendo Docker ou um...
Novas tecnologias – Alguns motivos para você pensar nelas!
Ao longo dos últimos anos, venho trabalhando escalabilidade e performance de uma forma bem intensa. Já fiz algumas implantações de Jenkins para CI, uma de MongoDB que ficou muito interessante, algumas outras de RabbitMQ, ElasticSearch + LogStash + Kibana e Redis. Na maioria dos times onde realizei...
Docker – Novas imagens prontas
Você já pensou como ficaria o WordPress no php7, ou tem uma ao ou site e queria colocar um cache varnish? Que tal então, passar um otimizador na sua aplicação, reduzindo o Loader, fazendo minify, e ajustes com a tecnologia do Google? As imagens estão prontas, falta apenas documentar. Assim que...
DockerFile – Ubuntu + SSH + WebMin
[PT-BR]Não faça isso! Esse foi meu primeiro texto sobre docker, tem erros monumentais e essa não é uma boa prática. São muitas responsabilidades em um só container. Não há "depende", esse post é um ERRO CONCEITUAL, e só está presente aqui ainda para que eu lembre das besteiras que um dia escrevi!...
MonolithFirst @ Fowler, artigo comentado
Olá pessoal, hoje vou falar um pouco sobre um padrão detalhado pelo Fowler meses depois da minha saída do iMusica. Por sinal, há algo de interessante com esse padrão, pois era algo que alguns membros do meu time reclamavam e consideravam um anti-pattern. Vou aproveitar esse post vou tentar usar...
[deprecated]Oragon Architecture – estratégia para 2016
[deprecated] Quem segue esse blog conhece o Oragon Architecture, sabe pelo menos do que se trata e o que ele faz. Então vou encurtar as apresentações, pois já fiz isso em diversos posts. De fato as mudanças, no desenvolvimento de software em si, nunca foram tão drásticas e disruptivas. Não há nada...
TypeScript + Classic ASP … Why not?
As vezes algumas limitações impostas por clientes, times de arquitetura e empresas atrapalham nossas vidas. Não é fácil, nos dias de hoje, se sentir confortável em desenvolver algo com ASP Clássico. ASP pode ser facilmente considerado o cobol da Web. Com TypeScript você pode usar os recursos de...
Por onde andei, andei frustrado
O mundo está cheio de pessoas felizes, sorridentes, as redes sociais estão abarrotadas por todos os lados de adoradores de potássio(1). Acho que é hora de falar do mundo real, e de algumas frustrações. A minha ausência se dá a um caso bem complexo na carreira, quando após entregar uma plataforma...
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…
Conteúdo
Docker – Novas imagens prontas
Você já pensou como ficaria o WordPress no php7, ou tem uma ao ou site e queria colocar um cache varnish? Que tal então, passar um otimizador na sua aplicação, reduzindo o Loader, fazendo minify, e ajustes com a tecnologia do Google? As imagens estão prontas, falta apenas documentar. Assim que...
DockerFile – Ubuntu + SSH + WebMin
[PT-BR]Não faça isso! Esse foi meu primeiro texto sobre docker, tem erros monumentais e essa não é uma boa prática. São muitas responsabilidades em um só container. Não há "depende", esse post é um ERRO CONCEITUAL, e só está presente aqui ainda para que eu lembre das besteiras que um dia escrevi!...
MonolithFirst @ Fowler, artigo comentado
Olá pessoal, hoje vou falar um pouco sobre um padrão detalhado pelo Fowler meses depois da minha saída do iMusica. Por sinal, há algo de interessante com esse padrão, pois era algo que alguns membros do meu time reclamavam e consideravam um anti-pattern. Vou aproveitar esse post vou tentar usar...
[deprecated]Oragon Architecture – estratégia para 2016
[deprecated] Quem segue esse blog conhece o Oragon Architecture, sabe pelo menos do que se trata e o que ele faz. Então vou encurtar as apresentações, pois já fiz isso em diversos posts. De fato as mudanças, no desenvolvimento de software em si, nunca foram tão drásticas e disruptivas. Não há nada...
TypeScript + Classic ASP … Why not?
As vezes algumas limitações impostas por clientes, times de arquitetura e empresas atrapalham nossas vidas. Não é fácil, nos dias de hoje, se sentir confortável em desenvolver algo com ASP Clássico. ASP pode ser facilmente considerado o cobol da Web. Com TypeScript você pode usar os recursos de...
Por onde andei, andei frustrado
O mundo está cheio de pessoas felizes, sorridentes, as redes sociais estão abarrotadas por todos os lados de adoradores de potássio(1). Acho que é hora de falar do mundo real, e de algumas frustrações. A minha ausência se dá a um caso bem complexo na carreira, quando após entregar uma plataforma...
Video Tutorial – Nano Server no VirtualBox em 13 minutos
Video Tutorial No post Windows...
Tutorial – Windows Nano Server para o VirtualBox
16/11/2015 Atenção, este post foi feito no momento do lançamento do Technical Preview 2. Estou trabalhando no Technical Preview 3 para poder gerar conteúdo e apresentar alguns detalhes de como configurar e usar o Nano Server no dia-a-dia. Olá pessoal, saem aos poucos alguns artigos a respeito do...
Windows Nano Server
Olá galera, tudo bom? Dessa vez vou falar um pouco do Windows Nano Server. A nova Microsoft Nos últimos anos vemos a Microsoft repensando sua estratégia de mercado e repensando seus produtos. É incrível ver como esse gigante está conseguindo se reposicionar de forma assertiva junto ao mercado e...
WebAPI não é bala de prata
O tema Pessoal, faz alguns dias que assisti um debate interessante e muito produtivo com o tema "Serviços na plataforma .NET: WCF ou WebAPI?". Quem conduziu o debate foi a galera do AspNetCast, com a presença do Evilásaro Alves. Bom, não vou debater a respeito do cast que está aqui, minha...
[deprecated]AssemblyInfoVersionManager
[deprecated] Muitas vezes usando Jenkins para CI/CD, você deseja alterar as informações do AssemblyInfo. Nos meus projetos, sempre tenho um AssemblyInfo Global, e durante o processo de build, é mesclado com o AssemblyInfo local. Dessa forma, informações comuns a todos os projetos são mantidas em...
[deprecated]NugetTools
[deprecated] As demandas mais comuns na hora de publicar NuGet packages Você já tentou publicar algum projeto no NuGet? Se não foi uma tentativa isolada, só para testar você deve passar pelo seguinte problema: Novas referências são lançadas Você realiza o update das referências, atualizando seu...
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
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!
[deprecated]Oragon Architecture disponível no NuGet

[deprecated]
Bom,
admito que já faz algum tempo que tenho pensado em migrar as referências do Oragon Architecture para o NuGet. A direita está a lista completa de referências, armazenadas na pasta [References], uma prática bem antiga, mas extremamente eficiente.
Por diversos motivos, incluindo retrocompatibilidade, venho sofrendo com a vontade e concomitantemente com a preguiça de realizar a migração. O problema é que tenho de manter a pasta [References] para projetos antigos, e coordenar as evoluções usando sempre 2 sets de configuração. Mas, já que estou tendo trabalho para migrar o projeto de framework (do 4.0 para o 4.5.1) então essa mudança se justificou. Resolvi arregaçar as mangas nesse carnaval e realizar as migrações necessárias para usar o NuGet como repositório de referências, e aproveitei que tive esse imenso trabalho, para publicar o projeto no NuGet também! E aqui estamos, temos uma RC2 publicada no endereço https://www.nuget.org/packages/Oragon.Architecture/.
Antes de mais nada vale lembrar, que agora temos:
- Build para o framework 4.0 (usando referências em [References])
- Build para o framework 4.5.1 (usando referências do NuGet)

Espero que gostem!
[deprecated] Oragon Architecture Now On GitHub
[deprecated]
Bom galera,

movi meu projeto pessoal o Oragon Architecture para o GitHub ( https://github.com/luizcarlosfaria/Oragon.Architecture.git ). A intenção é estar mais próximo da comunidade, permitindo melhor integração com todo mundo que usa de alguma forma o projeto.
O Oragon Architecture me acompanha a muitos anos e pretendo fazer bastante material sobre ele.
Espero que gostem!
CheckOut It ( https://github.com/luizcarlosfaria/Oragon.Architecture.git )
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.









![[deprecated]Oragon Architecture – estratégia para 2016](https://gago.io/wp-content/uploads/2015/12/OragonArchitecture2016-400x250.jpg)






