techtalk - suportando aplicacoes multi-tenancy com java ee
DESCRIPTION
Curso sobre mutitenancyTRANSCRIPT
-
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