Upload
cyrille-le-clerc
View
1.511
Download
4
Embed Size (px)
DESCRIPTION
Les bonnes pratiques des applications Java prêtes pour la production. Les enjeux : * Améliorer la disponibilité des applications * Réduire le cycle de vie des projets * Améliorer les plateformes * Diminuer le coût d’exploitation Les axes clefs : * Le déploiement * La supervision et le monitoring * La gestion des logs * La robustesse * L’organisation
Citation preview
Bonnes Pratiques Des
Applications JavaPrêtes pour la Production
Bonnes Pratiques des Applications Java
Prêtes pour la Production
Cyrille Le Clerc
Sunday, June 13, 2010
Cyrille Le Clerc
Architecte Java EE depuis 11 ans
Committer Apache CXF
Directeur associé chez Xebia
www.xebia.fr / blog.xebia.fr 2Sunday, June 13, 2010
Les enjeux
Améliorer la disponibilité des applications
Réduire le cycle de vie des projets
Améliorer les plateformes
Diminuer le coût d’exploitation
www.xebia.fr / blog.xebia.fr 2Sunday, June 13, 2010
Les axes clefs
Le déploiement
La supervision et le monitoring
La gestion des logs
La robustesse
L’organisation
www.xebia.fr / blog.xebia.fr 2Sunday, June 13, 2010
Le Déploiement
Minimiser le nombre de composants à déployer
Colocation friendly
Les paramètres de configuration
La traçabilité
www.xebia.fr / blog.xebia.fr 2Sunday, June 13, 2010
Le Déploiement
Minimiser le nombre de composants à déployer
www.xebia.fr / blog.xebia.fr 2Sunday, June 13, 2010
Minimiser le nombre de composants à déployer
www.xebia.fr / blog.xebia.fr 5
html
css
img
js
jsp
WEB-INF
*.html*.html
lib
classes
web.xml
*.jsp*.jsp
my-app
Sunday, June 13, 2010
Minimiser le nombre de composants à déployer
www.xebia.fr / blog.xebia.fr 5
# don't proxy static content !
ProxyPassMatch ^(/my/.*\.html)$ !
ProxyPassMatch ^(/my/.*\.css)$ !
ProxyPassMatch ^(/my/.*\.gif)$ !
ProxyPassMatch ^(/my/.*\.jpeg)$ !
ProxyPassMatch ^(/my/.*\.png)$ !
ProxyPassMatch ^(/my/.*\.js)$ !
# proxy dynamic content
ProxyPass /my/ http://my:8080/my/
httpd.conf3
html
css
img
js
jsp
WEB-INF
*.html
lib
classes
web.xml
*.jsp*.jsp
my-app
Apache Httpd Tomcat
my-app.warmy-app static files
just in case
12
Sunday, June 13, 2010
Minimiser le nombre de composants à déployer
www.xebia.fr / blog.xebia.fr 5
# proxy /my/
ProxyPass /my/ http://my:8080/my/
httpd.conf2
Cache Proxy
html
css
img
js
jsp
WEB-INF
*.html
lib
classes
web.xml
*.jsp*.jsp
my-app
Apache Httpd Tomcat
my-app.warmy-app static files
1
Sunday, June 13, 2010
Colocation friendly
Colocalisation de serveur (Linux, Windows, etc)▶ Minimiser les répertoires absolus et les ports réseaux▶ Ports dédiés par application (e.g. http : 10080)
▶ Chemins dédiés de répertoires (e.g. /etc/my-app-1/...)
Colocalisation de serveur Java EE▶ Ne pas utiliser de variable statique▶ Chemins dédiés de répertoires (e.g. ${java.io.tmpdir}/my-app-1/...)
www.xebia.fr / blog.xebia.fr 2Sunday, June 13, 2010
Le Déploiement
Les paramètres de configuration
www.xebia.fr / blog.xebia.fr 2Sunday, June 13, 2010
Les paramètres de configuration
Limiter les paramètres de configuration dont la valeur change suivant les environnements▶ Ports réseau standards (e.g. 80, 1521)▶ Noms logiques de host/serveurs (e.g. my-app-srv-1)
www.xebia.fr / blog.xebia.fr 2
Production
...
Firewall
Internet
10080app-1
20080app-2
80
443/app1
/app2my-com
pany.com
db-α1521
db-β1521
srv-i, srv-j, srv-k
srv-l, srv-m, srv-n
Sunday, June 13, 2010
Les paramètres de configuration
www.xebia.fr / blog.xebia.fr 5
Production
...
Firewall
Internet
10080app-1
20080app-2
80
443
/app1
/app2my-com
pany.com
db-α1521
db-β1521
Validation
...
Firewall
10080app-1
20080app-2
80
443
/app1
/app2my-com
pany.com
db-α1521
db-β1521
proxy
srv-i, srv-j, srv-k
srv-l, srv-m, srv-n
srv-i, srv-j, srv-k
srv-l, srv-m, srv-n
NO communication
Same hostnames
Same network ports
Can be same IP !
Sunday, June 13, 2010
Le Déploiement
La traçabilité
www.xebia.fr / blog.xebia.fr 2
Data centersDev zone
my-app/tags/1.2.3/
Repository
my-app-1.2.3.war
Comment déployer ?
artefact taggé
Sunday, June 13, 2010
Supervision et Monitoring
Exposer des indicateurs métier
Logs vs. JSP vs. JMX
www.xebia.fr / blog.xebia.fr 2Sunday, June 13, 2010
Supervision et Monitoring
Exposer des indicateurs métier
Suivre les succès et échecs vécus par les utilisateurs
www.xebia.fr / blog.xebia.fr 2Sunday, June 13, 2010
Supervision et Monitoring
Logs de monitoring
Détail par invocation vs. moyenne par minute
www.xebia.fr / blog.xebia.fr 2Sunday, June 13, 2010
Monitoring : logs vs. jsp vs. jmx
JSP Attention à la sécurité ! Human Friendly and/or Script Friendly
www.xebia.fr / blog.xebia.fr 2
/my-app/seye5E7E/jmx/cxf.jsp
Sunday, June 13, 2010
Monitoring : logs vs. jsp vs. jmx
JMX Sécurité ++ Simple Human Friendly and/or Script Friendly
www.xebia.fr / blog.xebia.fr 2Sunday, June 13, 2010
Monitoring : logs vs. jsp vs. jmx
JMX : Simple
www.xebia.fr / blog.xebia.fr 2
@ManagedResourcepublic class DemoServiceImpl { private final AtomicInteger invocationCount = new AtomicInteger(); @ManagedAttribute public int getInvocationsCount() { return invocationCount.get(); } @ManagedOperation public void purge(){ // ... }
Sunday, June 13, 2010
Monitoring : logs vs. jsp vs. jmx
JMX : VisualVM
www.xebia.fr / blog.xebia.fr 2Sunday, June 13, 2010
Monitoring : logs vs. jsp vs. jmx
JMX : Hyperic HQ & cie
www.xebia.fr / blog.xebia.fr 2Sunday, June 13, 2010
Monitoring : logs vs. jsp vs. jmx
JMX & JSP
www.xebia.fr / blog.xebia.fr 2
Powered by JMX !
Sunday, June 13, 2010
La gestion des logs
Exceptions java & stack trace vs. code erreur
Troubleshooting vs. logs longue durée &audit
www.xebia.fr / blog.xebia.fr 2Sunday, June 13, 2010
La gestion des logs
www.xebia.fr / blog.xebia.fr 2
2010/04/12 14:37:19 [catalina-exec-14] WARN o.a.cxf.phase.PhaseInterceptorChain - Application {http://ws.xebia.fr/customer/v1_0}customerService#{http://ws.xebia.fr/customer/v1_0}getCustomer has thrown exception, unwinding noworg.apache.cxf.interceptor.Fault: Exception getting customer '71' at org.apache.cxf.service.invoker.AbstractInvoker.createFault(AbstractInvoker.java:155) ~[cxf-rt-core-2.2.7.jar:2.2.7] at org.apache.cxf.jaxws.AbstractJAXWSMethodInvoker.createFault(AbstractJAXWSMethodInvoker.java:86) ~[cxf-rt-frontend-jaxws-2.2.7.jar:2.2.7] at org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:121) ~[cxf-rt-core-2.2.7.jar:2.2.7] at org.apache.cxf.jaxws.JAXWSMethodInvoker.invoke(JAXWSMethodInvoker.java:60) ~[cxf-rt-frontend-jaxws-2.2.7.jar:2.2.7] at org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:75) ~[cxf-rt-core-2.2.7.jar:2.2.7] at org.apache.cxf.interceptor.ServiceInvokerInterceptor$1.run(ServiceInvokerInterceptor.java:58) ~[cxf-rt-core-2.2.7.jar:2.2.7] at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441) ~[na:1.6.0_17] at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) ~[na:1.6.0_17] at java.util.concurrent.FutureTask.run(FutureTask.java:138) ~[na:1.6.0_17] at org.apache.cxf.workqueue.SynchronousExecutor.execute(SynchronousExecutor.java:37) ~[cxf-rt-core-2.2.7.jar:2.2.7] at org.apache.cxf.interceptor.ServiceInvokerInterceptor.handleMessage(ServiceInvokerInterceptor.java:106) ~[cxf-rt-core-2.2.7.jar:2.2.7] at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:243) ~[cxf-api-2.2.7.jar:2.2.7] at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:110) [cxf-rt-core-2.2.7.jar:2.2.7] at org.apache.cxf.transport.servlet.ServletDestination.invoke(ServletDestination.java:98) [cxf-rt-transports-http-2.2.7.jar:2.2.7] at org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:423) [cxf-rt-transports-http-2.2.7.jar:2.2.7] at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:178) [cxf-rt-transports-http-2.2.7.jar:2.2.7] at org.apache.cxf.transport.servlet.AbstractCXFServlet.invoke(AbstractCXFServlet.java:142) [cxf-rt-transports-http-2.2.7.jar:2.2.7] at org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:179) [cxf-rt-transports-http-2.2.7.jar:2.2.7] at org.apache.cxf.transport.servlet.AbstractHTTPServlet.doPost(AbstractHTTPServlet.java:103) [cxf-rt-transports-http-2.2.7.jar:2.2.7] at javax.servlet.http.HttpServlet.service(HttpServlet.java:637) [servlet-api.jar:na] at org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:159) [cxf-rt-transports-http-2.2.7.jar:2.2.7] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) [catalina.jar:6.0.26] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) [catalina.jar:6.0.26] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:343) [spring-security-web-3.0.2.RELEASE.jar:na] at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:109) [spring-security-web-3.0.2.RELEASE.jar:na] at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:83) [spring-security-web-3.0.2.RELEASE.jar:na] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355) [spring-security-web-3.0.2.RELEASE.jar:na] at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:97) [spring-security-web-3.0.2.RELEASE.jar:na] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355) [spring-security-web-3.0.2.RELEASE.jar:na] at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:100) [spring-security-web-3.0.2.RELEASE.jar:na] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355) [spring-security-web-3.0.2.RELEASE.jar:na] at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:78) [spring-security-web-3.0.2.RELEASE.jar:na] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355) [spring-security-web-3.0.2.RELEASE.jar:na] at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:54) [spring-security-web-3.0.2.RELEASE.jar:na] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355) [spring-security-web-3.0.2.RELEASE.jar:na] at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:35) [spring-security-web-3.0.2.RELEASE.jar:na] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355) [spring-security-web-3.0.2.RELEASE.jar:na] at org.springframework.security.web.authentication.www.BasicAuthenticationFilter.doFilter(BasicAuthenticationFilter.java:177) [spring-security-web-3.0.2.RELEASE.jar:na] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355) [spring-security-web-3.0.2.RELEASE.jar:na] at org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter.doFilter(DefaultLoginPageGeneratingFilter.java:90) [spring-security-web-3.0.2.RELEASE.jar:na] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355) [spring-security-web-3.0.2.RELEASE.jar:na] at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:188) [spring-security-web-3.0.2.RELEASE.jar:na] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355) [spring-security-web-3.0.2.RELEASE.jar:na] at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:105) [spring-security-web-3.0.2.RELEASE.jar:na] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355) [spring-security-web-3.0.2.RELEASE.jar:na] at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:79) [spring-security-web-3.0.2.RELEASE.jar:na] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355) [spring-security-web-3.0.2.RELEASE.jar:na] at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:149) [spring-security-web-3.0.2.RELEASE.jar:na] at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237) [spring-web-3.0.2.RELEASE.jar:3.0.2.RELEASE] at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167) [spring-web-3.0.2.RELEASE.jar:3.0.2.RELEASE] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) [catalina.jar:6.0.26] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) [catalina.jar:6.0.26] at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) [catalina.jar:6.0.26] at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) [catalina.jar:6.0.26] at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) [catalina.jar:6.0.26] at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) [catalina.jar:6.0.26] at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:555) [catalina.jar:6.0.26] at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) [catalina.jar:6.0.26] at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298) [catalina.jar:6.0.26] at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852) [tomcat-coyote.jar:6.0.26] at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588) [tomcat-coyote.jar:6.0.26] at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:396) [tomcat-coyote.jar:6.0.26] at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) [na:1.6.0_17] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) [na:1.6.0_17] at java.lang.Thread.run(Thread.java:637) [na:1.6.0_17]Caused by: java.lang.RuntimeException: Exception getting customer '71' at fr.xebia.ws.customer.v1_0.CustomerServiceImpl.getCustomer(CustomerServiceImpl.java:101) ~[CustomerServiceImpl.class:na] at fr.xebia.ws.customer.v1_0.CustomerServiceImpl$$FastClassByCGLIB$$30f63c56.invoke(<generated>) ~[cglib-nodep-2.2.jar:na] at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:191) ~[cglib-nodep-2.2.jar:na] at org.springframework.aop.framework.Cglib2AopProxy$CglibMethodInvocation.invokeJoinpoint(Cglib2AopProxy.java:692) ~[spring-aop-3.0.1.RELEASE.jar:3.0.1.RELEASE] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150) ~[spring-aop-3.0.1.RELEASE.jar:3.0.1.RELEASE] at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:80) ~[spring-aop-3.0.1.RELEASE.jar:3.0.1.RELEASE] at fr.xebia.audit.AuditAspect.logMessage(AuditAspect.java:139) ~[AuditAspect.class:na] at sun.reflect.GeneratedMethodAccessor62.invoke(Unknown Source) ~[na:na] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) ~[na:1.6.0_17] at java.lang.reflect.Method.invoke(Method.java:597) ~[na:1.6.0_17] at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:622) ~[spring-aop-3.0.1.RELEASE.jar:3.0.1.RELEASE] at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:611) ~[spring-aop-3.0.1.RELEASE.jar:3.0.1.RELEASE] at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:65) ~[spring-aop-3.0.1.RELEASE.jar:3.0.1.RELEASE] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:161) ~[spring-aop-3.0.1.RELEASE.jar:3.0.1.RELEASE] at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:89) ~[spring-aop-3.0.1.RELEASE.jar:3.0.1.RELEASE] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) ~[spring-aop-3.0.1.RELEASE.jar:3.0.1.RELEASE] at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:625) ~[spring-aop-3.0.1.RELEASE.jar:3.0.1.RELEASE] at fr.xebia.ws.customer.v1_0.CustomerServiceImpl$$EnhancerByCGLIB$$184a797f.getCustomer(<generated>) ~[cglib-nodep-2.2.jar:na] at sun.reflect.GeneratedMethodAccessor61.invoke(Unknown Source) ~[na:na] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) ~[na:1.6.0_17] at java.lang.reflect.Method.invoke(Method.java:597) ~[na:1.6.0_17] at org.apache.cxf.service.invoker.AbstractInvoker.performInvocation(AbstractInvoker.java:173) ~[cxf-rt-core-2.2.7.jar:2.2.7] at org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:89) ~[cxf-rt-core-2.2.7.jar:2.2.7] ... 62 common frames omittedCaused by: java.lang.RuntimeException: Too many concurrent access to ZeSlowService at fr.xebia.productionready.backend.zeslowservice.ZeSlowServiceBoundedImpl.find(ZeSlowServiceBoundedImpl.java:57) ~[ZeSlowServiceBoundedImpl.class:na] at fr.xebia.ws.customer.v1_0.CustomerServiceImpl.updateCustomerWithZeSlowServiceData(CustomerServiceImpl.java:166) ~[CustomerServiceImpl.class:na] at fr.xebia.ws.customer.v1_0.CustomerServiceImpl.getCustomer(CustomerServiceImpl.java:99) ~[CustomerServiceImpl.class:na] ... 84 common frames omitted
2010/04/12 15:06:09 [catalina-exec-18] WARN o.a.cxf.phase.PhaseInterceptorChain - Application {http://ws.xebia.fr/customer/v1_0}customerService #{http://ws.xebia.fr/customer/v1_0}getCustomer has thrown exception, unwinding now org.apache.cxf.interceptor.Fault: Exception getting customer '1' at org.apache.cxf.service.invoker.AbstractInvoker.createFault(AbstractInvoker.java:155)Caused by: java.lang.RuntimeException: Exception getting customer '1' at fr.xebia.ws.customer.v1_0.CustomerServiceImpl.getCustomer(CustomerServiceImpl.java:101)Caused by: java.lang.RuntimeException: Something went wrong at fr.xebia.ws.customer.v1_0.CustomerServiceImpl.doSomeWork(CustomerServiceImpl.java:66)
Exceptions & stack trace vs.
code erreur
Sunday, June 13, 2010
La gestion des logs
www.xebia.fr / blog.xebia.fr 2
logs
logs-to-collect
my-app-audit.log
my-app.log
my-app-troubleshooting.logmy-app-troubleshooting-1.log
my-app-troubleshooting-9.log
my-app-audit-20100411.logmy-app-audit-201004....log
my-app-20100411.logmy-app-201004...log
>= WARN, compact stack trace, collected
only audit, collected
10x10Mo, rolling, NOT collected, mostly >= WARN
...
...
...
easy to collect log files
Sunday, June 13, 2010
La gestion des logs
Audit par annotation
Exemple de message
www.xebia.fr / blog.xebia.fr 2
@RolesAllowed("ROLE_USER")@Audited(message = "CustomerService.getCustomer(#{args[0]})")public Customer getCustomer(long id) throws MyException { // ...}
...2010/04/12-17:18:00:266
CustomerService.getCustomer(12) by ze-remote-app coming from 9.0.1.53 ...
Sunday, June 13, 2010
La Robustesse
Dépendances inter-application : fail fast est-il synonyme de fragilité ?
Prévention des saturations et des effets "domino" : l'art du code défensif,
Les modes dégradés
www.xebia.fr / blog.xebia.fr 2Sunday, June 13, 2010
La Robustesse
Dépendances inter-application : fail fast est-il synonyme de fragilité ?
Bloquer le démarrage pour mauvaise configuration
Ne pas bloquer le démarrage pour indisponibilité d’une dépendance
www.xebia.fr / blog.xebia.fr 2Sunday, June 13, 2010
La Robustesse
Prévention des saturations et des effets "domino" : l'art du code défensif
www.xebia.fr / blog.xebia.fr 2
Presentation & Business Layer
Sometimes Slow
Service
Short timeout is
impossible !
Presentation & Business Layer
Sometimes Slow
Service
limit concurrent invocations !
Sunday, June 13, 2010
La Robustesse
Les modes dégradés
Mieux vaut-il un service limité ou un système en panne ?
www.xebia.fr / blog.xebia.fr 2Sunday, June 13, 2010
L’organisation
Prévoir l’exploitation
Les développeurs en support niveau 3
You Build It, You Run It !
www.xebia.fr / blog.xebia.fr 2Sunday, June 13, 2010
L’organisation
Prévoir l’exploitation
Dès la conception
Processus itératif
www.xebia.fr / blog.xebia.fr 2Sunday, June 13, 2010
L’organisation
Les développeurs en support niveau 3
Prendre conscience
Responsabiliser
www.xebia.fr / blog.xebia.fr 2Sunday, June 13, 2010
L’organisation
“You Build It You Run It !”Amazon
www.xebia.fr / blog.xebia.fr 2Sunday, June 13, 2010
Formation !
www.xebia.fr / blog.xebia.fr 2
FormationApplications Java Prêtes pour la Production
Les 17 & 18 Mai 2010 !
Sunday, June 13, 2010