Avatar 2.0

32
David Delabassee (@delabassee) Oracle Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | Avatar 2.0 JFall 2014 1

description

Presented at J-Fall (Nov. 2014)

Transcript of Avatar 2.0

Page 1: Avatar 2.0

David  Delabassee  (@delabassee)  Oracle

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

Avatar  2.0J-­‐Fall  2014

1

Page 2: Avatar 2.0

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.

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

Page 3: Avatar 2.0

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

Java  EE

Java  Platform

Java  on  the  Server  SideAgenda

Page 4: Avatar 2.0

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

JavaScript

4

Java  EE

Java  Platform

Java  on  the  Server  SideAgenda

Page 5: Avatar 2.0

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: Avatar 2.0

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: Avatar 2.0

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: Avatar 2.0

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: Avatar 2.0

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: Avatar 2.0

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

Nashorn  Quick  Demo

10

Page 11: Avatar 2.0

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

Scaling  Server-­‐Side  JavaScript

11

Page 12: Avatar 2.0

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: Avatar 2.0

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: Avatar 2.0

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.

14

Page 15: Avatar 2.0

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)

15

Page 16: Avatar 2.0

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

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 17: Avatar 2.0

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

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 18: Avatar 2.0

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

18

Taking  advantage  of  the  multithreaded  JVM

Page 19: Avatar 2.0

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

Avatar  Application  Scaling

19

A  picture  is  worth  a  thousand  threads

Page 20: Avatar 2.0

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

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 21: Avatar 2.0

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

21

Lightweight  inter-­‐thread  communication

Page 22: Avatar 2.0

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

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 23: Avatar 2.0

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

_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 24: Avatar 2.0

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.

24

Avatar  Persistence  FrameworkJavaScript  API

Page 25: Avatar 2.0

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

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 26: Avatar 2.0

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

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 27: Avatar 2.0

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

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 28: Avatar 2.0

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

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 29: Avatar 2.0

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

29

Page 30: Avatar 2.0

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

Next• Check  Project  Avatar  (aka  “Avatar  1.0”)  - http://avatar.java.net    

• We  plan  to  open  source  Avatar  2.0  soon  • We  need  your  feedback!  !• Thank  You!

30

Page 31: Avatar 2.0

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

Page 32: Avatar 2.0