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

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.

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值