知识卡片
改开源项目:保持原系统纯洁,只开发辅助系统"包装"它
内容
当发现开源项目有些地方不满足需求时,自然会有一种想去改改的冲动,但怎么改是个大学问。一种方式是投入几个人从内到外全部改一遍,把它彻底改造成完全符合自己业务需求的样子,但这样做有两个严重问题:一是投入太大,像Redis这种级别的开源项目,真要自己改,至少要投入2个人搞1个月以上;二是会失去跟随原项目演进的能力——改得太多,即使原开源项目继续演进,也无法再合并回来了,因为差异已经太大。因此更好的建议是不要改动原系统本身,而是开发辅助系统来完成需要的能力:监控、报警、负载均衡、管理等。以Redis为例,如果想给它增加集群功能,不要去改Redis本身的实现,而是在外面增加一个proxy层来实现——Twitter的Twemproxy就是这样做的;而Redis到了3.0之后本身提供了集群功能,原有依赖proxy层的方案就可以简单切换到Redis 3.0原生集群,不需要再维护自己改造的版本。如果实在想改动原有系统本身怎么办?建议是直接给开源项目提需求或提bug,弊端是响应比较缓慢,这就要看业务紧急程度:如果实在太急,那就只能自己改;如果不是太急,做好备份或应急手段静待官方修复即可。
参考来源
- 位置:《从零开始学架构》第48讲《再谈开源项目:如何选择、使用以及二次开发?》"改:如何基于开源项目做二次开发"之"保持纯洁,加以包装"(源文件:_epub-src/OEBPS/text00003.html)
- 结论依据:原文说明"所以我的建议是不要改动原系统,而是要开发辅助系统:监控、报警、负载均衡、管理等。以 Redis 为例,如果我们想增加集群功能,则不要去改动 Redis 本身的实现,而是增加一个 proxy 层来实现。Twitter 的 Twemproxy 就是这样做的""如果实在想改到原有系统,怎么办呢?我们的建议是直接给开源项目提需求或者 bug",直接支撑本卡结论。
- 原始内容:所以我的建议是不要改动原系统,而是要开发辅助系统:监控、报警、负载均衡、管理等。以 Redis 为例,如果我们想增加集群功能,则不要去改动 Redis 本身的实现,而是增加一个 proxy 层来实现……如果实在想改到原有系统,怎么办呢?我们的建议是直接给开源项目提需求或者 bug