Working between the clouds (versione completa)

1,614
-1

Published on

Da un po' di tempo a questa parte quando uno sviluppatore software sente la parola "Clouds" non pensa più alle nuovole, ma a...? Durante l'intervento risponderò a questa domanda e mostrerò come una applicazione web sviluppata con Spring Framework, Apache Maven e JPA può essere installata facilmente e (quasi) gratuitamente sulla piattaforma per il cloud computing messa a disposizione da Google. Vedremo poi come applicare i principali pattern relativi alla scalabilità utilizzando gli strumenti messi a disposizione dalla piattaforma di Google.

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
1,614
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
43
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

Working between the clouds (versione completa)

  1. 1. Working between the clouds Versione completa
  2. 2. Chi sono? http://exmachina.ch Davide Cerbo Lavoro per Ex Machina in Lugano http://davide.cerbo.born-to-co.de http://twitter.com/davide_cerbo http://linkedin/in/davidecerbo [email_address]
  3. 3. Buongiorno, oggi vi racconterò una storia (inventata)
  4. 4. Partiamo dall'idea Un giorno mi sveglio e mi viene una idea per una fantastica applicazione: GA(E)STBOOK
  5. 5. Prepariamo gli attrezzi <ul><li>Apache Maven
  6. 6. Spring Framework
  7. 7. HSQL DB
  8. 8. Apache OpenJPA </li></ul>
  9. 9. Apache Maven Maven è una parola ebraica che vuol dire accomulatore di conoscenza. Apache Maven è un sistema per gestire la fase di build di un progetto software. Si occupa principalmente delle dipendenze, la fase di compilazione, di test e tramite un sistema di plugin anche di molto altro La sua configurazione avviene tramite il file pom.xml.
  10. 10. Spring Framerwork E' un potete framework per lo sviluppo di software basato sul principio di Dependency Injection. Nelle ultime versioni al classico file XML di configurazione ha aggiunto una serie di annotazioni
  11. 11. HSQLDB E' un database interamente scritto in Java. Ha il vantaggio di essere molto leggere e può essere utilizzato direttamente all'interno dell'applicativo senza bisogno di servizi esterni.
  12. 12. Jetty Jetty è un HTTP server, un HTTP client, e un javax.servlet container. Interamente scritto in Java ed integrato con Apache Maven tramite plugin.
  13. 13. Prerequisito: JPA The Java Persistence API (JPA) è uno standard che permette agli sviluppatori di gestire dati relazionali in modo indipendente dal database utilizzato. Ne esistono diverse implementazioni, tra cui: OpenJPA , Hibernate e DataNucleus
  14. 14. Creazione progetto con Maven 1/2 <ul><li>Da shell lanciamo il comando: mvn archetype:create -DgroupId=it.jesty -DartifactId=gaestbook -DarchetypeArtifactId=maven-archetype-webapp
  15. 15. Creiamo la cartella java in /gaestbook/src/main
  16. 16. Aggiungiamo il plugin di Jetty nel file pom.xml
  17. 17. Aggiungiamo le dipendenze a: OpenJpa, HSQL, Spring WEBMVC, Spring ORM, etc...
  18. 18. Digitiamo mvn eclipse:eclipse per generare i file di progetto per Eclipse </li></ul>
  19. 19. Creazione progetto con Maven 2/2 <project> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>3.0.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>3.0.0.RELEASE</version> </dependency> <dependency> <groupId>org.apache.openjpa</groupId> <artifactId>openjpa-all</artifactId> <version>1.3.0-SNAPSHOT</version> </dependency> ... </dependencies> <build> <finalName>gaestbook</finalName> <plugins> <plugin> <groupId>org.mortbay.jetty</groupId> <artifactId>maven-jetty-plugin</artifactId> <version>6.1.10</version> ... </plugin> </plugins> </build> </project>
  20. 20. Il Modello
  21. 21. Il controllore
  22. 22. La vista 1/2
  23. 23. La vista 2/2
  24. 24. La configurazione 1/4
  25. 25. La configurazione 2/4
  26. 26. La configurazione 3/4
  27. 27. La configurazione 4/4
  28. 28. Il risultato mvn jetty:run
  29. 29. Dopo qualche mese... Non so perché, ma... ...milioni di utenti usano G(a)estbook!
  30. 31. Ma sempre più utenti vedono HTTP Error 408 Request timeout e non solo...
  31. 33. Scalare Devo migliorare le prestazioni del mio applicativo. Posso scegliere se: <ul><li>Scalare verticalmente : aggiungere potenza di calcolo al singolo server. </li></ul><ul><li>Scalare orizontalmente : aggiungere server che collaborano tra di loro </li></ul>
  32. 34. Verticalmente? Non ci penso nemmeno! <ul><li>Prima o poi raggiungerà la massima configurazione possibile
  33. 35. Non ho abbastanza soldi per acquistare l'ultimo server presente sul mercato </li></ul>
  34. 36. Orizzontalmente a casa mia <ul><li>Non sono un sistemista
  35. 37. I server hanno un prezzo elevato
  36. 38. L'housing ha prezzi elevati
  37. 39. Costruire e gestire una web farm privata per pochi server ha un prezzo elevato
  38. 40. Se il sito non cresce come mi aspetto ho sprecato tempo e denaro </li></ul>
  39. 41. La ricerca continua... Cerco su Google e vedo che alcune aziende offrono servizi di Cloud o Grid Computing ...uhm...
  40. 42. Attrazione fatale
  41. 43. Developer Vs. System Administrator
  42. 44. Cloud Vs. Grid <ul><li>Molte richieste
  43. 45. Piccoli compiti </li></ul><ul><li>Poche richieste
  44. 46. Grandi lavori </li></ul>Molti SERVER lavorano insieme per TE
  45. 47. Big picture
  46. 48. Perchè un servizio di cloud computing? <ul><li>Non siamo amministratori di sistema o tecnici hardware
  47. 49. Niente ravvio dei server, niente problemi di rete
  48. 50. Non abbiamo molti server a nostri disposizione
  49. 51. Non abbiamo i soldi per acquistarli </li></ul>Google Datacenter a Dallas, Oregon Picture credit: Portland Java User Group 18 Agosto 2009
  50. 52. Quando il cloud computing fallisce? <ul><li>Quando la nuvola non può fornire una risorsa per la richiesta
  51. 53. Quando è necessario l'intervento umano per creare una nuova risorsa per la nuvola </li></ul>
  52. 54. Se vogliamo fare da noi http://www.gridgain.com http://www.eucalyptus.com http://code.google.com/p/appscale/
  53. 55. Ma io non lo farei
  54. 56. Primo passo: Iscriviamoci!
  55. 57. Perchè Google App Engine? <ul><li>L'amministrazione di sistema è a prova di stupido
  56. 58. Economico, paghi solo se l'applicazione cresce
  57. 59. Ottimo software installati come Memcache, Bigtable, etc.
  58. 60. Una ottima console di amministrazione con log di sistema, statistiche di accesso, statistiche di consumo, gestione dell'applicazione
  59. 61. Compatibile con JAVA , PYTHON e altri linguaggi basati sulla JVM: Scala, Groovy, etc...
  60. 62. Compatibile con molti standard Java
  61. 63. Non c'è sistema operativo, un pensiero in meno
  62. 64. Molte limitazioni, ma queste ci porteranno ad ottenere a scalare e a bilanciare il carico in automatico </li></ul>
  63. 65. Console di amministrazione
  64. 66. Standard?
  65. 67. How it works
  66. 68. L'API <ul><li>Memcache API – cache key-value in memoria ad alte prestazioni
  67. 69. Datastore – database
  68. 70. URLFetch – invocazione di url esterni
  69. 71. Mail – sistema invio e-mail
  70. 72. Task Queues – invocazioni in background. Ottima al posto dei Thread.
  71. 73. Images – per la manipolazione delle immagini
  72. 74. XMPP – protocollo di comunicazione real-time usato anche da Google Talk
  73. 75. Cron Jobs – schedulazione di task temporizzata
  74. 76. User Accounts – autenticazione tramite gli account di Google </li></ul>http://code.google.com/appengine/docs/java/apis.html
  75. 77. Limitazioni <ul><li>HTTP request devono essere eseguite in 30 secondi, altrimenti GAE lancia una DeadlineExceededException
  76. 78. No socket
  77. 79. No threads
  78. 80. Solo 1000 file per applicazione
  79. 81. Le prime richieste potrebbero essere lente </li></ul>
  80. 82. Ma perchè? <ul><li>Più di 30 seecondi per una request http fanno addormentare l'utente (e bloccano i server)
  81. 83. La sicurezza non è mai troppa
  82. 84. I thread sono fighi ma I task sono più controllabili e gestibili
  83. 85. Alle volte bisogna accontentarsi
  84. 86. Prossima slide... </li></ul>
  85. 87. Prima richiesta lenta? Server 1 Server 2 L'allocazione dei server avviene dinamicamente. Ogni nuova richiesta andrà verso un nuovo server, a meno che un server già istanziato non possa servire la richiesta. Questo è “automatic load balancing” e causa alcuni rallentamenti. Ma...più traffico generate più server pronti avrete! Utente A Utente C Utente B
  86. 88. Risorse gratuite giornaliere <ul><li>1,300,000 richieste http
  87. 89. In/Out Bandwidth 1 Gb
  88. 90. CPU Time 6.5 CPU-ora
  89. 91. Dati memorizzati 1 Gb
  90. 92. Mail inviate 7,000
  91. 93. Mail verso tutti 2,000
  92. 94. Mail verso l'amministratore 5,000
  93. 95. Url fetch 657,000
  94. 96. Chiamate XMPP 657,000
  95. 97. Manipolazione immagini 864,000
  96. 98. Chiamate verso Memcache 8,600,000
  97. 99. Task 100,000
  98. 100. E molto altro... </li></ul>
  99. 101. Listino prezzi <ul><li>Outgoing Bandwidth...........$0.12 / Gb
  100. 102. Incoming Bandwidth...........$0.10 / Gb
  101. 103. CPU Time...........................$0.10 / h
  102. 104. Stored Data........................$0.15 / Gb per mese
  103. 105. Recipients Emailed............$0.0001 / destinatari
  104. 106. (Tasse escluse)
  105. 107. Potete scegliere il vostro budget massimo giornaliero per evitare brutte sorprese! </li></ul>
  106. 108. Chi usa GAE?
  107. 109. Migriamo!
  108. 110. Iniziamo <ul><li>Creiamo un nuovo progetto usando Maven-Gae-Plugin: mvn archetype:create -DarchetypeGroupId=net.kindleit -DarchetypeArtifactId=gae-archetype-gwt -DarchetypeVersion=0.5.3 -DgroupId=your.groupId -DartifactId=your-artifactId -DremoteRepositories=http://maven-gae-plugin.googlecode.com/svn/repository
  109. 111. Facciamo un po' di pulizia e copiamo il sorgente dal precedente progetto </li></ul>Oppure: <ul><li>Seguiamo questa guida per migrare il pom.xml: http://www.kindleit.net/maven_gae_plugin/usage.html </li></ul>
  110. 112. Riconfiguriamo 1/3 La configurazione del Datasource é nel persistence.xml
  111. 113. Riconfiguriamo 2/3
  112. 114. Riconfiguriamo 3/3 Per utilizzare collezioni e oggetti con lazy loading abilitato
  113. 115. appengine-web.xml
  114. 116. Entity Manager Factory
  115. 117. Il risultato mvn gae:run
  116. 118. Altri comandi per Maven <ul><li>mvn gae:deploy : sarà necessario inserire username and password
  117. 119. mvn gae:debug : esegue l'applicativo in modalità di debug </li></ul>
  118. 120. Evoluzione: E-mail di conferma 1/2
  119. 121. Evoluzione: E-mail di conferma 2/2
  120. 122. Sorgente esempio http://code.google.com/p/gae-javaday10/
  121. 123. Alcuni consigli <ul><li>Le operazioni che non danno un responso immediato all'utente vanno eseguite nei task ( vedi invio e-mail )
  122. 124. Inserire in cache tutte le informazioni più recenti ( lista degli ultimi messaggi da visualizzare nella home )
  123. 125. Eseguire operazioni batch che possono alleggerire il sistema tramite i task di tipo cron ( cancellare i messaggi non confermati entro tre giorni ) </li></ul>
  124. 126. Vediamo come
  125. 127. Cache 1 / 3 <ul><li>Supporto della specifica: JSR 107: Java Temporary Caching API
  126. 128. Memcache: un nome, una garanzia
  127. 129. Se vogliano uscire da GAE potremmo utilizzare tranquillamente altre implementazioni standard </li></ul>
  128. 130. Cache 2 / 3 <ul><li>Creazione cache
  129. 131. Inserimento </li></ul>
  130. 132. Cache 3 / 3 <ul><li>Lettura </li></ul>
  131. 133. Task Queues 1 / 3 <ul><li>Perchè far attendere l'utente inutilmente?
  132. 134. Hanno un meccanismo di riprova in caso di fallimento
  133. 135. Configurazione nel file queue.xml: <queue-entries> <queue> <name>task-queue</name> <rate>10/S</rate> <bucket-size>10</bucket-size> </queue> </queue-entities>
  134. 136. Legabili ad una transazione
  135. 137. Eseguiti tramite l'algoritmo: Token bucket (http://en.wikipedia.org/wiki/Token_bucket) </li></ul>
  136. 138. Task Queues 2 / 3
  137. 139. Task Queues 3 / 3
  138. 140. Scheduled Task 1 / 2
  139. 141. Scheduled Task 2 / 2 <ul><li>Chiama ad intervalli di tempo un URL HTTP
  140. 142. La configurazione avviene tramite il file cron.xml
  141. 143. Se la chiamata o l'esecuzione fallisce la prova a ed eseguire
  142. 144. La console di amministrazione fornisce statistiche ed informazioni dettagliate </li></ul>
  143. 145. Sicurezza per Task Queues e Scheduled Task <ul><li>In fondo sono normali servlet e quindi vanno protette da “malintenzionati” </li></ul>
  144. 146. Account 1 / 3 <ul><li>Chiunque abbia un account su Google potrà accedere al vostro applicativo
  145. 147. Potete utilizzare anche le utenze di Google App </li></ul>
  146. 148. Account 2 / 3
  147. 149. Google Account 3 / 3
  148. 150. Risultato finale mvn gae:deploy
  149. 151. e i pattern? <ul><li>L'unico richiesto è il buon senso e: </li><ul><li>Non pensate sincrono
  150. 152. Non pensate verticalmente
  151. 153. Non dimenticate la velocità dell'accesso in memoria
  152. 154. Non mischiate dati freddi e caldi
  153. 155. Non saltellate per la rete </li></ul></ul>
  154. 156. Risorse <ul><li>Spring Framework http://www.springsource.org
  155. 157. Apache Maven http://maven.apache.org
  156. 158. Apache OpenJPA http://openjpa.apache.org
  157. 159. Hsql DB http://hsqldb.org
  158. 160. Jetty http://jetty.codehaus.org
  159. 161. Google App Engine http://appspot.com
  160. 162. Maven GAE Plugin http://code.google.com/p/maven-gae-plugin/
  161. 163. Datanucleus http://www.datanucleus.org </li></ul>
  162. 164. Approfondimenti <ul><li>How Buddypoke scales on Facebook using GAE http://highscalability.com/blog/2010/1/22/how-buddypoke-scales-on-facebook-using-google-app-engine.html
  163. 165. Designing application for cloud deployment http://gojko.net/2010/01/25/designing-applications-for-cloud-deployment/
  164. 166. Google App Engine for Java - 3 Tips for Getting Started http://www.pardontheinformation.com/2009/06/google-app-engine-for-java-3-tips-for.html
  165. 167. The Softer Side Of Schemas - Mapping Java Persistence Standards To the Google App Engine Datastore http://code.google.com/events/io/2009/sessions/SofterSideofSchemas.html
  166. 168. Cloud versus cloud http://www.infoworld.com/d/cloud-computing/cloud-versus-cloud-guided-tour-amazon-google-appnexus-and-gogrid-122 </li></ul>
  167. 169. Libri
  168. 170. Q&A
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×