building concurrent webobjects applications with scala

82
WebObjects + Scala Building Concurrent WebObjects applications with Scala Ravi Mendis

Upload: wo-community

Post on 25-Jun-2015

1.015 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: Building Concurrent WebObjects applications with Scala

WebObjects + ScalaBuilding Concurrent WebObjects applications with Scala

Ravi Mendis

Page 2: Building Concurrent WebObjects applications with Scala

Why Concurrent Programming?

Page 3: Building Concurrent WebObjects applications with Scala

2005The year of Dual Core

Page 4: Building Concurrent WebObjects applications with Scala
Page 5: Building Concurrent WebObjects applications with Scala
Page 6: Building Concurrent WebObjects applications with Scala

2010Today

Page 7: Building Concurrent WebObjects applications with Scala

Entry-Level

Cores Threads

AMD Opteron

IBM Power7

Intel Xeon

4 4

4 16

4 8

Page 8: Building Concurrent WebObjects applications with Scala

High-End

Cores Threads

AMD Opteron

IBM Power7

Intel Xeon

12 12

8 32

6 12

Page 9: Building Concurrent WebObjects applications with Scala

2011Tomorrow

Page 10: Building Concurrent WebObjects applications with Scala

Roadmap

Cores Threads

AMD Opteron

IBM Power7

Intel Xeon

16 16

? ??

8 16

Page 11: Building Concurrent WebObjects applications with Scala

“By 2015 we will likely have over 100 cores on a many-core processing chip in our notebook computers.”

- Computerworld

Page 12: Building Concurrent WebObjects applications with Scala

Welcome to the world of Multi-cores!

Page 13: Building Concurrent WebObjects applications with Scala

Q: How do we take advantage of multi-core processors?

Page 14: Building Concurrent WebObjects applications with Scala

A: Concurrent Programming

Page 15: Building Concurrent WebObjects applications with Scala

#1 Threads & Locks

Page 16: Building Concurrent WebObjects applications with Scala

“Concurrency is hard. It involves a lot of problems that are very difficult to think about and reason about and understand”

- Tim Bray co-inventor of XML

Page 17: Building Concurrent WebObjects applications with Scala

#1 Threads & Locks• HARD to program

• HARD to scale

• Contentious

Page 18: Building Concurrent WebObjects applications with Scala

java.lang.IllegalArgumentException: Cannot determine primary key for entity ASCCarveout from row: {charge = 3027.00; claimID = 321839138; }! at com.webobjects.eoaccess.EODatabaseChannel._fetchObject(EODatabaseChannel.java:348)! at com.webobjects.eoaccess.EODatabaseContext._objectsWithFetchSpecificationEditingContext(EODatabaseContext.java:3071)! at com.webobjects.eoaccess.EODatabaseContext.objectsWithFetchSpecification(EODatabaseContext.java:3195)! at com.webobjects.eocontrol.EOObjectStoreCoordinator.objectsWithFetchSpecification(EOObjectStoreCoordinator.java:488)! at com.webobjects.eocontrol.EOEditingContext.objectsWithFetchSpecification(EOEditingContext.java:4069)! at er.extensions.eof.ERXEC.objectsWithFetchSpecification(ERXEC.java:1211)! at com.webobjects.eoaccess.EODatabaseContext.objectsForSourceGlobalID(EODatabaseContext.java:4084)! at com.webobjects.eocontrol.EOObjectStoreCoordinator.objectsForSourceGlobalID(EOObjectStoreCoordinator.java:634)! at com.webobjects.eocontrol.EOEditingContext.objectsForSourceGlobalID(EOEditingContext.java:3923)! at er.extensions.eof.ERXEC.objectsForSourceGlobalID(ERXEC.java:1169)! at com.webobjects.eoaccess.EODatabaseContext._fireArrayFault(EODatabaseContext.java:4245)! at com.webobjects.eoaccess.EOAccessArrayFaultHandler.completeInitializationOfObject(EOAccessArrayFaultHandler.java:77)! at com.webobjects.eocontrol._EOCheapCopyMutableArray.willRead(_EOCheapCopyMutableArray.java:37)! at com.webobjects.eocontrol._EOCheapCopyMutableArray.count(_EOCheapCopyMutableArray.java:86)! at com.mpv.evaluation.ClaimEvaluator.validateClaim(ClaimEvaluator.java:398)! ...

...Deadlock!

Page 19: Building Concurrent WebObjects applications with Scala

BBC2, Top Gear - Series 15, Episode 1 - June 27 ’10

Page 20: Building Concurrent WebObjects applications with Scala

