SlideShare a Scribd company logo
1 of 65
Download to read offline
BUILDING REAL-TIME
APP
By Steven Yap
Futureworkz Pte. Ltd.
StevenYap
stevenyap@futureworkz.com
https://github.com/stevenyap
• Host Saigon.rb Ruby Meetup
• Co-Founder of Futureworkz
• Ruby on Rails coder
• Agile startup consultant
Awesome Ruby on Rails Development
http://www.futureworkz.com
http://playbook.futureworkz.com/
WHAT IS A REAL-TIME
APP?
“the real-time web consists in making the client
interface (or the web side; or the web layer) of
a web application, to communicate
continuously with the corresponding real-time
server, during every user connection.
wikipedia.org/wiki/Real-time_web
USERS DON'T NEED TO
REFRESH THE APP TO
GET NEW DATA
HOW DO YOU?
Use Cases Development Effort
Build a real time To-do list app in your mind
A husband and wife shares the same to-do list
Wife creates a to-do item "Buy fruits"
Husband sees the new item (without refreshing!)
Husband sees the total number of 

items of the list is now 1
Husband refactor the item from "Buy fruits"

to "Buy apples" and "Buy oranges"
Wife sees the "Buy fruits" is changed to 

"Buy apples" and sees a new item "Buy oranges"
Wife sees the total number of items is now 2
Wife deletes "Buy oranges"
HOW DO YOU?
Use Cases Development Effort
Build a real time To-do list app in your mind Setup Rails
A husband and wife shares the same to-do list
Wife creates a to-do item "Buy fruits"
Husband sees the new item (without refreshing!)
Husband sees the total number of 

items of the list is now 1
Husband refactor the item from "Buy fruits"

to "Buy apples" and "Buy oranges"
Wife sees the "Buy fruits" is changed to 

"Buy apples" and sees a new item "Buy oranges"
Wife sees the total number of items is now 2
Wife deletes "Buy oranges"
HOW DO YOU?
Use Cases Development Effort
Build a real time To-do list app in your mind Setup Rails
A husband and wife shares the same to-do list Setup WebSocket
Wife creates a to-do item "Buy fruits"
Husband sees the new item (without refreshing!)
Husband sees the total number of 

items of the list is now 1
Husband refactor the item from "Buy fruits"

to "Buy apples" and "Buy oranges"
Wife sees the "Buy fruits" is changed to 

"Buy apples" and sees a new item "Buy oranges"
Wife sees the total number of items is now 2
Wife deletes "Buy oranges"
HOW DO YOU?
Use Cases Development Effort
Build a real time To-do list app in your mind Setup Rails
A husband and wife shares the same to-do list Setup WebSocket
Wife creates a to-do item "Buy fruits" API create item
Husband sees the new item (without refreshing!)
Husband sees the total number of 

items of the list is now 1
Husband refactor the item from "Buy fruits"

to "Buy apples" and "Buy oranges"
Wife sees the "Buy fruits" is changed to 

"Buy apples" and sees a new item "Buy oranges"
Wife sees the total number of items is now 2
Wife deletes "Buy oranges"
HOW DO YOU?
Use Cases Development Effort
Build a real time To-do list app in your mind Setup Rails
A husband and wife shares the same to-do list Setup WebSocket
Wife creates a to-do item "Buy fruits" API create item
Husband sees the new item (without refreshing!)
Find husband, broadcast item data and update
view
Husband sees the total number of 

items of the list is now 1
Husband refactor the item from "Buy fruits"

to "Buy apples" and "Buy oranges"
Wife sees the "Buy fruits" is changed to 

"Buy apples" and sees a new item "Buy oranges"
Wife sees the total number of items is now 2
Wife deletes "Buy oranges"
HOW DO YOU?
Use Cases Development Effort
Build a real time To-do list app in your mind Setup Rails
A husband and wife shares the same to-do list Setup WebSocket
Wife creates a to-do item "Buy fruits" API create item
Husband sees the new item (without refreshing!)
Find husband, broadcast item data and update
view
Husband sees the total number of 

