Upload
jaxlondon2014
View
159
Download
1
Embed Size (px)
Citation preview
Copyright © 2014, Oracle and/or its affiliates. All rights reserved.
Project AvatarServer-‐side JavaScript on the JVM !JAX London -‐ Oct. 2014
David Delabassee (@delabassee) Oracle
Copyright © 2014, Oracle and/or its affiliates. All rights reserved.
Safe Harbor Statement
The following is intended to outline our general product direction. It is intended for information purposes only, and may not be incorporated into any contract. It is not a commitment to deliver any material, code, or functionality, and should not be relied upon in making purchasing decisions. The development, release, and timing of any features or functionality described for Oracle’s products remains at the sole discretion of Oracle.
2
Copyright © 2014, Oracle and/or its affiliates. All rights reserved.
Agenda
Setting the Context
Avatar – Enterprise Node on the JVM
Demo
1
3
3
2
3
Copyright © 2014, Oracle and/or its affiliates. All rights reserved.
Agenda
Setting the Context
Avatar – Enterprise Node on the JVM
Demo
1
2
3
4
Copyright © 2014, Oracle and/or its affiliates. All rights reserved.
Node.js
• Server-‐side JavaScript based on Chrome v8 engine • Created in 2009, Open Source • Designed for scalable Internet applications • Melting pot community – Java, .NET, Browser, PHP, etc, experience
• Node Packaged Modules – Very active, with +98,000 modules (YMMV)
5
Server Side JavaScript
Copyright © 2014, Oracle and/or its affiliates. All rights reserved.
Node.js Programming Model• Multi-‐threading is hard – Thousands of concurrent connections – Deal with deadlocks and race conditions
• Blocking on I/O is bad • Event Loop – Reactive Model – Non-‐blocking I/O calls
• Application code executes in a single thread
6
Event LoopClients
Non-‐blocking Worker
Copyright © 2014, Oracle and/or its affiliates. All rights reserved.
Node.js Programming Model
7
var http = require("http");!!http.createServer( … ).listen(80);
Copyright © 2014, Oracle and/or its affiliates. All rights reserved.
Node.js Programming Model
8
var http = require("http");!!http.createServer(function(request, response) {!! response.writeHead(200, {"Content-type": "text/plain"});!! response.write("Hello World";)!! response.end();!}).listen(80);
Copyright © 2014, Oracle and/or its affiliates. All rights reserved.
Nashorn!• Bundled with Java 7 and 8 • ECMAScript 5.1 compatibility • Performance (vs Rhino) • Java Interoperability
9
0
1,5
3
4,5
6
crypto earley-‐boyer mandreel pdas regexp splay
rhinonashorn jdk8nashorn jdk9
JavaScript Engine
Copyright © 2014, Oracle and/or its affiliates. All rights reserved.
Nashorn Quick Demo
10
Copyright © 2014, Oracle and/or its affiliates. All rights reserved.
Scaling Server-‐Side JavaScript
11
Copyright © 2014, Oracle and/or its affiliates. All rights reserved.
What If I’m in a Java Shop?
• Java Developer Investments – In-‐house Java-‐based frameworks – 3rd party commercial and/or open source libraries – Lots of experience with Java development
• Investment in Java infrastructure – Java EE application servers – JMX-‐based monitoring and management – Established data center processes and best practices – “We are a Java company”, or “We already do Java and .NET”
12
Copyright © 2014, Oracle and/or its affiliates. All rights reserved.
Project Avatar
13
Bridging the gap
AvatarNode on the JVM!
Thousands of Node libraries !Thousands of Java libraries
Java EE Interoperability!Leverage Existing Infrastructure!
Build Enterprise Applications in JavaScript!
Copyright © 2014, Oracle and/or its affiliates. All rights reserved.
Agenda
Setting the context
Avatar – Enterprise Node on the JVM
Demo
1
2
3
14
Copyright © 2014, Oracle and/or its affiliates. All rights reserved.
Avatar 2.0• 95% Node compatibility provided by Avatar.js • Uses same C portability libraries as Node.js – libuv, http-‐parser
• No Chrome v8 native APIs! • Run popular packages – Express, async, commander, etc.
15
Copyright © 2014, Oracle and/or its affiliates. All rights reserved.
Avatar 2.0• Enterprise Features – Advanced multithreading – State sharing – Avatar Persistence – Java EE Interoperability (EJB, JMS)
16
Copyright © 2014, Oracle and/or its affiliates. All rights reserved.
Avatar 2.0 -‐ What’s new• Runs standalone –Out of the box, no application server required
• Run from command line • Use your favorite Node framework(s) • Use your favorite client framework
17
Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 18
Avatar 2.0 Architecture
REST/WS/SSE
JVM
EclipseLink, NoSQL
Core Node Modules
Nashorn & JRE 8
Application JavaScript Modules & Java Jars
Mission Control
DatabaseData
WebLogicEJB/JMS
Admin AgentMgmt Plugin
libuv + JNI bindings
Java codeJavaScript codeApplication JavaScript & Java
Platform specific native code
WLS T3 thin client
Flight Recorder Probes
MBeans
Avatar
Avatar API Modules
Bundled Third-Party JavaScript Modules
Avatar Process
Optional Processes
Coherence CoherenceState
Copyright © 2014, Oracle and/or its affiliates. All rights reserved.
Nashorn!• Bundled with Java 7 and 8 • ECMAScript 5.1 compatibility • Performance (vs Rhino) • Java Interoperability
19
0
1,5
3
4,5
6
crypto earley-‐boyer mandreel pdas regexp splay
rhinonashorn jdk8nashorn jdk9
JavaScript Engine
Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 20
Nashorn -‐ Using Java 8 within a Node appvar http = require("http");!var list = new java.util.ArrayList();!!list.add("Blue"); list.add(“Green"); list.add("Yellow");!list.add("Red"); list.add("Dark Red"); list.add("Light Red”);!!http.createServer(function(request, response) {! response.writeHead(200, {"Content-Type": "application/json"});!! var count = list.parallelStream()! .filter(function(t) { return t.match('Red') } )! .count();!! response.end(“{'reds': count}”);!}).listen(8080);
Copyright © 2014, Oracle and/or its affiliates. All rights reserved.
Avatar Multithreading
• Multiple instances of an application in single JVM process – Each instance has its own event loop thread and JavaScript context – Shared sockets – every instance listens on the same port –Optional coordination via JavaScript state sharing APIs –Messaging API –Map API
• Can dynamically create background threads as well
21
Taking advantage of the multithreaded JVM
Copyright © 2014, Oracle and/or its affiliates. All rights reserved.
Avatar Application Scaling
22
A picture is worth a thousand threads
Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 23
var threads = require('avatar/threads');!!var createBallThread = function(ballInfo) {!! var deferred = when.defer();!! var eventThread = threads.newEventThread("BouncingBallThread", !! ! __dirname + "/ball.js", [!! ! ! "color=" + ballInfo.color,!! ! ! "gravity=" + ballInfo.gravity,!! ! ! "rowid=" + ballInfo.id_!! ! ]);!!! eventThread.start(function (event, error) {!! ! switch(event) {!! ! ! case "started":!! ! ! ! console.log("Thread ", eventThread.thread.index(), "Started");!! ! ! ! ballInfo.id = eventThread.thread.index();!…
Creating New Event Threads
Copyright © 2014, Oracle and/or its affiliates. All rights reserved.
Avatar Shared State Framework
• Message Bus – Publish / subscribe message passing
• Shared State – Simple map API – Application-‐scoped instance – Session-‐scoped instance • Named • Leased, with configurable timeout
• Avatar provides required serialization, concurrency control, and caching
24
Lightweight inter-‐thread communication
Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 25
bus.on("kill", function (id) {! if (_interval && _id && (_id.toString() === id.toString())) {! clearInterval(_interval);! process.exit();! }!});!!bus.subscribe("argsUpdate", function (data) {! if (data.id === app.threadIndex) {! gravity = data.gravity;! }!});
Message Bus (Subscribe)
Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 26
_interval = setInterval(function () {! var msg = {! id: _id, ! color: app.args.color,! heartbeat: heartbeat++, ! …! };!! msg.message = "Thread " + app.threadIndex + " | Heartbeat: " +! heartbeat + " | Gravity: " + gravity;!! bus.publish("messages", msg);!!}, 2000);
Message Bus (Publish)
Copyright © 2014, Oracle and/or its affiliates. All rights reserved.
• Supports Relational & NoSQL databases • Similar to Sequelize, JugglingDB, etc • Leverages EclipseLink JPA Provider • Leverages mature, feature rich Java ecosystem – Tooling to generate JavaScript model for existing database schema – 2nd level JPA cache (TopLink Grid) –Oracle RAC connection pooling, etc.
27
Avatar Persistence FrameworkJavaScript API
Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 28
Avatar Persistence (Model)var avatar = require("avatar");!var model = require("avatar/model");!!var store = model.newStore(config.db.name, {! database: config.db.database,! username: config.db.username,! properties: { "eclipselink.logging.level": “INFO” }!});!!var BallModel = model.newModel("Ball", {! "color": "string",! "gravity": "number"!});!!store.bind(BallModel);
Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 29
Avatar Persistence (Model)var avatar = require("avatar");!var model = require("avatar/model");!!var store = model.newStore(config.db.name, {! database: config.db.database,! username: config.db.username,! properties: { "eclipselink.logging.level": “INFO” }!});!!var BallModel = model.newModel("Ball", {! "color": "string",! "gravity": "number"!});!!store.bind(BallModel);
Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 30
Avatar Persistencereturn {!! getThreads: function() {!! ! return BallModel.getAll();!! },!! !
! createThread: function(thread) {!! ! return BallModel.create(aBall);!! },!! !
! deleteThread: function(id) {!! ! return BallModel.delete(id);!! },!! !
! updateThread: function(data) {!! ! var deferred = when.defer();!! ! BallModel.get(data.id_).then(function(row) {!! ! row.gravity = parseInt(data.gravity);!! ! BallModel.put(row).then(function(updatedRow) {
Copyright © 2014, Oracle and/or its affiliates. All rights reserved.
Additional Features and Potential• Expand Java Mission Control / Flight Recorder support • Remote EJB and JMS support – Using WebLogic t3 thin client
• Automatically reload application on file change (development feature) • Work in progress – Coherence (JCache) integration for cross-‐JVM state sharing –Manage using WebLogic and/or Oracle Enterprise Manager
31
Copyright © 2014, Oracle and/or its affiliates. All rights reserved.
Agenda
Setting the context
Avatar – Enterprise Node on the JVM
Demo
1
2
3
32
Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 33
Browser main.js ball.js . . . ball.js ball.js ball.js
newEventThread(‘ball.js’)
REST
WebSocket
Avatar Process
heartbeat gravity heartbeat heartbeat Message Bus
express.js ws.js avatar.js
model.js
Database
Demo
Copyright © 2014, Oracle and/or its affiliates. All rights reserved.
Next• Check Avatar - http://avatar.java.net
• We plan to open source Avatar 2.0 soon • We need your feedback! !• Thank You!
34
Copyright © 2014, Oracle and/or its affiliates. All rights reserved. |35