DRB (Distributed Ruby)是一个ruby的远程调用程序库,使用它,你可以在像调用一个本地的对象一样访问远程的一个对象。
下面的代码说明了如何使用drb。
# 服务器端
require 'drb'
class TestServer
def add(*args)
args.inject {|n,v| n + v}
end
end
server = TestServer.new
DRb.start_service('druby://localhost:9000', server)
DRb.thread.join # Don't exit just yet!
# 客户端
require 'drb'
DRb.start_service()
obj = DRbObject.new(nil, 'druby://localhost:9000')
# Now use obj
puts "Sum is: #{obj.add(1, 2, 3)}"
DRB的实现只有几百行代码。
java的JNI技术基于JavaSpaces技术,而JavaSpaces技术基于Linda,DRB的作者实现了
一个叫做Rinda的Ruby版的Linda。
Linda实现的是一种分布式进程间协作的情景。
Linda的基本操作对象是tuple.
tuple的读取标准可以是tuple的大小也可以是tuple中元素的内容匹配与否。
允许drb services/clients互相查找的是 RingServer.
rinda的一个示例代码:
######### rinda server
require 'drb/drb'
require 'rinda/tuplespace'
require 'rinda/ring'
DRb.start_service
tuple_space = Rinda::TupleSpace.new
ring_server = Rinda::RingServer.new tuple_space
while true
msg = gets
tuple_space.write [:message, msg]
end
######### rinda client
require 'drb/drb'
require 'rinda/tuplespace'
require 'rinda/ring'
DRb.start_service
tuple_space = Rinda::RingFinger.primary
while true
puts "message: " + tuple_space.take([:message, nil])[1]
end
问题:
1、但是多个client不能都取到tuple
2、另外一台机器上的client不能发现ringserver.
3、如果去掉take语句是可以取到消息的,但是新写入的tuple不能覆盖旧的tuple.
A RingServer allows a Rinda::TupleSpace to be located via UDP broadcasts.
可以解决这个问题了,用 RingServer,RingFinger的确可以靠 broadcast udp 包找到其他的
rinda service.但是要显式地给 drb service 绑定 uri.
下面的代码说明了如何使用drb。
# 服务器端
require 'drb'
class TestServer
def add(*args)
args.inject {|n,v| n + v}
end
end
server = TestServer.new
DRb.start_service('druby://localhost:9000', server)
DRb.thread.join # Don't exit just yet!
# 客户端
require 'drb'
DRb.start_service()
obj = DRbObject.new(nil, 'druby://localhost:9000')
# Now use obj
puts "Sum is: #{obj.add(1, 2, 3)}"
DRB的实现只有几百行代码。
java的JNI技术基于JavaSpaces技术,而JavaSpaces技术基于Linda,DRB的作者实现了
一个叫做Rinda的Ruby版的Linda。
Linda实现的是一种分布式进程间协作的情景。
Linda的基本操作对象是tuple.
tuple的读取标准可以是tuple的大小也可以是tuple中元素的内容匹配与否。
允许drb services/clients互相查找的是 RingServer.
rinda的一个示例代码:
######### rinda server
require 'drb/drb'
require 'rinda/tuplespace'
require 'rinda/ring'
DRb.start_service
tuple_space = Rinda::TupleSpace.new
ring_server = Rinda::RingServer.new tuple_space
while true
msg = gets
tuple_space.write [:message, msg]
end
######### rinda client
require 'drb/drb'
require 'rinda/tuplespace'
require 'rinda/ring'
DRb.start_service
tuple_space = Rinda::RingFinger.primary
while true
puts "message: " + tuple_space.take([:message, nil])[1]
end
问题:
1、但是多个client不能都取到tuple
2、另外一台机器上的client不能发现ringserver.
3、如果去掉take语句是可以取到消息的,但是新写入的tuple不能覆盖旧的tuple.
A RingServer allows a Rinda::TupleSpace to be located via UDP broadcasts.
可以解决这个问题了,用 RingServer,RingFinger的确可以靠 broadcast udp 包找到其他的
rinda service.但是要显式地给 drb service 绑定 uri.