#2 Actor Model(A Share NOTHING Model)

Page 21: Building Concurrent WebObjects applications with Scala

Slowmation

Page 23: Building Concurrent WebObjects applications with Scala

html5 <video>

<video poster="/slowmation/screenshots/0/2/4/425.jpg">! <source type="video/ogg" src="/slowmation/videos/6/d/8/423.ogg" />! <source type="video/mp4" src="/slowmation/videos/d/6/4/424.mp4" /></video>

Page 24: Building Concurrent WebObjects applications with Scala

HTML5 Video Conversion

Screenshot (.jpg)

Video (.mp4)

Video (.ogg)

Thumbnail (.jpg)

Page 25: Building Concurrent WebObjects applications with Scala

• actor ! THUMBNAIL

• actor ! GRAB

• actor ! CONVERT2H264

• actor ! CONVERT2OGG

Slowmation Actor(Video Processor)

Page 26: Building Concurrent WebObjects applications with Scala

!

Page 27: Building Concurrent WebObjects applications with Scala

Actor Messaging• Asynchronous

• Non-blocking

• Immutable Messages

• NO shared data

Page 28: Building Concurrent WebObjects applications with Scala

Scala

Page 29: Building Concurrent WebObjects applications with Scala

• Immutable/Mutable datatypes

• Anonymous Functions (~Closures)

• No Static variables and methods

• Extensible

Scala

Page 30: Building Concurrent WebObjects applications with Scala

Scalaval greeting: String = “Hello World”;

Page 31: Building Concurrent WebObjects applications with Scala

Scalaval greeting = “Hello World”;

Page 32: Building Concurrent WebObjects applications with Scala

Scalaval greeting = “Hello World”

Page 33: Building Concurrent WebObjects applications with Scala

Scalaval greeting = “Hello World” // immutablevar response = new String() // mutable

response = “Hey!”

Page 34: Building Concurrent WebObjects applications with Scala

Java - Static Varspublic class _Talent extends EOGenericRecord { public static final String ENTITY_NAME = "Talent";}

Page 35: Building Concurrent WebObjects applications with Scala

Scala - Companion Objectobject Talent extends EOGenericRecord { val ENTITY_NAME = "Talent"}

Page 36: Building Concurrent WebObjects applications with Scala

Thread-Safe

Page 37: Building Concurrent WebObjects applications with Scala

Scala - Pattern Matchingcase a => { ...}

Page 38: Building Concurrent WebObjects applications with Scala

Scala - Pattern Matchingtry { var epi: EditPageInterface = D2W.factory.editPageForNewObjectWithEntityNamed(entityName, session)} catch { case e: IllegalArgumentException => { var epf: ErrorPageInterface = D2W.factory.errorPage(session) epf.setMessage(e.toString) }}

Page 39: Building Concurrent WebObjects applications with Scala

Scala - Case Classescase class PINGcase class PONG

Page 40: Building Concurrent WebObjects applications with Scala

Scala - Case Classesactor ! PINGactor ! PONG

Page 41: Building Concurrent WebObjects applications with Scala

Scala - Case Classescase PING => { ...}

case PONG => { ...}

Page 42: Building Concurrent WebObjects applications with Scala

Scala - Anonymous Functionsx => x^2

Page 43: Building Concurrent WebObjects applications with Scala

Scala - Anonymous Functionsx, y => x + y

Page 44: Building Concurrent WebObjects applications with Scala

Scala - Anonymous Functionsx, y => {x + y}

Page 45: Building Concurrent WebObjects applications with Scala

Scala - Anonymous Functionscase (PING => {...})

case (PONG => {...})

Page 46: Building Concurrent WebObjects applications with Scala

λ - Expressions

Page 47: Building Concurrent WebObjects applications with Scala

Scala Actors - Examplecase class THUMBNAIL(filepath: String) // Actor msg case class

val processor = actor { loop { react() { case THUMBNAIL(filepath: String) => { ... } } }}

// asynchronousprocessor ! THUMBNAIL(“/Library/WebServer/Documents/slowmation/screenshots/0/2/4/422.jpg”)

Page 48: Building Concurrent WebObjects applications with Scala

#2 Actor Model• EASY to program

• Scalable

• NO Deadlocks!

Page 49: Building Concurrent WebObjects applications with Scala

Q: Why can Scala be used with WebObjects?

Page 50: Building Concurrent WebObjects applications with Scala

A: Scala compiles to Java Byte-code

Page 51: Building Concurrent WebObjects applications with Scala

WebObjects + Concurrency

