写点什么

Rails 综合报道:Rails 2.2 将会是线程安全的,Rails Edge 支持 ETags

  • 2008-09-08
  • 本文字数:1234 字

    阅读完需:约 4 分钟

David Heinemeier Hansson 最近提到 Rails 2.2 将会修补一个 Rails 存在已久的问题:其缺乏线程安全性。Charles Nutter 在文章中进一步阐述了线程安全的 Rails 意味着什么

本质上,其意味着去掉每个输入的请求所添加的较为粗糙的锁,取而代之的是为需要在线程间共享的资源加上更为精细的锁。采用的方法如,日志子系统中的数据结 构要么修改成不在线程间共享,要么需要设计恰当的锁机制以保证两个线程之间不会发生交互,不会影响彼此的数据结构或发生冲突。对于一个数据库实例我们不是 分别建立其单独的数据库连接,而是使用连接池,这样使得 N 个数据库连接可以供 M 个并发请求使用。这同时意味着潜在的包含执行数据库操作的请求不需要耗费一个连接,因此活动的连接数目通常少于可以并发处理的请求个数。

Rails Github repository 提交的例子和说明显示了最近完成的线程安全相关的工作: - “MemoryStore 是唯一‘不安全’的存储。保证其缺省是线程安全的。”

由于 Rails 缺乏线程安全的机制,需要使用多个独立的 Ruby 进程来为 Rails 应用服务,也就是使用非共享的方法。为了解决这个问题,也提出了很多技术和解决方案。 比如 Phusion Passenger 使用了一个修改的 Ruby 版本(基于写时拷贝友好的 GC),这种方法使得可以在 Ruby 实例间共享一些加载好的代码。这样也让管理一组程序的变得更为容易了。JRuby 允许在相同的 JVM(允许一定的代码共享) 中运行多个 JRuby 实例,从而减少多个 Rails 实例的运行开销。 即便是有线程安全的特性,Rails 站点仍然需要多个实例。其中的一个原因在于在 Ruby 1.8 中的用户空间线程系统,一个阻塞的 I/O 调用会阻塞解释器中所有的线程。尽管当前很多 I/O 库都使用非阻塞方式,但当前的 Mysql 适配器不是 (实际上,问题源于 C 库没有释放解释器的锁)。不过有些数据库适配器支持非阻塞的请求,比如 Postgresql 适配器。

Never_block 是一个方便这些适配器使用的库,尽管暂时需要 Ruby 1.9 版本。 将应用分布于多个解释器也可以利用多核系统的优势,但实际上,纯用户空间线程不允许这样。

Rails Edge 的另一个新特性是支持更简单的有条件 Get

“有条件 GET” 是专用于 HTTP 的一个功能,其提供给 web 服务器一种方法来告知浏览器,GET 请求的结果没有变化,因此可以放心的从浏览器缓存中直接获取结果。

Tim Bray 对 ETags 进行了简单的介绍同时对其解决的问题也做了说明:

但是有的时候,一个单独的时间戳信息不够服务器判断客户端是否需要刷新其所请求的拷贝。
ETags 正是用于这种情况下的。其工作的原理是:当一个客户端发送 GET 请求时,除了将其请求的结果发送回去外,还需要返回一个 HTTP 头,格式类似于:
ETag: “1cc044-172-3d9aee80”
在引号中的是一个签名,反映了请求的资源的当前状态。

查看英文原文: Rails Roundup: Rails 2.2 Will Be Threadsafe, ETags Support in Rails Edge

2008-09-08 21:14920

评论

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

文字变图片——GitHub 热点速览 v.21.14

HelloGitHub

GitHub 开源

关于微信架构

俞嘉彬

学生管理系统方案架构设计

俞嘉彬

设计模式-六大设计原则

U2647

设计模式 设计原则 4月日更

“学生管理系统”毕设架构设计

Vincent

架构实战营

每日总结-2021-04-05

cyningchen

架构训练

return

如何帮助一个新人快速融入团队

码猿外

团队协作 敏捷精益

Ansible 教程

码语者

DevOps ansible

编程好习惯之理清函数参数

顿晓

编程好习惯 4月日更

模块一:课后作业

菲尼克斯

架构实战营

Vite 2 + React 实践

清秋

less vite antd React 4月日更

架构实战营模块1作业

白发青年

架构实战营

《基于实践,设计一个百万级别的高可用&高可靠的IM消息系统》

后台技术汇

后端 消息系统 签约计划 引航计划 内容合集

极速精简 Go 版 Logstash

万俊峰Kevin

Logstash go-zero Go 语言

VUE2,基于vue-cli搭建创建vue项目

Chalk

Vue 大前端 4月日更

支持向量机实现光学字符识别

不脱发的程序猿

人工智能 机器学习 4月日更 支持向量机 实现光学字符识别

硬核图解红黑树并手写实现

Silently9527

Java 数据结构与算法 红黑色

Python基础之:Python中的内部对象

程序那些事

Python Python3 程序那些事

Rust从0到1-所有权-切片类型

rust slices 切片

MongoDB的几个常见问题

程序员架构进阶

mongodb 集群 28天写作 4月日更 实战问题

让大家喘口气休息一下吧,工作中事情众多烦心时,让我们与工作独处一会儿。

叶小鍵

联邦查询引擎Presto源码编译与调试

小舰

源码剖析 presto 4月日更

Kubernetes中的CI/CD

倪朋飞

Kubernetes DevOps CI/CD

starforce源码解读一:关键字partial

风翱

C# 源码阅读 4月日更 游戏框架

你朋友牛逼跟你有什么关系?

小天同学

自我思考 个人感悟 人生修炼 4月日更

千万不要轻易尝试“熊猫烧香”,这不,我后悔了!

冰河

互联网 网络安全 信息安全 渗透 蠕虫

#架构训练营作业一

吴猛

模块1作业

段吉贵

架构实战营

说人话

ES_her0

4月日更

零基础学Tableau系列 | 05—(进阶)数据集合并、符号地图、智能显示、插入自定义形状、仪表板

不温卜火

数据可视化 数据清洗 4月日更

Rails综合报道:Rails 2.2将会是线程安全的,Rails Edge支持ETags_Ruby_Werner Schuster_InfoQ精选文章