写点什么

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:141122

评论

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

微信小程序开发 | 如何在小程序中使用自定义 icon 图标

彭宏豪95

微信小程序 学习 编程 大前端 IT

重学 Java 设计模式:实战适配器模式

小傅哥

设计模式 小傅哥 重构 代码质量 代码坏味道

程序员都惧怕的故障域

松花皮蛋me

Java 问题处理

LeetCode | 2. Reverse Integer 整数反转

Puran

Python C# 算法 LeetCode arts

SpringBatch系列入门之Tasklet

稻草鸟人

spring SpringBatch 批处理

同一浏览器只允许登录一个账号

码字与律动

Vue 大前端

Java 最新的JDK14.0.1调试成功

程李文华

centos7分区命令parted的用法(大于2T)

唯爱

【vue-openlayers】弹窗

德育处主任

html Vue 大前端 openlayers ol

坚持ARTS-week2

王钰淇

ARTS 打卡计划

有的线程它死了,于是它变成一道面试题。

why技术

源码分析 面试 jdk源码 线程池

【译】5 个你需要知道的 JavaScript 小技巧

零和幺

Java 大前端 技巧

ARTS 01 - 技术人的理想主义

jerry.mei

算法 Vue 练习 ARTS 打卡计划 ARTS活动

ARTS打卡week#1

对方正在输入…

ARTS 打卡计划

洞悉MySQL底层架构:游走在缓冲与磁盘之间

帅旋

MySQL 数据库 MVCC

架构演变之路:为何要搞微服务架构?

帅旋

Kubernetes 微服务 dubbo SpringCloud

什么时候去面试

escray

【大厂面试02期】Redis过期key是怎么样清理的?

NotFound9

Java 数据库 redis 架构 后端

初识 LeetCode

Puran

LeetCode arts

深入理解JVM内存管理 - 堆和栈

Skye

堆栈 深入理解JVM VM参数

程序员的晚餐 | 6 月 2 日 红烧鸡爪的味道

清远

美食

带你学够浪:Go语言基础系列 - 8分钟学控制流语句

程序员柠檬

后台开发 Go 语言

工作的创新能力

punkboy

产品 重新理解创业 产品经理 创新突破 创新

Java 走过的创新25年

田晓旭

Java25周年

一文入门JVM虚拟机

Simon郎

深入理解JVM

分布式事务 - 理论模型

Java收录阁

分布式事务

游戏夜读 | 如何管理公司?

game1night

路漫漫其修远兮

无心水

LeetCode | 1. Two Sum 两数之和

Puran

Python C# 算法 LeetCode arts

谈谈控制感(13):为什么是旁观者清?

史方远

读书笔记 个人成长 心理学 随笔杂谈

【Sentry搭建之 docker-compose】

卓丁

DevOps Docker-compose CI/CD sentry

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