硬核干货——《中小企业 AI 实战指南》免费下载! 了解详情
写点什么

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

评论

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

【SSM】Spring系列——Spring集成MyBatis

胖虎不秃头

spring ssm 10月月更

MFC|双缓存绘图机制

中国好公民st

c++ qt 10月月更

微服务标准化

穿过生命散发芬芳

微服务 10月月更

你是怎样解决跨域问题的?-面试必问

loveX001

JavaScript

vue为什么v-for的优先级比v-if的高?

bb_xiaxia1998

Vue

Docker下的Nacos环境开发

程序员欣宸

Docker nacos spring cloud alibaba 10月月更

js函数式编程讲解

hellocoder2029

JavaScript

网络爬虫与http+ssl(1)

张立梵

Python. 爬虫必备知识讲解 10月月更

Collections之Arraylist源码解读(四)

知识浅谈

ArrayList 10月月更

【LeetCode】使括号有效的最少添加Java题解

Albert

LeetCode 10月月更

【一Go到底】第三天---变量的使用

指剑

Go golang 10月月更

分享Go书籍-《Go Web编程》

沙漠尽头的狼

从输入URL到渲染的过程中到底发生了什么?

loveX001

JavaScript

同事嫌我改Bug慢,原来是没掌握这些代码Debug技巧

慕枫技术笔记

debug 后端 10月月更

【SSM】SpringMVC系列——SpringMVC概述

胖虎不秃头

spring ssm 10月月更

数据产品经理实战-项目管理

第519区

项目管理 数据产品经理

架构师的十八般武艺

agnostic

构架师

React循环DOM时为什么需要添加key

beifeng1996

React

Goland嗖嗖的: 快捷键,自动生成代码等效率小技巧

琦彦

Go goland 10月月更 live template

基于kube-scheduler-simulator编写自己的调度程序

琦彦

k8s 调度 kube-scheduler 10月月更

【深度讲解系列】SpringBoot入门

Geek_65222d

10月月更

React的useLayoutEffect和useEffect执行时机有什么不同

beifeng1996

React

Vue.$nextTick的原理是什么-vue面试进阶

bb_xiaxia1998

Vue

大数据ELK(十二):Elasticsearch编程(环境准备)

Lansonli

ES 10月月更

Angular 内容投影出现 No provider for TemplateRef found 错误的单步调试

汪子熙

typescript Web 前端开发 angular 10月月更

【SSM】Spring系列——AOP面向切面编程

胖虎不秃头

spring ssm 10月月更

存储优化--查询分离

喵叔

10月月更

【愚公系列】2022年10月 Go教学课程 017-分支结构之IF

愚公搬代码

10月月更

2022-10-03:给定一个正数n,比如6 表示数轴上有 0,1,2,3,4,5,6 <0 或者 >6 的位置认为无法到达 给定两个数字x和y,0<= x,y <= n 表示小人一开始在x的位置,它

福大大架构师每日一题

算法 rust 福大大

Java线上惨痛踩坑记录,你也一定遇到过

一灯架构

Java java面试 10月月更

vue面试之Composition-API响应式包装对象原理

bb_xiaxia1998

Vue

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