Upload
ednaldo-franco
View
14
Download
0
Embed Size (px)
DESCRIPTION
Curso sobre mutitenancy
Citation preview
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