SlideShare uma empresa Scribd logo
1 de 37
Isomorphic Server/Client Ruby with Opal
Max Rozenoer
November, 2015
Our R&D problems started when we decided to
remove a couple letters from the company name.
You’d think it would be easy! We used to be called
GetTaxi, you see - and we provided only on-
demand taxis. Then we changed the name to Gett,
and now provide many kinds of on-demand services
(salads, flowers, pizzas, etc).
Intro
To make it possible to launch these new services
quickly, we did a lot of work in the last year. Part of
this work had to do with how each order can be
priced, since the pricing business logic has become
a lot more complex. This is what this talk is about.
Intro
Intro
Supplier App
iOS / Android
Customer App
iOS / Android
Server
So, customer has our Customer app installed,
Supplier has our supplier app installed.
Customer makes an order for something, it arrives
to the Supplier app, Supplier delivers the goods (in
case of a taxi ride the goods are the Customer
him/herself :))
Intro
So, how do we determine the price of an order?
Well, there is a Pricing Calculator library with
complicated business logic which dynamically
calculates the price of the order based on its current
properties.
Intro
Intro
Server
Pricing
Calculator
Supplier App
iOS / Android
Price: $XX
Normally this code runs on the server, and gets
pushed to or fetched by the client. However,
sometimes the client loses network connection right
at the end of an order which needs to be paid with
cash. Since in this case the supplier must
immediately collect the money from the client, the
ride must be priced right away, and without
network.
Problem
Problem
Server
Pricing
Calculator
Supplier App
iOS / Android
Price: ???
For this reason, we want to be able to run the
Pricing Calculator library locally on the client as a
fallback.
Problem
Problem
Server
Pricing
Calculator
Supplier App
iOS / Android
Pricing
Calculator
Initially, we ported this library to native
iOS/Android. But the library has complicated
business logic which changes often, so this
approach was costly, time-consuming and difficult
to maintain.
Problem
Solution
Isomorphic CodeServer
Client
Isomorphic code is code that runs on both the server
and client.
You probably heard of isomorphic code in the
context of Node.js web development (if not, see
isomorphic.net for more details).
Well, it’s easy there because in the context of
Node.js Javascript runs both on server and on the
client (browser).
Solution
But we love Ruby and want to develop and
maintain code in Ruby!
Alas, currently nothing beats Javascript when
executing on clients.
What to do? Opal: Ruby to Javascript compiler.
Solution
Solution: Opal!
Isomorphic CodeServer
Client
Ruby JavascriptOpal
opalrb.org
The Opal Open-source Project is a source-to-source
Ruby-to-Javascript compiler. It is similar to
Coffeescript in that it allows a web developer to
write her client code in something nicer than JS,
which then compiles to JS.
Unlike Coffeescript, Opal code needs a runtime to
run.
Opal
So, what is our flow for developing isomorphic
Ruby? It ships as a gem containing both Ruby code
and JS code.
Development Flow
Development Flow: Pricing Calculator Gem
1. Write Ruby Code
2. Run
+ Ruby Specs .
JS Code
3. Opal-Compile
5. Run
Minified JS Code
6. Minify
JS Specs
4. Opal -Compile
Truth be told, I didn’t have the time to quite get
steps 4 and 5 above to work, but in theory it should
be like this :)
Now, this seems like a lot. But steps 2-6 are done for
us automatically using the amazing Guard gem, so
all we have to do is write Ruby code + Ruby specs.
Development Flow
Development Flow: Pricing Calculator Gem
1. Write Ruby Code
2. Run
+ Ruby Specs .
JS Code
3. Compile
5. Run
Minified JS Code
6. Minify
Guard!JS Specs
4. Compile
7. Push!
In production, the Pricing Calculator gem is
deployed inside an App Server container (in our
case, Rails), which exposes several APIs.
Runtime Flow
Runtime Flow
App Server Container (Rails)
Pricing Calculator Gem
JS
Code
Ruby
Code
One API simply serves the static Opal Pricing
Calculator lib file, which is loaded by the client at
the beginning of a session, and loaded in a JS
Runtime.
On Android, the JS runtime we use is J2V8, on iOS
it’s an SDK Framework called JavascriptCore.
Runtime Flow
Supplier App
iOS / Android
Runtime Flow
App Server Container (Rails)
Pricing Calculator Gem
JS
Code
Ruby
Code
JS Runtime
JS Pricing
Calculator
Load JS
Pricing Calculator
The other exposed API is the regular API requesting
to perform server-side pricing calculation.
Runtime Flow
Supplier App
iOS / Android
Runtime Flow
App Server Container (Rails)
Pricing Calculator Gem
JS
Code
Ruby
Code
JS Runtime
JS Pricing
Calculator
Load JS
Pricing Calculator
Server-side
Calculation API
Generally the server-side calculation is the authority,
and the client-side calculation is a fallback in case
server is not available.
But also, during a taxi ride in some cases we want to
display a constantly updating taxi meter, and don’t
want to make so many calls to the server, so the
client-side library is also used for that.
Runtime Flow
So now we got the same code running on server and
on client. Will it produce the same results?
Wait, the capabilities of the execution contexts in
which the code runs might be different. For one thing,
we assumed that the client execution context might
not have any network. What if the Pricing Calculator
needs to make network calls?
Execution Context
Different Capabilities of Execution Context
Supplier App
Pricing
Calculator
(JS)
Pricing
Calculator
(Ruby)
Server
Network Call
Network Call
To solve this problem, we don’t make any network
calls from the library itself.
Instead, the library assumes that the runtime context
will provide a layer that produces the resources the
library needs.
Execution Context
In case of server execution context, it simply makes a
network call to fetch the resources.
In case of client execution context, it pre-fetches data
from the server so that (in some cases) it’s able to
“simulate” a network call without any network.
Execution Context
Runtime Context Layer
Pricing
Calculator
(Ruby)
Server
Runtime
Context
Layer
Supplier App
Pricing
Calculator
(JS)
Runtime
Context
Layer
Simulated
network call
via pre-
loaded
data
Network Call
Lessons Learned
● Solution is running in production for several
months
● Opal JS code is reliable and works well
Downsides:
○ Our JS lib weighs ~310Kb (60Kb zipped)
(80% is Opal base runtime)
Downsides (continued):
Isomorphic Ruby you write needs to be “Opal-
friendly”:
● Opal’s Ruby stdlib support is still far from
complete (e.g., “Time” has only a few
methods).
● Your Ruby needs to have no external gem
dependencies, since most gems are probably
not Opal-friendly.
Downsides (continued):
● Debugging is tough. Production JS exceptions
from minified code are unreadable - need to
write defensive code and raise your own
exceptions!
That’s all, Folks!
Max Rozenoer
we’re hiring!maxr@gett.com
This presentation on SlideShare: bit.ly/gett_isomorphic

