程序人生
http://xiewenwei.github.com//-
怎样才是 ruby 中捕获异常的正确姿势?
在开发和使用微服务间通信组件 SneakersPacker 过程中遇到异常处理的一些问题,通过解决这些问题让我对 ruby 中捕获异常和定义异常有新的认识。 当初遇到的问题是这样的:薄荷的一个子系统 status 中原本使用 http api call 获取 record 子系统的一些数据,应用 SneakersPacker 之后,把代码改成了 rpc call。刚开始的时候 …阅读全文 -
缓存可能让你的应用更慢 - 缓存使用的 N+1 问题
缓存是提升系统性能非常有效的手段,常常起到立竿见影的效果,但是有时不恰当的使用不但起不到优化效果,反而可能让系统更慢。下面总结缓存使用过程中常见的一些陷阱。 大家应该比较熟悉数据库查询时的 N+1 问题,在缓存中同样存在 N+1 问题。当应用中出现需要多次读取缓存的时候,虽然单次读取缓存速度很快,但是多次读取缓存累计时间相当可观,很可能会成为一个性能瓶颈。 直接给一个演示例子,生成 1 …阅读全文 -
ruby 中的 4 种相等性判断方法
很早就知道 ruby 有 4 种相等性判断方法,分别是:“==”,“===”,“equal?” 和 “eql?”,平常程序中都有使用,但是感觉对其缺乏深入理解,今天读 rails 部分源码的时候拿捏不定其中一个判断的意思,于是趁机深入研究了一番,总算觉得比较清楚了,今天做一下笔记,以作备忘。 “==” 最常见的相等性判断 “==” 使用最频繁,它通常用于对象的值相等性(语义相等)判断,在 Ob …阅读全文 -
重构系统广播功能
以前薄荷伙伴子系统的广播功能使用 redis 存储数据,随着时间推移数据积累,消耗内存十分严重,属于典型的 redis 误用。现在进行大幅重构,更改为 cache + storage 的存储方式,取消了 redis 存储。重构后,消耗资源大幅下降,性能上还有所改进。 先说说广播功能特性。广播功能主要用于薄荷向全体用法传递的消息(包括各种广告,告示和提醒等),当系统管理员在后台发出一条广播后,用户 …阅读全文 -
Rails 中 mattr_accessor 一处文档错误
发现错误 最近写一个 gem 的时候偶然接触到 Rails ActiveSupport 扩展 module 的 mattr_accessor 系列方法,包括 mattr_accessor、mattr_reader 和 mattr_writer。 记得以前探索 Rails 源代码的时候经常遇到 mattr_accessor 方法,当时并没有细究,这次碰巧要自己用到,所以仔细研究了其文档和实现源码, …阅读全文 -
使用 Redis 进行唯一计数的 3 种方法
唯一计数是网站系统中十分常见的一个功能特性,例如网站需要统计每天访问的人数 unique visitor (也就是 UV)。计数问题很常见,但解决起来可能十 分复杂:一是需要计数的量可能很大,比如大型的站点每天有数百万的人访问,数据量相当大;二是通常还希望扩展计数的维度,比如除了需要每天的 UV,还想知道每周或每月的 UV,这样导致计算十分复杂。 在关系数据库存储的系统里,实现唯一计数的方法就是 …阅读全文 -
Rails 中 MySQL 分区表使用的一个注意事项
MySQL 的分区表是一种简单有效的处理极大数据表的特性,通过它可以使应用程序几乎很少改动就能达成对极大数据表的高效处理,但由于 Rails ActiveRecord 设计上一些惯例,可能导致一些数据处理不能利用分区表特性,反而变得很慢,在使用分区表过程中一定要多加注意。 下面以一个例子来说明。在 light 系统中,有一张数据表是 diet_items, 主要字段是 id, schedule_ …阅读全文 -
如何解决 Rails 中同时修改冲突
Rails 应用程序中操作冲突是一个常见问题,Rails 提供了简单有效的解决方法。 举一个实际的例子:我们的系统里有一个商店模块,商店中重要的一块是对产品信息的管理,比如运营人员常常会编辑产品的信息,包括产品标题,营销口号和价格等等。因为修改十分频繁,碰巧同时编辑提交修改的话,就会偶尔遇到修改丢失的问题,运营人员 A 修改产品标题,运营人员 B 修改价格,A 和 B 提交修改都提示修改成功,但 …阅读全文
-
http 抓包分析工具 pproxy
引言 web 开发和 API 开发中难免要详细分析 http 请求和响应信息。web 开发的话,浏览器提供了便利的工具,比如 chrome 和 IE 都带了 develop tool,而 firefox 更是有十分强大的 firebug,可以让 http 请求的所有秘密一览无遗。目前是 app 大流行的时代,想要观察 app 中得 http 请求的秘密,浏览器的工具和插件都无能为力,有不少本地 …阅读全文
-
避免误用 Redis
Redis 是目前 NoSQL 领域的当红炸子鸡,它象一把瑞士军刀,小巧、锋利、实用,特别适合解决一些使用传统关系数据库难以解决的问题。但是 Redis 不是银弹,有很多适合它解决的问题,但是也有很多并不适合它解决的问题。另外,Redis 作为内存数据库,如果用在不适合的场合,对内存的消耗是很可观的,甚至会让系统难以承受。 我们可以对系统存储使用的数据以两种角度分类,一种是按数据的大小划分,分成大 …阅读全文