items of the list is now 1
Find husband, broadcast count data and update
view
Husband refactor the item from "Buy fruits"

to "Buy apples" and "Buy oranges"
Wife sees the "Buy fruits" is changed to 

"Buy apples" and sees a new item "Buy oranges"
Wife sees the total number of items is now 2
Wife deletes "Buy oranges"
HOW DO YOU?
Use Cases Development Effort
Build a real time To-do list app in your mind Setup Rails
A husband and wife shares the same to-do list Setup WebSocket
Wife creates a to-do item "Buy fruits" API create item
Husband sees the new item (without refreshing!)
Find husband, broadcast item data and update
view
Husband sees the total number of 

items of the list is now 1
Find husband, broadcast count data and update
view
Husband refactor the item from "Buy fruits"

to "Buy apples" and "Buy oranges"
API update item and create item
Wife sees the "Buy fruits" is changed to 

"Buy apples" and sees a new item "Buy oranges"
Wife sees the total number of items is now 2
Wife deletes "Buy oranges"
HOW DO YOU?
Use Cases Development Effort
Build a real time To-do list app in your mind Setup Rails
A husband and wife shares the same to-do list Setup WebSocket
Wife creates a to-do item "Buy fruits" API create item
Husband sees the new item (without refreshing!)
Find husband, broadcast item data and update
view
Husband sees the total number of 

items of the list is now 1
Find husband, broadcast count data and update
view
Husband refactor the item from "Buy fruits"

to "Buy apples" and "Buy oranges"
API update item and create item
Wife sees the "Buy fruits" is changed to 

"Buy apples" and sees a new item "Buy oranges"
Find wife, broadcast changes and update the
view
Wife sees the total number of items is now 2
Wife deletes "Buy oranges"
HOW DO YOU?
Use Cases Development Effort
Build a real time To-do list app in your mind Setup Rails
A husband and wife shares the same to-do list Setup WebSocket
Wife creates a to-do item "Buy fruits" API create item
Husband sees the new item (without refreshing!)
Find husband, broadcast item data and update
view
Husband sees the total number of 

items of the list is now 1
Find husband, broadcast count data and update
view
Husband refactor the item from "Buy fruits"

to "Buy apples" and "Buy oranges"
API update item and create item
Wife sees the "Buy fruits" is changed to 

"Buy apples" and sees a new item "Buy oranges"
Find wife, broadcast changes and update the
view
Wife sees the total number of items is now 2
Broadcast to wife and update the count
Wife deletes "Buy oranges"
HOW DO YOU?
Use Cases Development Effort
Build a real time To-do list app in your mind Setup Rails
A husband and wife shares the same to-do list Setup WebSocket
Wife creates a to-do item "Buy fruits" API create item
Husband sees the new item (without refreshing!)
Find husband, broadcast item data and update
view
Husband sees the total number of 

items of the list is now 1
Find husband, broadcast count data and update
view
Husband refactor the item from "Buy fruits"

to "Buy apples" and "Buy oranges"
API update item and create item
Wife sees the "Buy fruits" is changed to 

"Buy apples" and sees a new item "Buy oranges"
Find wife, broadcast changes and update the
view
Wife sees the total number of items is now 2
Broadcast to wife and update the count
Wife deletes "Buy oranges"
API delete item, find husband, broadcast item
data, broadcast count data and update the view
DIFFICULTIES IN BUILDING REAL TIME APP
➤ Managing a constant connection between client and server (Long polling or
WebSocket)
➤ Messy code to update view via DOM manipulation (prepend, append, change
HTML content, remove element)
➤ Messy code to push new changes to the correct clients
➤ Finding the correct clients and WebSocket channels
➤ Detect changes in item count
➤ If a model can update another model, then a view can update a model, which
updates another model, and this, in turn, might cause another view to update.
➤ Total number of items in a list
➤ Total number of items by husband
➤ Total number of items by wife
➤ New item created by mistress in a shared list with husband
A PROPOSED SOLUTION - R4
➤ Rails 5 ActionCable
➤ RethinkDB
➤ ReactJS
➤ Redux
RAILS 5 - ACTIONCABLE
RAILS 5 - ACTIONCABLE
➤ WebSocket is a bi-directional real-time communication
between client and server
➤ It is a persistent connection between server and browser
➤ Server can send data to browser
➤ Browser can send data back to server
➤ Rails 5 ActionCable makes it "easy" to setup WebSocket
RAILS 5 - ACTIONCABLE
$ gem install rails --pre --no-ri --no-rdoc --api
RAILS 5 - ACTIONCABLE
$ gem install rails --pre --no-ri --no-rdoc --api
#	app/channels/todos_channel.rb	
class	TodosChannel	<	ApplicationCable::Channel		
		def	subscribed		
				stream_from	'todo'	
		end	