Mais conteúdo relacionado

Mais procurados

Aws Patterns
Aws PatternsAws Patterns
Aws Patternsgarnaat
 
Testing Your App Before Launch: An Introduction to AWS Device Farm
Testing Your App Before Launch: An Introduction to AWS Device FarmTesting Your App Before Launch: An Introduction to AWS Device Farm
Testing Your App Before Launch: An Introduction to AWS Device FarmAmazon Web Services
 
Building your First GraphQL API with AWS AppSync
Building your First GraphQL API with AWS AppSyncBuilding your First GraphQL API with AWS AppSync
Building your First GraphQL API with AWS AppSyncAmazon Web Services
 
SpringPeople Introduction to HTML5 & CSS3
SpringPeople Introduction to HTML5 & CSS3SpringPeople Introduction to HTML5 & CSS3
SpringPeople Introduction to HTML5 & CSS3SpringPeople
 
Move fast and consumer driven contract test things
Move fast and consumer driven contract test thingsMove fast and consumer driven contract test things
Move fast and consumer driven contract test thingsAlon Pe'er
 
Signalr with ASP.Net part2
Signalr with ASP.Net part2Signalr with ASP.Net part2
Signalr with ASP.Net part2Esraa Ammar
 

Mais procurados (7)

PromisePipe inception
PromisePipe inceptionPromisePipe inception
PromisePipe inception
 
Aws Patterns
Aws PatternsAws Patterns
Aws Patterns
 
Testing Your App Before Launch: An Introduction to AWS Device Farm
Testing Your App Before Launch: An Introduction to AWS Device FarmTesting Your App Before Launch: An Introduction to AWS Device Farm
Testing Your App Before Launch: An Introduction to AWS Device Farm
 
Building your First GraphQL API with AWS AppSync
Building your First GraphQL API with AWS AppSyncBuilding your First GraphQL API with AWS AppSync
Building your First GraphQL API with AWS AppSync
 
SpringPeople Introduction to HTML5 & CSS3
SpringPeople Introduction to HTML5 & CSS3SpringPeople Introduction to HTML5 & CSS3
SpringPeople Introduction to HTML5 & CSS3
 
Move fast and consumer driven contract test things
Move fast and consumer driven contract test thingsMove fast and consumer driven contract test things
Move fast and consumer driven contract test things
 
Signalr with ASP.Net part2
Signalr with ASP.Net part2Signalr with ASP.Net part2
Signalr with ASP.Net part2
 

Destaque

Hello from Social Forces
Hello from Social ForcesHello from Social Forces
Hello from Social ForcesCarl Vervisch
 
Recipes from Punjab
Recipes from PunjabRecipes from Punjab
Recipes from Punjabrajdeepbains
 
