Do SaaS ao PaaS no Mercado Eletrônico Ricardo Pardini, qCon SP ‘13 Quem? • Ricardo Pardini, CTO, Mercado Eletrônico – Lead Developer (desde 2001) – SysAdmin – Architect – Guilty (forever) • hJp://pardini.net/blog • • • • Desde 1994! BBS > Web > SaaS > PaaS B2B: entre empresas SRM: o “contrário” do CRM Procurement: transacional: pedidos, cotações • R$ 60 bilhões/ano • 60k usuários e 100 grandes compradores • Enterprise: grandes clientes corpora[vos Enterprise?? Enterprise • “enterprise so+ware is o+en available as a suite of customizable programs” (Wikipedia) • • • • Grande necessidade de customização Integração com ERPs também customizados Restrições “técnicas” (firewalls... browsers...) No Brasil adoramos customizar SaaS: Sobware as a Service • “Era só um website...” • Single-­‐instance • MulB-­‐tenant + Funcionalidade padrão -­‐ Custo de operação e invesBmento inicial • Similar: SalesForce (1999), Basecamp (2004) Simplicidade (<2001) Comprador Pedido de Compra Cotação de Preços Fornecedor “Complexidades” • Impostos • Integrações SaaS + Enterprise • Customizar! – Mas, não era padrão? – Manter as customizações ‘vivas’ – GMUDs • Grande necessidade de recursos • Inovar! “Feature GaKng” if (gk_check('abc')) { do_abc(); } else { do_old_stuff(); } Gatekeeper (Facebook) Feature Bits (M.Fowler) Dados específicos demais ALTER TABLE pessoa ADD COLUMN corDoPagagaio VARCHAR(20); public String getCorDoPapagaio() { /* ... */ } public void setCorDoPapagaio(String cor) { /* ... */ } Atributos ao resgate Mais customizações / Limites • Scrip[ng • Processadores de filas customizados • OOP: class per client, interfaces • Limitações – Fluxos e en[dades básicas tem de ser respeitados – Disponibilidade de pessoal interno – Audits / GMUDs – Reuso PaaS: Plalorm as a Service • Infrastructure + SoluKon Stack • Heroku, Azure, Force.com, CloudFoundry, AppEngine • Serviços comuns (auth, storage) • Deploy facilitado • Cliente escreve funcionalidade ‘do zero’ • Ou, customiza pré-­‐existente PaaS no Mercado Eletrônico • Gerenciar customizações em todos os níveis – Look and Feel – Funcionalidades – Modelos de dados • Permi[r compar[lhamento de pacotes funcionais entre clientes, ou top-­‐down • Agregar funcionalidade padrão comum (CRUD, analy[cs, APIs – backend as a service) • Desenvolvimento de customizações por terceiros Arquitetura a um KM de altura Metadados Metadados Dados Código Custom Pré-­‐ definições Dados compar[lhados Customizações Composição de Aplicações em Tempo de Execução Pré-­‐definição (“padrão de mercado”) Implementações Específicas Especialização do Metadado Interfaces e Abstract Classes Metadados • Objetos de dados – Campos, [pos, validações – Similar a tabelas SQL – Eventos • Documentos – Composição de objetos – Listas e relacionamentos complexos – Handlers completos Materialização • Geração de bytecode Java – Javassist – CGLib – ASM – JSR 199: Java Compiler API • Groovy! – Completo (Generics, Annota[ons, etc) – Captura o bytecode gerado Embedded Groovy GroovyClassLoader gcl = new GroovyClassLoader(); Class clazz = gcl.parseClass("class Custom1 implements MyIntf{...}"); Object aScript = clazz.newInstance(); MyIntf obj = (MyIntf) aScript; obj.metodoDaInterface(); Funcionalidades padrão • • • • Equivalente ao Scaffolding, mas em run[me CRUD Batch Load/Export Analy[cs • API genera[on – Criação dinâmica de uma Bus do Apache CXF – REST (WADL) e SOAP (WSDL) Customização • Na materialização, capturar o bytecode gerado • Entregar ao cliente um JAR com modelos e interfaces geradas • Receber outro JAR com suas extensões e customizações – Também dynamic languages da JVM • Maven • Edição online RunKme • Classloader – Carregar bytecode gerado e customizações – Manter múl[plas versões da mesma classe • Security Manager – Controlar acessos a rede, disco, dados – Definir permissões dependendo do caller Serviços • Dependency Injec[on – Spring – Anotações JSR-­‐330 (@Inject) • • • • • • • Internacionalização/Templa[ng Mailer/No[fier Auth consumer/Provider OAuth2 Authoriza[on Logging/Audit Trail/Excep[on Logging/Metrics MVC Controllers e API extensions Embedded jBPM Engine DEMO TIME!?! Problemas...? • “Os 4 problemas”: encoding, Bmezone, dar nome às coisas, cache evicBon. • • • • Descasamento objeto/relacional (^n) PermGen! Caching: CoR/CoW vs. GC Overhead Front-­‐end autogenera[on, never good enough Obrigado!!! • Feature Ga[ng/Feature Bits – hJp://mar[nfowler.com/bliki/FeatureToggle.html – hJp://www.infoq.com/presenta[ons/Feature-­‐ Bits • Embedding Groovy – hJp://groovy.codehaus.org/Embedding+Groovy • Coda Hale, “Metrics, Metrics Everywhere” – hJp://pivotallabs.com/139-­‐metrics-­‐metrics-­‐ everywhere/