end
RAILS 5 - ACTIONCABLE
$ gem install rails --pre --no-ri --no-rdoc --api
#	app/channels/todos_channel.rb	
class	TodosChannel	<	ApplicationCable::Channel		
		def	subscribed		
				stream_from	'todo'	
		end	
end	
#	Send	a	message	to	client	
ActionCable.server.broadcast('todo',	{task:	'Buy	
Apples'})
RAILS 5 - ACTIONCABLE
//	Javascript	
App.cable.subscriptions.create('TodosChannel',	{	
		received:	(data)	=>	{	
				console.log(data)	
		}	
})
RAILS 5 - ACTIONCABLE
# app/channels/todos_channel.rb
class	TodosChannel	<	ApplicationCable::Channel		
		def	subscribed		
				stream_from	'todo'	
		end	
		def	create(data)	
				todo	=	Todo.new(data)	
				if	todo.save	
						ActionCable.server.broadcast('todo',	todo)	
				else	
						ActionCable.server.broadcast('todo',	'Save	failed')	
				end	
		end	
end
RAILS 5 - ACTIONCABLE
//	Javascript	
App.cable.subscriptions.create('TodosChannel',	{	
		received:	(data)	=>	{	
				console.log(data)	
		},	
		onSubmit:	(task)	=>	{	
				//	send	data	back	to	server	
				//	calls	TodosChannel#create	
				//	with	data	=	{	task:	task	}	
				this.perform('create',	{	task:	task	})	
		}	
})
RAILS 5 - ACTIONCABLE
➤ Two kinds of broadcast:
➤ Operation broadcast (CRUD)
➤ Notification broadcast
➤ Operation broadcast is easy - simply broadcast back the result
➤ Notification broadcast is messy
➤ A todo item created
➤ Broadcast to wife/husband - which channel? which stream?
➤ Broadcast the new count - which channel? which stream?
➤ Broadcast to others - which channel? which stream?
➤ Code found in Channel/Controller/Model/Job/etc
RETHINKDB
RETHINKDB
➤ Open Source NoSQL database
➤ Stream changes to server for any changes in data
➤ Instead of finding all the channels to broadcast to, we simply
put all notification broadcasting in our channel#subscribed
RETHINKDB SETUP
#	Gemfile	
gem	'nobrainer'	
$	rails	g	nobrainer:install
RETHINKDB SETUP
#	models/todo.rb	
class	Todo	
		include	NoBrainer::Document	
		include	NoBrainer::Document::Timestamps	
		field	:task,						type:	String,			required:	true	
		field	:completed,	type:	Boolean,		required:	true	
end
RETHINKDB SETUP
#	models/todo.rb	
class	Todo	
		include	NoBrainer::Document	
		include	NoBrainer::Document::Timestamps	
		field	:task,						type:	String,			required:	true	
		field	:completed,	type:	Boolean,		required:	true	
end	
#	Use	it	like	ActiveRecord!	(mostly)	
todo	=	Todo.new({task:	'Buy	apples',	completed:	
false})	
todo.save	
todo.errors.full_messages
SUBSCRIBE TO CHANGES
#	app/channels/todos_channel.rb	
class	TodosChannel	<	ApplicationCable::Channel		
		def	subscribed		
				stream_from	'todo'	
				Todo.all.raw.changes.each	do	|changes|	
						ActionCable.server.broadcast(@stream,	changes)	
				end	
		end	
			
		#	...	
end
CHANGES STREAM
#	create	a	todo		
{	
		"new_val"	=>	{					
				"id"	=>	"3SGzWZLEdC2D6P",		
				"task"	=>	"buy	oranges",		
				"completed"	=>	false,		
				"created_at"	=>	2016	-	06	-	07	07:	31:	47	+	0000,	
				"updated_at"	=>	2016	-	06	-	07	07:	31:	47	+	0000	
		},	
		"old_val"	=>	nil	
}
CHANGES STREAM
#	update	a	todo		
{	
		"new_val"	=>	{	
				"id"	=>	"3SEIgBkmjHNuNy",		
				"task"	=>	"buy	oranges",		
				"completed"	=>	false,		
				"created_at"	=>	2016	-	06	-	07	03:	12:	40	+	0000,		
				"updated_at"	=>	2016	-	06	-	07	07:	32:	40	+	0000	
		},		
		"old_val"	=>	{	
				"id"	=>	"3SEIgBkmjHNuNy",		
				"task"	=>	"buy	apples",		
				"completed"	=>	false,		
				"created_at"	=>	2016	-	06	-	07	03:	12:	40	+	0000,		
				"updated_at"	=>	2016	-	06	-	07	07:	32:	24	+	0000	
		}	
}
CHANGES STREAM
#	destroy	a	todo		
{	
		"new_val"	=>	nil,		
		"old_val"	=>	{	
				"id"	=>	"3SEIgBkmjHNuNy",		
				"task"	=>	"buy	oranges",		
				"completed"	=>	false,		
				"created_at"	=>	2016	-	06	-	07	03:	12:	40	+	0000,		
				"updated_at"	=>	2016	-	06	-	07	07:	32:	40	+	0000	
		}	
}
RETHINKDB
➤ Notification broadcasting only occurs in channel subscription
from RethinkDB
➤ Not hidden in Active Record, Active Job, controllers, channel
subscriptions, etc
➤ Single source of notification broadcast
REACTJS
REACTJS
➤ Given a set of data, it will render
➤ When the set of data changes, it will automatically re-render
➤ Declarative style, easy to see how the view will turn out
➤ Easy to reason how data is transformed into view
REACTJS WALKTHROUGH
REACTJS
➤ Given a fixed data, ReactJS will always render correctly
➤ We can make ReactJS deal with rendering only
➤ Can we extract all data/state management to another place?
REDUX
REDUX
➤ Gives the state of entire frontend in a JS Object
➤ When the data changes, it creates a new state and pass to all
the React components to re-render (if necessary)
➤ Extracts away all data logic from React
➤ React renders purely based on the state from Redux
➤ Single source of truth for React
REDUX
#	Initial	State	
state	=	{	
		todos:	[]	
}	
#	React	Renders	nothing
REDUX
#	New	Message	to	reducers	
{	
		id:	"3SEIgBkmjHNuNy",		
		task:	"buy	apple",		
		completed:	false	
}
REDUX
#	New	Message	to	reducers	
{	
		id:	"3SEIgBkmjHNuNy",		
		task:	"buy	apple",		
		completed:	false	
}	
#	New	State	
state	=	{	
		todos:	[	
				{	
						id:	"3SEIgBkmjHNuNy",		
						task:	"buy	apple",		
						completed:	false	
				}	
		]	
}
REDUX
#	New	Message	to	reducers	
{	
		id:	"3SEIgBkmjHNuNy",		
		task:	"buy	apple",		
		completed:	false	
}	
#	New	State	
state	=	{	
		todos:	[	
				{	
						id:	"3SEIgBkmjHNuNy",		
						task:	"buy	apple",		
						completed:	false	
				}	
		]	
}	
#	React	Renders	
<p>buy	apple</p>
REDUX
#	New	Message	to	reducers	
{	
		id:	"3SGzWZLEdC2D6P",		
		task:	"buy	oranges",		
		completed:	false	
}
REDUX
#	New	Message	to	reducers	
{	
		id:	"3SGzWZLEdC2D6P",		
		task:	"buy	oranges",		
		completed:	false	
}	
#	New	State	
state	=	{	
		todos:	[	
				{	
						id:	"3SEIgBkmjHNuNy",		
						task:	"buy	apple",		
						completed:	false	
				},		
				{	
						id:	"3SGzWZLEdC2D6P",		
						task:	"buy	oranges",		
						completed:	false	
				}	
		]	
}
REDUX
#	New	Message	to	reducers	
{	
		id:	"3SGzWZLEdC2D6P",		
		task:	"buy	oranges",		
		completed:	false	
}	
#	New	State	
state	=	{	
		todos:	[	
				{	
						id:	"3SEIgBkmjHNuNy",		
						task:	"buy	apple",		
						completed:	false	
				},		
				{	
						id:	"3SGzWZLEdC2D6P",		
						task:	"buy	oranges",		
						completed:	false	
				}	
		]	
}	
#	React	Renders	
<p>buy	apple</p>	
<p>buy	oranges</p>
REDUX
#	New	Message	to	reducers	
{	
		id:	"3SxIYBkmjUnxms",		
		task:	"buy	pears",		
		completed:	false	
}
REDUX
#	New	Message	to	reducers	
{	
		id:	"3SxIYBkmjUnxms",		
		task:	"buy	pears",		
		completed:	false	
}	
#	New	State	
state	=	{	
		todos:	[	
				{	
						id:	"3SEIgBkmjHNuNy",		
						task:	"buy	apple",		
						completed:	false	
				},		
				{	
						id:	"3SGzWZLEdC2D6P",		
						task:	"buy	oranges",		
						completed:	false	
				},		
				{	
						id:	"3SxIYBkmjUnxms",		
						task:	"buy	pears",		
						completed:	false	
				}	
		]	
}
REDUX
#	New	Message	to	reducers	
{	
		id:	"3SxIYBkmjUnxms",		
		task:	"buy	pears",		
		completed:	false	
}	
#	New	State	
state	=	{	
		todos:	[	
				{	
						id:	"3SEIgBkmjHNuNy",		
						task:	"buy	apple",		
						completed:	false	
				},		
				{	
						id:	"3SGzWZLEdC2D6P",		
						task:	"buy	oranges",		
						completed:	false	
				},		
				{	
						id:	"3SxIYBkmjUnxms",		
						task:	"buy	pears",		
						completed:	false	
				}	
		]	
}	
#	React	Renders	
<p>buy	apple</p>	
<p>buy	oranges</p>	
<p>buy	pears</p>
CONNECTING REDUX &
REACTJS
WIRING THEM UP
➤ ReactJS is (almost)
pure functions of view
➤ Redux is the single
source of truth for
frontend data
➤ Rails provides the
business logic and
WebSocket connection
➤ RethinkDB is the
single source of
broadcast
RethinkDB
Rails
Redux
ReactJS
dispatch
perform
broadcast
BENEFITS
➤ Separation of concerns
➤ Easier to subscribe to multiple data changes
➤ Increased use of WebSocket
➤ Real-time app made easy!
FOOD FOR THOUGHT
➤ Using Opal for frontend React/Redux
➤ Pure frontend vs monolithic app
➤ Redux + React Native mobile development

with Rails + Rethinkdb backend
➤ Storing Redux state in backend vs frontend
➤ Websocket vs HTTP
USING OPAL FOR FRONTEND REACT/REDUX
➤ Ruby everywhere!
➤ Isomorphic app - share code between frontend and backend
PURE FRONTEND (REDUX + REACTJS) VS MONOLITHIC APP
➤ Enjoy the goodness of frontend development
➤ Separation of concern between frontend and backend
REDUX + REACT NATIVE MOBILE DEVELOPMENT WITH RAILS + RETHINKDB BACKEND
➤ React = "Learn once, write every where"
➤ ReactJS is very similar to React Native
➤ Easy to onboard web developers onto mobile developments
➤ Enjoy hot reloading, code push, etc
STORING REDUX STATE IN BACKEND VS FRONTEND
➤ Persist frontend state in backend
➤ Write reducers in Ruby!
➤ Faster performance in calculating new state
➤ Stream state diff to frontend
WEBSOCKET VS HTTP API
➤ WebSocket is bi-directional
➤ Why do we need to call HTTP API?
➤ Less overhead, faster response
➤ HTTP - fetch and wait and response
➤ WebSocket - push to server and react on response
RESOURCES
➤ https://github.com/rails/rails/tree/master/actioncable
➤ https://www.rethinkdb.com/docs/guide/ruby/
➤ https://facebook.github.io/react/docs/thinking-in-react.html
➤ http://redux.js.org/index.html
➤ https://egghead.io/courses/getting-started-with-redux

More Related Content

What's hot

Every Api Needs a Product Manager • Mailjet
Every Api Needs a Product Manager • Mailjet Every Api Needs a Product Manager • Mailjet
Every Api Needs a Product Manager • Mailjet Molino de Ideas
 
Develop Like a Designer: The Art of APIs
Develop Like a Designer: The Art of APIsDevelop Like a Designer: The Art of APIs
Develop Like a Designer: The Art of APIsJenny Wanger
 
All the world's a stage – the next step in automated testing practices
All the world's a stage – the next step in automated testing practicesAll the world's a stage – the next step in automated testing practices
All the world's a stage – the next step in automated testing practicesJohn Ferguson Smart Limited
 
TDC2016SP - Otimização Prematura: a Raíz de Todo o Mal
TDC2016SP - Otimização Prematura: a Raíz de Todo o MalTDC2016SP - Otimização Prematura: a Raíz de Todo o Mal
TDC2016SP - Otimização Prematura: a Raíz de Todo o Maltdc-globalcode
 
Handling Changes to Your Server-Side Data Model
Handling Changes to Your Server-Side Data ModelHandling Changes to Your Server-Side Data Model
Handling Changes to Your Server-Side Data ModelGilt Tech Talks
 
iOS Testing With Appium at Gilt
iOS Testing With Appium at GiltiOS Testing With Appium at Gilt
iOS Testing With Appium at GiltGilt Tech Talks
 
What Makes a Great Open API?
What Makes a Great Open API?What Makes a Great Open API?
What Makes a Great Open API?John Musser
 
The Null Object Pattern
The Null Object PatternThe Null Object Pattern
The Null Object Patternmodern_legend
 
Technical SEO for a Mobile First World
Technical SEO for a Mobile First WorldTechnical SEO for a Mobile First World
Technical SEO for a Mobile First WorldKaizen
 

What's hot (9)

Every Api Needs a Product Manager • Mailjet
Every Api Needs a Product Manager • Mailjet Every Api Needs a Product Manager • Mailjet
Every Api Needs a Product Manager • Mailjet
 
Develop Like a Designer: The Art of APIs
Develop Like a Designer: The Art of APIsDevelop Like a Designer: The Art of APIs
Develop Like a Designer: The Art of APIs
 
All the world's a stage – the next step in automated testing practices
All the world's a stage – the next step in automated testing practicesAll the world's a stage – the next step in automated testing practices
All the world's a stage – the next step in automated testing practices
 
TDC2016SP - Otimização Prematura: a Raíz de Todo o Mal
TDC2016SP - Otimização Prematura: a Raíz de Todo o MalTDC2016SP - Otimização Prematura: a Raíz de Todo o Mal
TDC2016SP - Otimização Prematura: a Raíz de Todo o Mal
 
Handling Changes to Your Server-Side Data Model
Handling Changes to Your Server-Side Data ModelHandling Changes to Your Server-Side Data Model
Handling Changes to Your Server-Side Data Model
 
iOS Testing With Appium at Gilt
iOS Testing With Appium at GiltiOS Testing With Appium at Gilt
iOS Testing With Appium at Gilt
 
What Makes a Great Open API?
What Makes a Great Open API?What Makes a Great Open API?
What Makes a Great Open API?
 
The Null Object Pattern
The Null Object PatternThe Null Object Pattern
The Null Object Pattern
 
Technical SEO for a Mobile First World
Technical SEO for a Mobile First WorldTechnical SEO for a Mobile First World
Technical SEO for a Mobile First World
 

Viewers also liked

React on rails v6.1 at LA Ruby, November 2016
React on rails v6.1 at LA Ruby, November 2016React on rails v6.1 at LA Ruby, November 2016
React on rails v6.1 at LA Ruby, November 2016Justin Gordon
 
SQL vs NoSQL: 
проблема выбора
SQL vs NoSQL: 
проблема выбораSQL vs NoSQL: 
проблема выбора
SQL vs NoSQL: 
проблема выбораTKConf
 
Writing Once: Multi-client code sharing in ReactJS
Writing Once: Multi-client code sharing in ReactJSWriting Once: Multi-client code sharing in ReactJS
Writing Once: Multi-client code sharing in ReactJSColin Vernon
 
how-to-disappear-from-the-web
how-to-disappear-from-the-webhow-to-disappear-from-the-web
how-to-disappear-from-the-webRussell Ford
 
RethinkDB - the open-source database for the realtime web
RethinkDB - the open-source database for the realtime webRethinkDB - the open-source database for the realtime web
RethinkDB - the open-source database for the realtime webAlex Ivanov
 
Enterprise Architectures with Ruby (and Rails)
Enterprise Architectures with Ruby (and Rails)Enterprise Architectures with Ruby (and Rails)
Enterprise Architectures with Ruby (and Rails)Konstantin Gredeskoul
 
From Obvious to Ingenius: Incrementally Scaling Web Apps on PostgreSQL
From Obvious to Ingenius: Incrementally Scaling Web Apps on PostgreSQLFrom Obvious to Ingenius: Incrementally Scaling Web Apps on PostgreSQL
From Obvious to Ingenius: Incrementally Scaling Web Apps on PostgreSQLKonstantin Gredeskoul
 

Viewers also liked (9)

React on rails v6.1 at LA Ruby, November 2016
React on rails v6.1 at LA Ruby, November 2016React on rails v6.1 at LA Ruby, November 2016
React on rails v6.1 at LA Ruby, November 2016
 
React on rails v4
React on rails v4React on rails v4
React on rails v4
 
SQL vs NoSQL: 
проблема выбора
SQL vs NoSQL: 
проблема выбораSQL vs NoSQL: 
проблема выбора
SQL vs NoSQL: 
проблема выбора
 
Writing Once: Multi-client code sharing in ReactJS
Writing Once: Multi-client code sharing in ReactJSWriting Once: Multi-client code sharing in ReactJS
Writing Once: Multi-client code sharing in ReactJS
 
how-to-disappear-from-the-web
how-to-disappear-from-the-webhow-to-disappear-from-the-web
how-to-disappear-from-the-web
 
RethinkDB - the open-source database for the realtime web
RethinkDB - the open-source database for the realtime webRethinkDB - the open-source database for the realtime web
RethinkDB - the open-source database for the realtime web
 
Ruby on Rails for beginners
Ruby on Rails for beginnersRuby on Rails for beginners
Ruby on Rails for beginners
 
Enterprise Architectures with Ruby (and Rails)
Enterprise Architectures with Ruby (and Rails)Enterprise Architectures with Ruby (and Rails)
Enterprise Architectures with Ruby (and Rails)
 
From Obvious to Ingenius: Incrementally Scaling Web Apps on PostgreSQL
From Obvious to Ingenius: Incrementally Scaling Web Apps on PostgreSQLFrom Obvious to Ingenius: Incrementally Scaling Web Apps on PostgreSQL
From Obvious to Ingenius: Incrementally Scaling Web Apps on PostgreSQL
 

Recently uploaded

The Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdfThe Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdfkalichargn70th171
 
Software Quality Assurance Interview Questions
Software Quality Assurance Interview QuestionsSoftware Quality Assurance Interview Questions
Software Quality Assurance Interview QuestionsArshad QA
 
Diamond Application Development Crafting Solutions with Precision
Diamond Application Development Crafting Solutions with PrecisionDiamond Application Development Crafting Solutions with Precision
Diamond Application Development Crafting Solutions with PrecisionSolGuruz
 
How To Use Server-Side Rendering with Nuxt.js
How To Use Server-Side Rendering with Nuxt.jsHow To Use Server-Side Rendering with Nuxt.js
How To Use Server-Side Rendering with Nuxt.jsAndolasoft Inc
 
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...MyIntelliSource, Inc.
 
TECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service providerTECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service providermohitmore19
 
Right Money Management App For Your Financial Goals
Right Money Management App For Your Financial GoalsRight Money Management App For Your Financial Goals
Right Money Management App For Your Financial GoalsJhone kinadey
 
Hand gesture recognition PROJECT PPT.pptx
Hand gesture recognition PROJECT PPT.pptxHand gesture recognition PROJECT PPT.pptx
Hand gesture recognition PROJECT PPT.pptxbodapatigopi8531
 
5 Signs You Need a Fashion PLM Software.pdf
5 Signs You Need a Fashion PLM Software.pdf5 Signs You Need a Fashion PLM Software.pdf
5 Signs You Need a Fashion PLM Software.pdfWave PLM
 
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...Steffen Staab
 
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️Delhi Call girls
 
Optimizing AI for immediate response in Smart CCTV
Optimizing AI for immediate response in Smart CCTVOptimizing AI for immediate response in Smart CCTV
Optimizing AI for immediate response in Smart CCTVshikhaohhpro
 
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online ☂️
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online  ☂️CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online  ☂️
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online ☂️anilsa9823
 
Unlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language ModelsUnlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language Modelsaagamshah0812
 
Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time ApplicationsUnveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time ApplicationsAlberto González Trastoy
 
SyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AI
SyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AISyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AI
SyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AIABDERRAOUF MEHENNI
 
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfLearn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfkalichargn70th171
 
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...Health
 
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...ICS
 
A Secure and Reliable Document Management System is Essential.docx
A Secure and Reliable Document Management System is Essential.docxA Secure and Reliable Document Management System is Essential.docx
A Secure and Reliable Document Management System is Essential.docxComplianceQuest1
 

Recently uploaded (20)

The Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdfThe Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdf
 
Software Quality Assurance Interview Questions
Software Quality Assurance Interview QuestionsSoftware Quality Assurance Interview Questions
Software Quality Assurance Interview Questions
 
Diamond Application Development Crafting Solutions with Precision
Diamond Application Development Crafting Solutions with PrecisionDiamond Application Development Crafting Solutions with Precision
Diamond Application Development Crafting Solutions with Precision
 
How To Use Server-Side Rendering with Nuxt.js
How To Use Server-Side Rendering with Nuxt.jsHow To Use Server-Side Rendering with Nuxt.js
How To Use Server-Side Rendering with Nuxt.js
 
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
 
TECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service providerTECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service provider
 
Right Money Management App For Your Financial Goals
Right Money Management App For Your Financial GoalsRight Money Management App For Your Financial Goals
Right Money Management App For Your Financial Goals
 
Hand gesture recognition PROJECT PPT.pptx
Hand gesture recognition PROJECT PPT.pptxHand gesture recognition PROJECT PPT.pptx
Hand gesture recognition PROJECT PPT.pptx
 
5 Signs You Need a Fashion PLM Software.pdf
5 Signs You Need a Fashion PLM Software.pdf5 Signs You Need a Fashion PLM Software.pdf
5 Signs You Need a Fashion PLM Software.pdf
 
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
 
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
 
Optimizing AI for immediate response in Smart CCTV
Optimizing AI for immediate response in Smart CCTVOptimizing AI for immediate response in Smart CCTV
Optimizing AI for immediate response in Smart CCTV
 
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online ☂️
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online  ☂️CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online  ☂️
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online ☂️
 
Unlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language ModelsUnlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language Models
 
Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time ApplicationsUnveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
 
SyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AI
SyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AISyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AI
SyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AI
 
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfLearn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
 
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
 
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
 
A Secure and Reliable Document Management System is Essential.docx
A Secure and Reliable Document Management System is Essential.docxA Secure and Reliable Document Management System is Essential.docx
A Secure and Reliable Document Management System is Essential.docx
 

Building Real Time App