Trademarks: A Primer
Trademarks: A PrimerTrademarks: A Primer
Trademarks: A PrimerL Torres
 
Momos and other recipes from Punjab
Momos and other recipes from PunjabMomos and other recipes from Punjab
Momos and other recipes from Punjabrajdeepbains
 
Visita institucional magenta
Visita institucional magentaVisita institucional magenta
Visita institucional magentaAngelitsantana
 
Producto 3 rivera castro julia leonor
Producto 3 rivera castro julia leonorProducto 3 rivera castro julia leonor
Producto 3 rivera castro julia leonor20852063
 
Ota webinar exporting to eu - logistics and fulfillment
Ota webinar   exporting to eu - logistics and fulfillmentOta webinar   exporting to eu - logistics and fulfillment
Ota webinar exporting to eu - logistics and fulfillmentJan Eyckmans
 
Kelas10 sosiologi elisanti_tintin
Kelas10 sosiologi elisanti_tintinKelas10 sosiologi elisanti_tintin
Kelas10 sosiologi elisanti_tintinw0nd0
 
Geologia clase xv -terremotos
Geologia   clase xv -terremotosGeologia   clase xv -terremotos
Geologia clase xv -terremotosMichael Corvent C
 
Lucio costa town planning
Lucio costa town planningLucio costa town planning
Lucio costa town planningDipesh Jain
 
modulus function
modulus functionmodulus function
modulus functionRACSOelimu
 
The art of Software Design
The art of Software DesignThe art of Software Design
The art of Software DesignThomas Pierrain
 

Destaque (20)

BV 20-SUMMER 2015-low
BV 20-SUMMER 2015-lowBV 20-SUMMER 2015-low
BV 20-SUMMER 2015-low
 
Hello from Social Forces
Hello from Social ForcesHello from Social Forces
Hello from Social Forces
 
Recipes from Punjab
Recipes from PunjabRecipes from Punjab
Recipes from Punjab
 
Trademarks: A Primer
Trademarks: A PrimerTrademarks: A Primer
Trademarks: A Primer
 
Momos and other recipes from Punjab
Momos and other recipes from PunjabMomos and other recipes from Punjab
Momos and other recipes from Punjab
 
Foro2014
Foro2014Foro2014
Foro2014
 
Visita institucional magenta
Visita institucional magentaVisita institucional magenta
Visita institucional magenta
 
Producto 3 rivera castro julia leonor
Producto 3 rivera castro julia leonorProducto 3 rivera castro julia leonor
Producto 3 rivera castro julia leonor
 
Does I.T matter?
Does I.T matter?Does I.T matter?
Does I.T matter?
 
Sonet-Bull: guida all'uso della piattaforma
Sonet-Bull: guida all'uso della piattaformaSonet-Bull: guida all'uso della piattaforma
Sonet-Bull: guida all'uso della piattaforma
 
Ota webinar exporting to eu - logistics and fulfillment
Ota webinar   exporting to eu - logistics and fulfillmentOta webinar   exporting to eu - logistics and fulfillment
Ota webinar exporting to eu - logistics and fulfillment
 
Kelas10 sosiologi elisanti_tintin
Kelas10 sosiologi elisanti_tintinKelas10 sosiologi elisanti_tintin
Kelas10 sosiologi elisanti_tintin
 
PRUEBA
PRUEBA PRUEBA
PRUEBA
 
Geologia clase xv -terremotos
Geologia   clase xv -terremotosGeologia   clase xv -terremotos
Geologia clase xv -terremotos
 
Arch417Niemeyer
Arch417NiemeyerArch417Niemeyer
Arch417Niemeyer
 
Ahmed kenawy C.V
Ahmed kenawy C.VAhmed kenawy C.V
Ahmed kenawy C.V
 
Lucio costa town planning
Lucio costa town planningLucio costa town planning
Lucio costa town planning
 
PPT Interaksi Sosial
PPT Interaksi SosialPPT Interaksi Sosial
PPT Interaksi Sosial
 
modulus function
modulus functionmodulus function
modulus function
 
The art of Software Design
The art of Software DesignThe art of Software Design
The art of Software Design
 

Semelhante a Isomorphic Server/Client Ruby with Opal

Building isomorphic java script apps faster with next.js
Building isomorphic java script apps faster with next.jsBuilding isomorphic java script apps faster with next.js
Building isomorphic java script apps faster with next.jsMadhav Chaturvedi
 
Introduction to meteor
Introduction to meteorIntroduction to meteor
Introduction to meteorNodeXperts
 
AngularJSTO presentation
AngularJSTO presentationAngularJSTO presentation
AngularJSTO presentationAlan Hietala
 
