Server Side JavaScript on the Java Platform - David Delabassee

35
Copyright © 2014, Oracle and/or its affiliates. All rights reserved. Project Avatar Serverside JavaScript on the JVM JAX London Oct. 2014 David Delabassee (@delabassee) Oracle

Transcript of Server Side JavaScript on the Java Platform - David Delabassee

Page 1: Server Side JavaScript on the Java Platform - David Delabassee

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

Page 2: Server Side JavaScript on the Java Platform - David Delabassee

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

Page 3: Server Side JavaScript on the Java Platform - David Delabassee

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

Page 4: Server Side JavaScript on the Java Platform - David Delabassee

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

Page 5: Server Side JavaScript on the Java Platform - David Delabassee

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

Page 6: Server Side JavaScript on the Java Platform - David Delabassee

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

Page 7: Server Side JavaScript on the Java Platform - David Delabassee

Copyright  ©  2014,  Oracle  and/or  its  affiliates.  All  rights  reserved.    

Node.js  Programming    Model

7

var http = require("http");!!http.createServer( … ).listen(80);

Page 8: Server Side JavaScript on the Java Platform - David Delabassee

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);

Page 9: Server Side JavaScript on the Java Platform - David Delabassee

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

Page 10: Server Side JavaScript on the Java Platform - David Delabassee

Copyright  ©  2014,  Oracle  and/or  its  affiliates.  All  rights  reserved.    

Nashorn  Quick  Demo

10

Page 11: Server Side JavaScript on the Java Platform - David Delabassee

Copyright  ©  2014,  Oracle  and/or  its  affiliates.  All  rights  reserved.    

Scaling  Server-­‐Side  JavaScript

11

Page 12: Server Side JavaScript on the Java Platform - David Delabassee

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

Page 13: Server Side JavaScript on the Java Platform - David Delabassee

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!

Page 14: Server Side JavaScript on the Java Platform - David Delabassee

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

Page 15: Server Side JavaScript on the Java Platform - David Delabassee

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

Page 16: Server Side JavaScript on the Java Platform - David Delabassee

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

Page 17: Server Side JavaScript on the Java Platform - David Delabassee

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

Page 18: Server Side JavaScript on the Java Platform - David Delabassee

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

Page 19: Server Side JavaScript on the Java Platform - David Delabassee

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

Page 20: Server Side JavaScript on the Java Platform - David Delabassee

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);

Page 21: Server Side JavaScript on the Java Platform - David Delabassee

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

Page 22: Server Side JavaScript on the Java Platform - David Delabassee

Copyright  ©  2014,  Oracle  and/or  its  affiliates.  All  rights  reserved.    

Avatar  Application  Scaling

22

A  picture  is  worth  a  thousand  threads

Page 23: Server Side JavaScript on the Java Platform - David Delabassee

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

Page 24: Server Side JavaScript on the Java Platform - David Delabassee

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

Page 25: Server Side JavaScript on the Java Platform - David Delabassee

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)

Page 26: Server Side JavaScript on the Java Platform - David Delabassee

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)

Page 27: Server Side JavaScript on the Java Platform - David Delabassee

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

Page 28: Server Side JavaScript on the Java Platform - David Delabassee

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);

Page 29: Server Side JavaScript on the Java Platform - David Delabassee

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);

Page 30: Server Side JavaScript on the Java Platform - David Delabassee

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) {

Page 31: Server Side JavaScript on the Java Platform - David Delabassee

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

Page 32: Server Side JavaScript on the Java Platform - David Delabassee

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

Page 33: Server Side JavaScript on the Java Platform - David Delabassee

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

Page 34: Server Side JavaScript on the Java Platform - David Delabassee

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

Page 35: Server Side JavaScript on the Java Platform - David Delabassee

Copyright  ©  2014,  Oracle  and/or  its  affiliates.  All  rights  reserved.    |35