Page 52: Building Concurrent WebObjects applications with Scala

Why?

Page 53: Building Concurrent WebObjects applications with Scala

Performance• Exploit multi-core processors

Page 54: Building Concurrent WebObjects applications with Scala

Ajax• More responsive UI

Page 55: Building Concurrent WebObjects applications with Scala

How?

Page 56: Building Concurrent WebObjects applications with Scala

PropertiesWOAllowsConcurrentRequestHandling=true

Page 57: Building Concurrent WebObjects applications with Scala

Java - Synchronize Static Variablesprivate static String greeting = “Hello”; // private

public void setGreeting(String aGreeting) { synchronized(greeting) { // synchronized block greeting = aGreeting; }}

Page 58: Building Concurrent WebObjects applications with Scala

Free!

Page 59: Building Concurrent WebObjects applications with Scala

WO - What is Shared?• Application

• Session (concurrent WO)

Page 60: Building Concurrent WebObjects applications with Scala

Use ERXEC• Project Wonder

• Automatic lock/unlock handling

Page 61: Building Concurrent WebObjects applications with Scala

Propertieser.extensions.ERXEC.safeLocking=true

Page 62: Building Concurrent WebObjects applications with Scala

Debugging

Page 63: Building Concurrent WebObjects applications with Scala

Demo

Page 64: Building Concurrent WebObjects applications with Scala

Properties-Dcom.sun.management.jmxremote=true-Dcom.sun.management.jmxremote.authenticate=false-Dcom.sun.management.jmxremote.ssl=false

// Specific port-Dcom.sun.management.jmxremote.port=20102

Page 65: Building Concurrent WebObjects applications with Scala

Bottlenecks

Page 66: Building Concurrent WebObjects applications with Scala

• Shared Object-cache

• Antithesis to Share Nothing model

• Uses single database connection

• Single-Threaded

EOF - Bottleneck

Page 67: Building Concurrent WebObjects applications with Scala

#3 STM(Software Transactional Memory)

Page 68: Building Concurrent WebObjects applications with Scala

• DOESN’T work in Scala Actors!

EOF + Scala

Page 69: Building Concurrent WebObjects applications with Scala

• Use Raw SQL

• Alternative database access

• Squeryl

• ...

Solutions

Page 70: Building Concurrent WebObjects applications with Scala

Squeryl

Page 71: Building Concurrent WebObjects applications with Scala

Demo

Page 72: Building Concurrent WebObjects applications with Scala

Squeryl• POSOs

• Actor Compatible

• Concurrent

Page 73: Building Concurrent WebObjects applications with Scala

“Scala as a concurrent programming language is powerful, safe and easy-to-use”

Page 74: Building Concurrent WebObjects applications with Scala

Benchmarks

Page 75: Building Concurrent WebObjects applications with Scala

• ERWOAdaptor (Mina)

• WO Worker as Actor

• Apache bench

• c = 5...65

• n = 500

The Test

Page 76: Building Concurrent WebObjects applications with Scala

Results

Page 77: Building Concurrent WebObjects applications with Scala

Time per req. (mean)

0 ms

50 ms

100 ms

150 ms

200 ms

5 10 15 20 25 30 35 40 45 50 55 60 65

WOAdaptor ERWOScalaAdaptor ERWOAdaptor

Page 78: Building Concurrent WebObjects applications with Scala

Requests per second

0

200

400

600

800

5 10 15 20 25 30 35 40 45 50 55 60 65

WOAdaptor ERWOScalaAdaptor ERWOAdaptor

Page 79: Building Concurrent WebObjects applications with Scala

“Scala as a concurrent programming language is powerful, safe and easy-to-use”

Page 80: Building Concurrent WebObjects applications with Scala

In life long loveThe key Is R&D

The ladder of inventionHas eternal slide extension

Rung by rung You’ll climb to heaven above.

Constant innovation Guarantees a satiation

Of that ever changing want And deepening need

Nourishment and careTo think anew…

Makes passions flair And lets a culture breedBetween the sheets…

- by Emma Ahmad

The R&D Imperative

Page 81: Building Concurrent WebObjects applications with Scala

Q&A

Page 82: Building Concurrent WebObjects applications with Scala

• What will YOU do with 100 cores?http://www.computerworld.com.au/article/354261/

• WebObjects with Scalahttp://wiki.objectstyle.org/confluence/display/WO/WebObjects+with+Scala

• Case Study: Slowmationhttp://slowmation.uow.edu.au

• Source: ERWOScalaAdaptorhttp://services.wocommunity.org/wowodc/ERWOScalaAdaptor

References