Reactive web applications using MeteorJS
Reactive web applications using MeteorJSReactive web applications using MeteorJS
Reactive web applications using MeteorJSNodeXperts
 
Node.js and the MEAN Stack Building Full-Stack Web Applications.pdf
Node.js and the MEAN Stack Building Full-Stack Web Applications.pdfNode.js and the MEAN Stack Building Full-Stack Web Applications.pdf
Node.js and the MEAN Stack Building Full-Stack Web Applications.pdflubnayasminsebl
 
Isomorphic JavaScript: #DevBeat Master Class
Isomorphic JavaScript: #DevBeat Master ClassIsomorphic JavaScript: #DevBeat Master Class
Isomorphic JavaScript: #DevBeat Master ClassSpike Brehm
 
End to end testing Single Page Apps & APIs with Cucumber.js and Puppeteer (Em...
End to end testing Single Page Apps & APIs with Cucumber.js and Puppeteer (Em...End to end testing Single Page Apps & APIs with Cucumber.js and Puppeteer (Em...
End to end testing Single Page Apps & APIs with Cucumber.js and Puppeteer (Em...Paul Jensen
 
How to Build a Big Data Application: Serverless Edition
How to Build a Big Data Application: Serverless EditionHow to Build a Big Data Application: Serverless Edition
How to Build a Big Data Application: Serverless Editionecobold
 
Js foo - Sept 8 upload
Js foo - Sept 8 uploadJs foo - Sept 8 upload
Js foo - Sept 8 uploadDebnath Sinha
 
Global Logic sMash Overview And Experiences
Global Logic   sMash  Overview And  ExperiencesGlobal Logic   sMash  Overview And  Experiences
Global Logic sMash Overview And ExperiencesProject Zero
 
How to Build a Big Data Application: Serverless Edition
How to Build a Big Data Application: Serverless EditionHow to Build a Big Data Application: Serverless Edition
How to Build a Big Data Application: Serverless EditionLecole Cole
 
In Pursuit of the Holy Grail: Building Isomorphic JavaScript Apps
In Pursuit of the Holy Grail: Building Isomorphic JavaScript AppsIn Pursuit of the Holy Grail: Building Isomorphic JavaScript Apps
In Pursuit of the Holy Grail: Building Isomorphic JavaScript AppsSpike Brehm
 
Practical WebAssembly with Apex, wasmRS, and nanobus
Practical WebAssembly with Apex, wasmRS, and nanobusPractical WebAssembly with Apex, wasmRS, and nanobus
Practical WebAssembly with Apex, wasmRS, and nanobusJarrod Overson
 
Developing Serverless Application on AWS
Developing Serverless Application on AWSDeveloping Serverless Application on AWS
Developing Serverless Application on AWSAmazon Web Services
 

Semelhante a Isomorphic Server/Client Ruby with Opal (20)

Building isomorphic java script apps faster with next.js
Building isomorphic java script apps faster with next.jsBuilding isomorphic java script apps faster with next.js
Building isomorphic java script apps faster with next.js
 
JakartaJS: Serverless in production
JakartaJS: Serverless in productionJakartaJS: Serverless in production
JakartaJS: Serverless in production
 
Introduction to meteor
Introduction to meteorIntroduction to meteor
Introduction to meteor
 
AngularJSTO presentation
AngularJSTO presentationAngularJSTO presentation
AngularJSTO presentation
 
Reactive web applications using MeteorJS
Reactive web applications using MeteorJSReactive web applications using MeteorJS
Reactive web applications using MeteorJS
 
Node.js and the MEAN Stack Building Full-Stack Web Applications.pdf
Node.js and the MEAN Stack Building Full-Stack Web Applications.pdfNode.js and the MEAN Stack Building Full-Stack Web Applications.pdf
Node.js and the MEAN Stack Building Full-Stack Web Applications.pdf
 
Isomorphic JavaScript: #DevBeat Master Class
Isomorphic JavaScript: #DevBeat Master ClassIsomorphic JavaScript: #DevBeat Master Class
Isomorphic JavaScript: #DevBeat Master Class
 
End to end testing Single Page Apps & APIs with Cucumber.js and Puppeteer (Em...
End to end testing Single Page Apps & APIs with Cucumber.js and Puppeteer (Em...End to end testing Single Page Apps & APIs with Cucumber.js and Puppeteer (Em...
End to end testing Single Page Apps & APIs with Cucumber.js and Puppeteer (Em...
 
Startups without Servers
Startups without ServersStartups without Servers
Startups without Servers
 
How to Build a Big Data Application: Serverless Edition
How to Build a Big Data Application: Serverless EditionHow to Build a Big Data Application: Serverless Edition
How to Build a Big Data Application: Serverless Edition
 
TorqueBox
TorqueBoxTorqueBox
TorqueBox
 
Js foo - Sept 8 upload
Js foo - Sept 8 uploadJs foo - Sept 8 upload
Js foo - Sept 8 upload
 
Global Logic sMash Overview And Experiences
Global Logic   sMash  Overview And  ExperiencesGlobal Logic   sMash  Overview And  Experiences
Global Logic sMash Overview And Experiences
 
Serverless: State Of the Union
Serverless: State Of the UnionServerless: State Of the Union
Serverless: State Of the Union
 
Serverless - State Of the Union
Serverless - State Of the UnionServerless - State Of the Union
Serverless - State Of the Union
 
How to Build a Big Data Application: Serverless Edition
How to Build a Big Data Application: Serverless EditionHow to Build a Big Data Application: Serverless Edition
How to Build a Big Data Application: Serverless Edition
 
In Pursuit of the Holy Grail: Building Isomorphic JavaScript Apps
In Pursuit of the Holy Grail: Building Isomorphic JavaScript AppsIn Pursuit of the Holy Grail: Building Isomorphic JavaScript Apps
In Pursuit of the Holy Grail: Building Isomorphic JavaScript Apps
 
Practical WebAssembly with Apex, wasmRS, and nanobus
Practical WebAssembly with Apex, wasmRS, and nanobusPractical WebAssembly with Apex, wasmRS, and nanobus
Practical WebAssembly with Apex, wasmRS, and nanobus
 
What's New in Serverless
What's New in ServerlessWhat's New in Serverless
What's New in Serverless
 
Developing Serverless Application on AWS
Developing Serverless Application on AWSDeveloping Serverless Application on AWS
Developing Serverless Application on AWS
 

Último

PVC VS. FIBERGLASS (FRP) GRAVITY SEWER - UNI BELL
PVC VS. FIBERGLASS (FRP) GRAVITY SEWER - UNI BELLPVC VS. FIBERGLASS (FRP) GRAVITY SEWER - UNI BELL
PVC VS. FIBERGLASS (FRP) GRAVITY SEWER - UNI BELLManishPatel169454
 
Call for Papers - International Journal of Intelligent Systems and Applicatio...
Call for Papers - International Journal of Intelligent Systems and Applicatio...Call for Papers - International Journal of Intelligent Systems and Applicatio...
Call for Papers - International Journal of Intelligent Systems and Applicatio...Christo Ananth
 
KubeKraft presentation @CloudNativeHooghly
KubeKraft presentation @CloudNativeHooghlyKubeKraft presentation @CloudNativeHooghly
KubeKraft presentation @CloudNativeHooghlysanyuktamishra911
 
Unit 1 - Soil Classification and Compaction.pdf
Unit 1 - Soil Classification and Compaction.pdfUnit 1 - Soil Classification and Compaction.pdf
Unit 1 - Soil Classification and Compaction.pdfRagavanV2
 
VIP Call Girls Palanpur 7001035870 Whatsapp Number, 24/07 Booking
VIP Call Girls Palanpur 7001035870 Whatsapp Number, 24/07 BookingVIP Call Girls Palanpur 7001035870 Whatsapp Number, 24/07 Booking
VIP Call Girls Palanpur 7001035870 Whatsapp Number, 24/07 Bookingdharasingh5698
 
Double rodded leveling 1 pdf activity 01
Double rodded leveling 1 pdf activity 01Double rodded leveling 1 pdf activity 01
Double rodded leveling 1 pdf activity 01KreezheaRecto
 
VIP Model Call Girls Kothrud ( Pune ) Call ON 8005736733 Starting From 5K to ...
VIP Model Call Girls Kothrud ( Pune ) Call ON 8005736733 Starting From 5K to ...VIP Model Call Girls Kothrud ( Pune ) Call ON 8005736733 Starting From 5K to ...
VIP Model Call Girls Kothrud ( Pune ) Call ON 8005736733 Starting From 5K to ...SUHANI PANDEY
 
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXssuser89054b
 
FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756
FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756
FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756dollysharma2066
 
AKTU Computer Networks notes --- Unit 3.pdf
AKTU Computer Networks notes ---  Unit 3.pdfAKTU Computer Networks notes ---  Unit 3.pdf
AKTU Computer Networks notes --- Unit 3.pdfankushspencer015
 
Online banking management system project.pdf
Online banking management system project.pdfOnline banking management system project.pdf
Online banking management system project.pdfKamal Acharya
 
Thermal Engineering-R & A / C - unit - V
Thermal Engineering-R & A / C - unit - VThermal Engineering-R & A / C - unit - V
Thermal Engineering-R & A / C - unit - VDineshKumar4165
 
Call Girls Wakad Call Me 7737669865 Budget Friendly No Advance Booking
Call Girls Wakad Call Me 7737669865 Budget Friendly No Advance BookingCall Girls Wakad Call Me 7737669865 Budget Friendly No Advance Booking
Call Girls Wakad Call Me 7737669865 Budget Friendly No Advance Bookingroncy bisnoi
 
Double Revolving field theory-how the rotor develops torque
Double Revolving field theory-how the rotor develops torqueDouble Revolving field theory-how the rotor develops torque
Double Revolving field theory-how the rotor develops torqueBhangaleSonal
 
ONLINE FOOD ORDER SYSTEM PROJECT REPORT.pdf
ONLINE FOOD ORDER SYSTEM PROJECT REPORT.pdfONLINE FOOD ORDER SYSTEM PROJECT REPORT.pdf
ONLINE FOOD ORDER SYSTEM PROJECT REPORT.pdfKamal Acharya
 
Call Girls Pimpri Chinchwad Call Me 7737669865 Budget Friendly No Advance Boo...
Call Girls Pimpri Chinchwad Call Me 7737669865 Budget Friendly No Advance Boo...Call Girls Pimpri Chinchwad Call Me 7737669865 Budget Friendly No Advance Boo...
Call Girls Pimpri Chinchwad Call Me 7737669865 Budget Friendly No Advance Boo...roncy bisnoi
 
Vivazz, Mieres Social Housing Design Spain
Vivazz, Mieres Social Housing Design SpainVivazz, Mieres Social Housing Design Spain
Vivazz, Mieres Social Housing Design Spaintimesproduction05
 

Último (20)

PVC VS. FIBERGLASS (FRP) GRAVITY SEWER - UNI BELL
PVC VS. FIBERGLASS (FRP) GRAVITY SEWER - UNI BELLPVC VS. FIBERGLASS (FRP) GRAVITY SEWER - UNI BELL
PVC VS. FIBERGLASS (FRP) GRAVITY SEWER - UNI BELL
 
Call for Papers - International Journal of Intelligent Systems and Applicatio...
Call for Papers - International Journal of Intelligent Systems and Applicatio...Call for Papers - International Journal of Intelligent Systems and Applicatio...
Call for Papers - International Journal of Intelligent Systems and Applicatio...
 
KubeKraft presentation @CloudNativeHooghly
KubeKraft presentation @CloudNativeHooghlyKubeKraft presentation @CloudNativeHooghly
KubeKraft presentation @CloudNativeHooghly
 
Unit 1 - Soil Classification and Compaction.pdf
Unit 1 - Soil Classification and Compaction.pdfUnit 1 - Soil Classification and Compaction.pdf
Unit 1 - Soil Classification and Compaction.pdf
 
VIP Call Girls Palanpur 7001035870 Whatsapp Number, 24/07 Booking
VIP Call Girls Palanpur 7001035870 Whatsapp Number, 24/07 BookingVIP Call Girls Palanpur 7001035870 Whatsapp Number, 24/07 Booking
VIP Call Girls Palanpur 7001035870 Whatsapp Number, 24/07 Booking
 
Double rodded leveling 1 pdf activity 01
Double rodded leveling 1 pdf activity 01Double rodded leveling 1 pdf activity 01
Double rodded leveling 1 pdf activity 01
 
VIP Model Call Girls Kothrud ( Pune ) Call ON 8005736733 Starting From 5K to ...
VIP Model Call Girls Kothrud ( Pune ) Call ON 8005736733 Starting From 5K to ...VIP Model Call Girls Kothrud ( Pune ) Call ON 8005736733 Starting From 5K to ...
VIP Model Call Girls Kothrud ( Pune ) Call ON 8005736733 Starting From 5K to ...
 
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
 
FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756
FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756
FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756
 
(INDIRA) Call Girl Meerut Call Now 8617697112 Meerut Escorts 24x7
(INDIRA) Call Girl Meerut Call Now 8617697112 Meerut Escorts 24x7(INDIRA) Call Girl Meerut Call Now 8617697112 Meerut Escorts 24x7
(INDIRA) Call Girl Meerut Call Now 8617697112 Meerut Escorts 24x7
 
Call Now ≽ 9953056974 ≼🔝 Call Girls In New Ashok Nagar ≼🔝 Delhi door step de...
Call Now ≽ 9953056974 ≼🔝 Call Girls In New Ashok Nagar  ≼🔝 Delhi door step de...Call Now ≽ 9953056974 ≼🔝 Call Girls In New Ashok Nagar  ≼🔝 Delhi door step de...
Call Now ≽ 9953056974 ≼🔝 Call Girls In New Ashok Nagar ≼🔝 Delhi door step de...
 
AKTU Computer Networks notes --- Unit 3.pdf
AKTU Computer Networks notes ---  Unit 3.pdfAKTU Computer Networks notes ---  Unit 3.pdf
AKTU Computer Networks notes --- Unit 3.pdf
 
Online banking management system project.pdf
Online banking management system project.pdfOnline banking management system project.pdf
Online banking management system project.pdf
 
Thermal Engineering-R & A / C - unit - V
Thermal Engineering-R & A / C - unit - VThermal Engineering-R & A / C - unit - V
Thermal Engineering-R & A / C - unit - V
 
Call Girls Wakad Call Me 7737669865 Budget Friendly No Advance Booking
Call Girls Wakad Call Me 7737669865 Budget Friendly No Advance BookingCall Girls Wakad Call Me 7737669865 Budget Friendly No Advance Booking
Call Girls Wakad Call Me 7737669865 Budget Friendly No Advance Booking
 
Double Revolving field theory-how the rotor develops torque
Double Revolving field theory-how the rotor develops torqueDouble Revolving field theory-how the rotor develops torque
Double Revolving field theory-how the rotor develops torque
 
ONLINE FOOD ORDER SYSTEM PROJECT REPORT.pdf
ONLINE FOOD ORDER SYSTEM PROJECT REPORT.pdfONLINE FOOD ORDER SYSTEM PROJECT REPORT.pdf
ONLINE FOOD ORDER SYSTEM PROJECT REPORT.pdf
 
Water Industry Process Automation & Control Monthly - April 2024
Water Industry Process Automation & Control Monthly - April 2024Water Industry Process Automation & Control Monthly - April 2024
Water Industry Process Automation & Control Monthly - April 2024
 
Call Girls Pimpri Chinchwad Call Me 7737669865 Budget Friendly No Advance Boo...
Call Girls Pimpri Chinchwad Call Me 7737669865 Budget Friendly No Advance Boo...Call Girls Pimpri Chinchwad Call Me 7737669865 Budget Friendly No Advance Boo...
Call Girls Pimpri Chinchwad Call Me 7737669865 Budget Friendly No Advance Boo...
 
Vivazz, Mieres Social Housing Design Spain
Vivazz, Mieres Social Housing Design SpainVivazz, Mieres Social Housing Design Spain
Vivazz, Mieres Social Housing Design Spain
 

Isomorphic Server/Client Ruby with Opal

  • 1. Isomorphic Server/Client Ruby with Opal Max Rozenoer November, 2015
  • 2. Our R&D problems started when we decided to remove a couple letters from the company name. You’d think it would be easy! We used to be called GetTaxi, you see - and we provided only on- demand taxis. Then we changed the name to Gett, and now provide many kinds of on-demand services (salads, flowers, pizzas, etc). Intro
  • 3. To make it possible to launch these new services quickly, we did a lot of work in the last year. Part of this work had to do with how each order can be priced, since the pricing business logic has become a lot more complex. This is what this talk is about. Intro
  • 4. Intro Supplier App iOS / Android Customer App iOS / Android Server
  • 5. So, customer has our Customer app installed, Supplier has our supplier app installed. Customer makes an order for something, it arrives to the Supplier app, Supplier delivers the goods (in case of a taxi ride the goods are the Customer him/herself :)) Intro
  • 6. So, how do we determine the price of an order? Well, there is a Pricing Calculator library with complicated business logic which dynamically calculates the price of the order based on its current properties. Intro
  • 8. Normally this code runs on the server, and gets pushed to or fetched by the client. However, sometimes the client loses network connection right at the end of an order which needs to be paid with cash. Since in this case the supplier must immediately collect the money from the client, the ride must be priced right away, and without network. Problem
  • 10. For this reason, we want to be able to run the Pricing Calculator library locally on the client as a fallback. Problem
  • 12. Initially, we ported this library to native iOS/Android. But the library has complicated business logic which changes often, so this approach was costly, time-consuming and difficult to maintain. Problem
  • 13. Solution Isomorphic CodeServer Client Isomorphic code is code that runs on both the server and client.
  • 14. You probably heard of isomorphic code in the context of Node.js web development (if not, see isomorphic.net for more details). Well, it’s easy there because in the context of Node.js Javascript runs both on server and on the client (browser). Solution
  • 15. But we love Ruby and want to develop and maintain code in Ruby! Alas, currently nothing beats Javascript when executing on clients. What to do? Opal: Ruby to Javascript compiler. Solution
  • 17. The Opal Open-source Project is a source-to-source Ruby-to-Javascript compiler. It is similar to Coffeescript in that it allows a web developer to write her client code in something nicer than JS, which then compiles to JS. Unlike Coffeescript, Opal code needs a runtime to run. Opal
  • 18. So, what is our flow for developing isomorphic Ruby? It ships as a gem containing both Ruby code and JS code. Development Flow
  • 19. Development Flow: Pricing Calculator Gem 1. Write Ruby Code 2. Run + Ruby Specs . JS Code 3. Opal-Compile 5. Run Minified JS Code 6. Minify JS Specs 4. Opal -Compile
  • 20. Truth be told, I didn’t have the time to quite get steps 4 and 5 above to work, but in theory it should be like this :) Now, this seems like a lot. But steps 2-6 are done for us automatically using the amazing Guard gem, so all we have to do is write Ruby code + Ruby specs. Development Flow
  • 21. Development Flow: Pricing Calculator Gem 1. Write Ruby Code 2. Run + Ruby Specs . JS Code 3. Compile 5. Run Minified JS Code 6. Minify Guard!JS Specs 4. Compile 7. Push!
  • 22. In production, the Pricing Calculator gem is deployed inside an App Server container (in our case, Rails), which exposes several APIs. Runtime Flow
  • 23. Runtime Flow App Server Container (Rails) Pricing Calculator Gem JS Code Ruby Code
  • 24. One API simply serves the static Opal Pricing Calculator lib file, which is loaded by the client at the beginning of a session, and loaded in a JS Runtime. On Android, the JS runtime we use is J2V8, on iOS it’s an SDK Framework called JavascriptCore. Runtime Flow
  • 25. Supplier App iOS / Android Runtime Flow App Server Container (Rails) Pricing Calculator Gem JS Code Ruby Code JS Runtime JS Pricing Calculator Load JS Pricing Calculator
  • 26. The other exposed API is the regular API requesting to perform server-side pricing calculation. Runtime Flow
  • 27. Supplier App iOS / Android Runtime Flow App Server Container (Rails) Pricing Calculator Gem JS Code Ruby Code JS Runtime JS Pricing Calculator Load JS Pricing Calculator Server-side Calculation API
  • 28. Generally the server-side calculation is the authority, and the client-side calculation is a fallback in case server is not available. But also, during a taxi ride in some cases we want to display a constantly updating taxi meter, and don’t want to make so many calls to the server, so the client-side library is also used for that. Runtime Flow
  • 29. So now we got the same code running on server and on client. Will it produce the same results? Wait, the capabilities of the execution contexts in which the code runs might be different. For one thing, we assumed that the client execution context might not have any network. What if the Pricing Calculator needs to make network calls? Execution Context
  • 30. Different Capabilities of Execution Context Supplier App Pricing Calculator (JS) Pricing Calculator (Ruby) Server Network Call Network Call
  • 31. To solve this problem, we don’t make any network calls from the library itself. Instead, the library assumes that the runtime context will provide a layer that produces the resources the library needs. Execution Context
  • 32. In case of server execution context, it simply makes a network call to fetch the resources. In case of client execution context, it pre-fetches data from the server so that (in some cases) it’s able to “simulate” a network call without any network. Execution Context
  • 33. Runtime Context Layer Pricing Calculator (Ruby) Server Runtime Context Layer Supplier App Pricing Calculator (JS) Runtime Context Layer Simulated network call via pre- loaded data Network Call
  • 34. Lessons Learned ● Solution is running in production for several months ● Opal JS code is reliable and works well Downsides: ○ Our JS lib weighs ~310Kb (60Kb zipped) (80% is Opal base runtime)
  • 35. Downsides (continued): Isomorphic Ruby you write needs to be “Opal- friendly”: ● Opal’s Ruby stdlib support is still far from complete (e.g., “Time” has only a few methods). ● Your Ruby needs to have no external gem dependencies, since most gems are probably not Opal-friendly.
  • 36. Downsides (continued): ● Debugging is tough. Production JS exceptions from minified code are unreadable - need to write defensive code and raise your own exceptions!
  • 37. That’s all, Folks! Max Rozenoer we’re hiring!maxr@gett.com This presentation on SlideShare: bit.ly/gett_isomorphic

Notas do Editor

  1. The problems started when we decided to remove a couple letters from the company name. We used to be called GetTaxi, you see - and we provided only on-demand taxis. Then we changed the name to Gett, and now provide many kinds of on-demand services (salads, flowers, pizzas, etc). To make it possible to launch these new services quickly, we did a lot of work in the last year, and part of this work had to do with how each order can be priced, which is what this talk is about.
  2. We package the Pricing Calculator as a gem that ships both Ruby and JS code. Development flow is driven by https://github.com/guard/guard .
  3. Generally, the server-side calculation is the authority, and the client-side calculation is a fallback in case server is not available. However, during a taxi ride in some cases we want to display a constantly updating taxi meter, and don’t want to make so many calls to the server, so the client-side library is also used for that. On Android, the JS runtime we use is J2V8, on iOS it’s an SDK Framework called JavascriptCore.
  4. Generally, the server-side calculation is the authority, and the client-side calculation is a fallback in case server is not available. However, during a taxi ride in some cases we want to display a constantly updating taxi meter, and don’t want to make so many calls to the server, so the client-side library is also used for that.