TechTalk - Suportando Aplicacoes Multi-tenancy Com Java EE

download TechTalk - Suportando Aplicacoes Multi-tenancy Com Java EE

of 40

description

Curso sobre mutitenancy

Transcript of TechTalk - Suportando Aplicacoes Multi-tenancy Com Java EE

  • Suportando Aplicaes Multi-tenancy com Java EE

    Rodrigo Cndido da Silva

    Consultor Java

    Setembro/2014

  • Agenda

    Modelos de Servio

    SaaS Market

    Conceitos Multi-tenancy

    Java EE + Multi-tenancy

    Segurana + Multi-tenancy

    Cloud + Multi-tenancy

    JVM Multi-tenancy

  • Modelos de Servio

  • SaaS Market

  • Multi-tenancy

    Uma nica instncia

    da aplicao

    atendendo mltiplos

    clientes (tenant)

    Contrrio da

    arquitetura de

    mltiplas instncias

  • Multi-instances vs. Multi-tenant

  • Cloud != Multi-tenancy

  • Desafios

    Separao dos dados

    Personalizao

    Controle de acesso

    Provisionamento de recursos

    Integraes

    Atualizao da aplicao

    Recuperao falhas

  • Pros and Cons

    Pros

    Reduz o custo de manuteno

    nico cdigo para todos clientes

    Aumenta a escalabilidade

    Beneficia compartilhamento recursos

    Cons

    Aumenta a complexidade

    Separao por tenant-id

    Maior risco de falhas

    Quebra da aplicao compartilhada para todos clientes

    Reduz a flexibilidade para os clientes

  • Multi-tenancy

    4 possveis nveis implementaes

    Nvel 1 (Personalizado)

    [N] aplicaes e [N] databases

    Nvel 2 (Configurvel)

    [1] aplicao e [N] databases

    Nvel 3 (Eficiente)

    [N] aplicaes e [1] database

    Nvel 4 (Escalvel)

    [1] aplicao e [1] database

  • Nvel 1 - Personalizado

    [N] aplicaes e [N] databases

  • Nvel 2 - Configurvel

    [1] aplicao e [N] databases

  • Nvel 3 - Eficiente

    [N] aplicaes e [1] database

  • Nvel 4 - Escalvel

    [1] aplicao e [1] database

  • Dica Matadora

    Sempre que possvel, escolha o

    nvel 4 de implementao

    Maior reuso

    Melhor escalabilidade

    Compartilhamento de recursos

    Facilidade de administrao

  • Java EE + Multi-tenancy

    Database

    JPA + Multi-tenancy

    Customizao UI

    JSF + Multi-tenancy

    Segurana

    Java EE 8 com suporte Cloud

  • JPA + Multi-tenancy

    EclipseLink

    Suporte a multi-tenancy @Multitenant

    Disponibiliza 3 estratgias

    @Multitenant(SINGLE_TABLE) default

    @Multitenant(TABLE_PER_TENANT)

    @Multitenant(VPD)

    Shared Cache by tenant

  • EclipseLink SINGLE_TABLE

    @Entity

    @Table(name=EMP)

    @Multitenant(SINGLE_TABLE)

    @TenantDiscriminatorColumn(name = TENANT_ID,

    contextProperty = tenant-id)

    public class Employee {

    ...

    }

    HashMap properties = new HashMap();

    properties.put("tenant.id", "707");

    ...

    EntityManager em = Persistence

    .createEntityManagerFactory(

    "multi-tenant,properties)

    .createEntityManager();

    ...

    ...

  • EclipseLink TABLE_PER_TENANT

    ...

    @Entity

    @Table(name=EMP)

    @Multitenant(TABLE_PER_TENANT)

    @TenantTableDiscriminator(type=SCHEMA,

    contextProperty="eclipselink.tenant-id")

    public class Employee {

    ...

    }

  • EclipseLink VPD

    @Entity

    @Multitenant

    @TenantDiscriminatorColumn(name = "USER_ID",

    contextProperty = "tenant.id")

    @Cacheable(false)

    public class Task implements Serializable {

    ...

    CALL DBMS_RLS.ADD_POLICY ('SCOTT', 'TASK', 'todo_list_policy', 'SCOTT', 'ident_func', 'select, update, delete'));

  • JPA Caching

    Shared Cache disabled

  • JPA Caching

    Shared Cache by tenant

  • JSF + Multi-tenancy

    Arquitetura extensvel

    Artefatos podem ser encapsulados em JARs

    Composio at runtime

    Templates

    Resource library

    Look-and-feel customization

    RenderKit

    Localization

  • JSF Facelets

    T e Facelets Gazet e

    Sit

    N avigat on

    Events

    Docs

    Forums

    About Contact Sit M ap

    Template File name _template.html

    Insertion points

    Resourcescss classes, scripts, images

  • JSF Multi-templating

    contractA

    Declared Templates Declared Insertion Points Declared Resources

    contractB

    Declared Templates Declared Insertion Points Declared Resources

    contractC

    Declared Templates Declared Insertion Points Declared Resources

    /contracts

    contractD

    Declared Templates Declared Insertion Points Declared Resources

    contractE

    Declared Templates Declared Insertion Points Declared Resources

    contractF

    Declared Templates Declared Insertion Points Declared Resources

    JAR les in WEB-INF/lib

    contractA

    Declared Templates Declared Insertion Points Declared Resources

    contractB

    Declared Templates Declared Insertion Points Declared Resources

    contractC

    Declared Templates Declared Insertion Points Declared Resources

    /contracts

    contractD

    Declared Templates Declared Insertion Points Declared Resources

    contractE

    Declared Templates Declared Insertion Points Declared Resources

    contractF

    Declared Templates Declared Insertion Points Declared Resources

    JAR les in WEB-INF/lib

    Set of available contracts

    Facelet 1 Facelet 3Facelet 2

    faces-cong.xml

  • JSF Multi-templating

  • Segurana + Multi-tenancy

    PicketLink

    Java EE security framework

    Identity Management (IDM)

    Federation support (SAML, OAuth2, OpenID)

    Social Login support

    Multi-tenancy support

  • Picketlink

  • Picketlink

    @Named

    public class RealmSelector implements

    Serializable {

    @Inject

    private PartitionManager partitionManager;

    private Realm realm;

    @Produces

    @PicketLink

    public Realm select() {

    return this.realm;

    }

    }

    @RequestScoped

    public class LoginController {

    @Inject

    private Identity identity;

    public String login() {

    this.identity.login();

    }

    public String logout() {

    this.identity.logout();

    return "/home.xhtml";

    }

    }

    public class Resources {

    public enum REALM {acme, umbrella,

    wayne}

    @Produces

    @Named("supportedRealms")

    public Enum[] supportedRealms() {

    return REALM.values();

    }

  • Cloud + Multi-tenancy

    Namespace API

    com.google.appengine.api.NamespaceManager

    Suporte aos seguintes servios

    Google Datastore

    Memcached

    Task Queue

    Search

  • Namespace API

    // Filter to set the Google Apps

    // domain as the namespace.

    public class NamespaceFilter implements javax.servlet.Filter {

    @Override

    public void doFilter(ServletRequest req, ServletResponse res,

    FilterChain chain) throws IOException, ServletException {

    // Make sure set() is only called if the current namespace is not

    already set.

    if (NamespaceManager.get() == null) {

    NamespaceManager.set(NamespaceManager.getGoogleAppsNamespace());

    }

    }

    }

    // Assuming there is a logged in user.

    namespace = UserServiceFactory.getUserService()

    .getCurrentUser().getUserId();

    NamespaceManager.set(namespace);

    NamespaceFilter

    package.NamespaceFilter

    NamespaceFilter

    /*

  • Namespace API

    Search

    // Set the current namespace to "aSpace"

    NamespaceManager.set("aSpace");

    // Create a SearchService with the namespace "aSpace"

    SearchService searchService =

    SearchServiceFactory.getSearchService();

    // Create a MemcacheService that uses the namespace "abc".

    MemcacheService explicit =

    MemcacheServiceFactory.getMemcacheService("abc");

    explicit.put("key", value); // stores value in namespace "abc"

    // Increment the count for the current namespace asynchronously.

    QueueFactory.getDefaultQueue().add(

    TaskOptions.Builder.url("/_ah/update_count")

    .param("countName", "SomeRequest"));

    Memcached

    Task Queue

  • JVM + Multi-tenancy

    Multi-tenancy no nvel da JVM

    IBM SDK JVM

    Static field isolation

    Controle by tenant

    CPU time

    Heap size

    Thread count

    File IO, Socket IO

    Limitaes

    Java Native Interface (JNI)

    JVMT (Tool interface)

    GUI Libraries (GWT, Swing, etc)

    EXPERIMENTAL !!!

  • JVM + Multi-tenancy

  • JVM + Multi-tenancy

  • Java EE 8 (JSR #366)

    Web Standards

    HTTP 2, Server-sent events (SSE), Hypermedia,

    JSF.next()

    CDI Improvements

    CDI 2, JAX-RS + CDI, MDB support

    Cloud

    Configuration API

    Multi-tenancy

    Simplified security

    REST APIs

  • Demo

  • Perguntas

  • Referncias

    http://msdn.microsoft.com/en-us/library/aa479086.aspx

    https://developers.google.com/appengine/docs/java/multitenancy/

    http://www.ibm.com/developerworks/java/library/j-multitenant-java/index.html

    http://www.eclipse.org/eclipselink/documentation/2.4/jpa/extensions/a_multitenant.ht

    m

    http://2012.con-fess.com/sessions/-/details/122/JSF-and-JavaEE-7-for-multi-tenant-

    applications

    http://jdevelopment.nl/jsf-22/

    http://picketlink.org

    https://developers.google.com/appengine/docs/java/multitenancy/

    http://www.jboss.org/quickstarts/picketlink/picketlink-authentication-idm-multi-tenancy/

    http://wiki.eclipse.org/EclipseLink/Examples/MySports

    https://blogs.oracle.com/theaquarium/entry/java_ee_8_takes_off

  • Obrigado!

    @rcandidosilva

    rodrigocandido.me