写点什么

通过 Blackboard 探索 Ruby 的元组空间持久化

2009 年 7 月 15 日

Ruby 因为其 1.8 版本的用户空间线程模型而饱受批评。 Luc Castera 在 RubyNation 会议上给出了通过 Ruby 和元组空间进行并行编程的演讲。在介绍了目前诸多应用(如 Ruby 1.8、Ruby 1.9、JRuby 和 Erlang 等)所实现的不同的线程模型之后,Luc 介绍了 Ruby 的多进程模型(图片和引文均来自于该演讲):

  • 优点:
    • 不再需要共享内存
    • 可利用多 CPU 来提升性能
    • 在调用阻塞的系统调用之时不会阻塞全部的线程
    • 可伸缩性
    • 容错性
  • 缺点:
    • 进程的创建、执行和清理代价都很大
    • 需要使用大量内存(将 Ruby 虚拟机载入每个进程之中)
    • 需要一种方式来实现进程间通信

实现进程间通信有多种选择:数据库(例如在 Mongrel 或者 Thin 等应用服务器集群中使用)、RabbitMQ 等队列( Nantie 的解决方案)、DRB、ActiveMQ,或者元组空间。
Luc 比较了两个元组空间的实现: Rinda 和他自己开发的 Blackboard。元组空间提供了一个元组的容器,可以实现并行访问。元组一般提供三个访问原语:write(将一个元组写入元组空间),read(从元组空间中读取一个元组),take(从元组空间中读取一个元组并将其移除)。

Linda 是一个协调模型,由 David Gelernter 和 Nicholas Carriero 提出,用于解决全局对象协调的问题。
Rinda 是 Linda 的 Ruby 实现,而且是一个内置程序库。一个 Rinda 元组可能看起来是这个样子的:t1 = [:add, 5, 9],客户端可能会将其解释为一个将两个数相加的任务。

Rinda 最大的缺陷是其不支持持久化,这样一旦程序停止或崩溃的话,所有在元组空间中的元组则会丢失。
这便是 Luc 开发 Blackboard 的原动力。Blackboard 是一个基于 Key-Value 数据库 Redis 的一个元组空间实现,这样它便拥有了持久化的能力。

[Redis] 和 memcached 很相似,但是数据集不易失。取值可以为字符串,就如同 memcached 一样,但是还支持使用原子操作来 push/pop 诸如列表和集合之类的元素

该 API 的使用范例如下:

复制代码
ts = Blackboard::TupleSpace.new
ts.write [:calculator, :add, 1, 2]
ts.take [:calculator, :add, nil, nil]

基准测试显示了 Rinda 和 Blackboard 的区别(摘自该演讲):

Rinda Blackboard Write (1000) 0.042749 0.253068 Take (500) 0.082744 15.844250 Read (500) 0.020098 20.098478 当前的实现只是第一步,Luc 计划弃用 Redis 而实现一个 Erlang 的 Blackboard 定制实现,这样就可以方便地使用 Ruby 这样的第三方语言进行调用。

查看英文原文: Exploring Tuple Spaces Persistence In Ruby With Blackboard

2009 年 7 月 15 日 21:13935
用户头像

发布了 80 篇内容, 共 15.8 次阅读, 收获喜欢 4 次。

关注

评论

发布
暂无评论
发现更多内容

自从有了他,再也没有担心过环境部署~

MY

部署与维护

Adobe公布的这个消息,让PS、Lrc和Adobe国际认证用户,都慌了?

Adobe国际认证

泉州有了一个水务大脑,用AI守护“绿水青山”

百度大脑

AI

视频录制后有噪音怎么办?教你简答几步去除视频噪音!

奈奈的杂社

架构训练营——作业 2

架构实战营

很久没写过编程学习笔记了

Kevin

你不一定全知道的四种Python装饰器实现详解

老猿Python

Python 编程语言 装饰器 程序开发

Python OOP-1

若尘

面向对象 oop 面向对象编程 Python编程

编曲新手可以用什么编曲软件?

奈奈的杂社

Oracle LogMiner 数据迁移实战

yintianwen

Java 数据库 后端 数据迁移 LogMiner

网络协议学习笔记Day1

穿过生命散发芬芳

网络协议 4月日更

聪明人的训练(二十三)

Changing Lin

4月日更

websocket简析

风翱

websocket 【4 月日更】

中国脑科学的十年行旅

脑极体

​量化马丁策略交易系统开发,市值管理机器人

WX13823153201

零食饮料消费竞速回暖,但变化的不仅是数字;元气森林就宣传“0蔗糖 低脂肪”饮料道歉

󠀛Ferry

四月日更

NumPy之:数据类型

程序那些事

Python 数据分析 Numpy 程序那些事

Flutter Slidable 列表侧滑菜单 列表侧滑删除

早起的年轻人

flutter

一个码砖的码农,在InfoQ写一年博客,出书了?

小傅哥

Java 设计模式 小傅哥 架构设计 码农出书

阿里开发7年大牛:只需一篇文章吃透Android多线程技术,好文推荐

欢喜学安卓

android 程序员 面试 移动开发

流程引擎介绍

上海派拉基础研发

流程

智慧党建系统开发,组织部领导干部管理平台建设解决方案

WX13823153201

算法题目解析:从一道题目看动态规划

程序员架构进阶

算法 动态规划 28天写作 4月日更

不要给自己留后路

小天同学

人生 个人感悟 成功 4月日更

10 亿数据量只需要 100MB 内存,Redis 的位存储为什么这么牛?

Java小咖秀

redis 原理 位运算 bit 高级特性

rrxjava原理,手持4个大厂offer的我,吊打面试官系列!

欢喜学安卓

android 程序员 面试 移动开发

LeetCode题解:641. 设计循环双端队列,使用数组,JavaScript,详细注释

Lee Chen

算法 LeetCode 前端进阶训练营

使用CrossOver安装第三方软件

懒得勤快

王霸雄图荣华敝屣,谈笑间尽归尘土|基于Python3双队列数据结构搭建股票/外汇交易匹配撮合系统

刘悦的技术博客

数据结构 算法 Python3 匹配 股票系统

Ansible 命令行工具

耳东

4月日更

谈谈 WebRTC 的 SDP Unified Plan

拍乐云Pano

WebRTC

通过Blackboard探索Ruby的元组空间持久化-InfoQ