8. Globalcode
–
Open4education
Desafios
! Separação dos dados
! Personalização
! Controle de acesso
! Provisionamento de recursos
! Integrações
! Atualização da aplicação
! Recuperação à falhas
9. Globalcode
–
Open4education
Pros and Cons
! Pros
! Reduz o custo de manutenção
! Único código para todos os clientes
! Aumenta a escalabilidade
! Beneficia compartilhamento recursos entre clientes
! Cons
! Aumenta a complexidade
! Separação por tenant-id
! Maior risco de falhas
! Quebra da aplicação compartilhada para todos clientes
! Reduz a flexibilidade para os clientes
10. Globalcode
–
Open4education
Multi-tenancy
! 4 possíveis níveis implementações
! Nível 1 (Personalizado)
! [N] aplicações e [N] databases
! Nível 2 (Configurável)
! [1] aplicação e [N] databases
! Nível 3 (Configurável e eficiente)
! [N] aplicações e [1] database
! Nível 4 (Escalável, configurável e eficiente)
! [1] aplicação e [1] database
28. Globalcode
–
Open4education
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();
}
29. Globalcode
–
Open4education
Cloud + Multi-tenancy
! Namespace API
! com.google.appengine.api.NamespaceManager
! Suporte aos seguintes serviços
! Google Datastore
! Memcached
! Task Queue
! Search
30. Globalcode
–
Open4education
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);
<filter>
<filter-name>NamespaceFilter</filter-name>
<filter-class>package.NamespaceFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>NamespaceFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
31. Globalcode
–
Open4education
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
32. Globalcode
–
Open4education
JVM + Multi-tenancy
! Multi-tenancy no nível da JVM
! IBM SDK JVM
! Static field isolation
! Controle by tenant
! CPU time
! Heap size
! Thread count
! File IO, Socket IO
! Limitações
! Java Native Interface (JNI)
! JVMT (Tool interface)
! GUI Libraries (GWT, Swing, etc)
! EXPERIMENTAL !!!