DRB以及Rinda技术详解 (正在编写中...)

来源:互联网 发布:暗黑3网络加速器 编辑:程序博客网 时间:2024/06/05 16:50
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.

 
原创粉丝点击