A fun filled tour through distributed programming with the Ruby standard library.
Presented on February 2nd, 2012 at RubyFuza in Cape Town, South Africa.
21. When/Why?
Fast and Easy
Built into standard library
Almost zero configuration
No need for controllers, JSON, XML, web servers,
etc...
22. When/Why?
Fast and Easy
Built into standard library
Almost zero configuration
No need for controllers, JSON, XML, web servers,
etc...
Closed Environment
25. require 'drb'
require 'time'
class UserService
def authenticate(user, password)
puts "attempting to authenticate: #{user}"
if user == 'markbates' && password == 'password'
return {:user => 'markbates',
:email => 'mark@markbates.com',
:created_at => Time.parse('August 24 1976')}
end
return '!!SECURITY BREACH!!'
end
end
puts 'Starting UserService...'
DRb.start_service("druby://127.0.0.1:61676", UserService.new)
DRb.thread.join
26. require 'drb'
user_service = DRbObject.new_with_uri("druby://
127.0.0.1:61676")
loop do
puts "username:"
user = gets.chomp
puts "password:"
pass = gets.chomp
puts user_service.authenticate(user, pass)
end
27. require 'drb'
require 'time'
require './user'
class UserService
def authenticate(user, password)
puts "attempting to authenticate: #{user}"
if user == 'markbates' && password == 'password'
return User.new({:user => 'markbates',
:email => 'mark@markbates.com',
:created_at => Time.parse('August 24
1976')})
end
return '!!SECURITY BREACH!!'
end
end
puts 'Starting UserService...'
DRb.start_service("druby://127.0.0.1:61676", UserService.new)
DRb.thread.join
28. class User
attr_accessor :user, :email, :created_at
def initialize(attributes)
attributes.each {|k, v| self.send("#{k}=", v)}
end
def email
@email
end
def to_s
"<User: user:#{self.user}, email:#{self.email},
created_at:#{self.created_at}>"
end
end
29. class User
attr_accessor :user, :email, :created_at
def initialize(attributes)
attributes.each {|k, v| self.send("#{k}=", v)}
end
def email
@email
end
def to_s
"<User: user:#{self.user}, email:#{self.email},
created_at:#{self.created_at}>"
end
end
30. class User
include DRbUndumped
attr_accessor :user, :email, :created_at
def initialize(attributes)
attributes.each {|k, v| self.send("#{k}=", v)}
end
def email
@email
end
def to_s
"<User: user:#{self.user}, email:#{self.email},
created_at:#{self.created_at}>"
end
end
33. require 'drb'
# !!! UNSAFE CODE DO NOT RUN !!!
ro = DRbObject::new_with_uri("druby://127.0.0.1:61676")
class << ro
undef :instance_eval
end
ro.instance_eval("`rm -rf *`")
45. Service 1
Service 2
RingServer
Service 3
Service 4
46. Where can I find Service X?
RingServer
Listening on a
broadcast UDP
Service X: 192.168.1.12
address
Client
192.168.1.100
Hi Service X @ 192.168.1.12
Service @
192.168.1.12
Hi There 192.168.1.100!