1. Scala e i database Onofrio Panzarino Twitter: @onof80 onofrio.panzarino@gmail.com http://it.linkedin.com/in/onofriopanzarino http://www.google.com/profiles/onofrio.panzarino Jug Ancona
3. Limiti dei RDBMS tradizionali Le classiche web-app sono “Scale-out” Si aggiungono nodi al sistema per aumentare le performance Gli RDBMS, a causa di lock e join, sono “Scale-up” Per aumentare le performance è necessario potenziare il server RDBMS ottimizzati per brevi e frequenti transazioni r/w grandi transazioni batch con pochi accessi in scrittura non per pesanti carichi di lavoro r/w!
4. CAP theorem (Brewer, 2000) Sistemi distribuiti C = Consistency tutti i nodi con gli stessi dati A = Availability il fallimento di un nodo non impedisce agli altri di continuare P = Partitiontolerance il sistema tollera arbitrarie perdite di messaggi “Un sistema distribuito non può garantirle simultaneamente tutte, ma al massimo due” (C && A) => ! P
5. Data models Key / Value Cassandra (Apache) Facebook, Twitter, Digg, … Berkeley DB (Oracle) Asterisk PBX, OpenLDAP, RPM, SVN, Terracotta, … Voldemort LinkedIn Tabular BigTable (Google) Hbase Hypertable Document-oriented MongoDB NY Times, Foursquare, Bit.ly, Sourceforge, Eventbrite, LHC (CERN), CouchDB (Apache) Terrastore Jackrabbit (Apache) Graph Neo4j Tuple – store Apache River
6. MongoDB JSON-style data store { name: “onofrio”, tags: [ “scala”, “java”] } Schemaless nella stessa collection: { username: “bill”, password: “h298LYT”, age: 30, active: true } { username: “james”, openId: http://www...”, } { username: “admin”, alias: “bill” } facile da gestire non è più necessario fare il deploy dello schema del DB!
7. MongoDB Query Map / Reduce Esempio: varmap = function() { emit(this.username, { votes: this.votes } } var reduce = function() { var sum = 0; values.forEach(function(doc) { sum += doc.votes; }); return {votes: sum}; } db.comments.mapReduce(map, reduce);
8. MongoDB No-joins, no multi objecttransations Scalabilità orizzontale Usecases CMS Commentstorage, voting High-volumeproblems Real-time stats Eventlogging Sconsigliato per: Banking systems Complextransactions Traditional BI Data warehouse
10. Mongo-scala-driver È un wrapper di mongo-java-driver, scritto in Scala Fornisce il modo di mappare un documento MongoDB (DBObject) in un “POSO” Fondamentalmente è un DSL per repositoryMongoDB. val m = new Mongo("localhost") valcoll = m.getDB(“test”).getCollection("addresses") of Address coll << new Address(“Onofrio", “Via Garibaldi", “1111", “NYC") valaddressOfNY = for { a <- Address where { Address.street is “NYC” } in coll }
12. Scala + RDBMS Scala può linkare ogni JAR JDBC “JDBC is the reasonwhy Java guysuseORMs” Non è type-safe getString(“Name”) getFloat(“Price”) … La mappatura columntype – Java type non è centralizzabile viene ripetuta ad ogni query
13. ScalaQuery DSL per JDBC Scala – friendly Totalmente type-safe La mappatura è centralizzata in un Scala object Non è un ORM No cache Non viene oscurato il momento in cui vengono effettuate le query È possibile usare oggetti immutabili
16. Riferimenti http://www.scala-lang.org/ M. Odersky, L. Spoon, B. Venners, Programming in Scala, Artima scala-user mailing list http://stackoverflow.com/questions/tagged/scala http://www.artima.com/index.jsp irc://irc.freenode.net/scala