合理的技术栈永远比语言来的重要
知道我的人都知道我是做在线教育,准确的应该说是高中生在线一对一辅导平台。 这个平台最核心的服务应该就是上课服务了,这个上课服务里面包含着什么呢?我来列一下:
其他服务先不说,首先说说这个课件中心,其实也就是将 PPT、PPTX、PDF 之类的文件转换成图片使其可以在白板互动系统里面使用,看似非常简单的模块,我们却碰到了非常多的问题。我总结了我们才到的几个坑,一一列在下面。 网上搜索到的并非是最完美的方案,仅仅能用而已. 最初我们的解决方式是使用网上 LibreOffice 转换 Office 文档到 PDF ,然后再使用 ImageMagick(或者GhostScript)转换 PDF 到指定图片格式的方案。 这个方案非常的简单,我甚至没有上队列,仅仅使用 CRON 定时脚本就搞定了了。 然后我们很快就放弃了这个方案,因为 LibreOffcie 对于 Microsoft Office的支持实在是太有限,很多 PPT 转换出来简直是面目全非。对于内嵌对象的支持跟上非常糟糕,很多内嵌对象往往无法显示,比如数学公式。当然还有转换时间过长的问题,因为我们屌丝的服务器,基本上转换一个 50 页的文档需要5分钟,这个体验太糟糕了! 某些时候云服务也不是非常靠谱. 鉴于我们使用的七牛存储,而七牛上刚好有 亿方云文档转换服务,所以我们很快就将我们的
而事实上七牛也含蓄的说明了这个服务是不靠谱的。 有些时候99%的成功概率都难以容忍 随着我们规模的扩大,课件转换问题就像一个幽灵一样环绕在我的周围,因为即使只有 1% 的转换失败概率,那么我们一周也至少会碰到 5 例失败,这个非常影响我们的工作效率。而实际上的转换失败概率远比这个大。所以我明白了很多时候为什么很多公司要把可靠性要定在5个9甚至6个9那么高了。 这个影响非常的大,以至于我们不得不出了一个奇葩的规则补救:如果你上传 PPT 转换失败,请用 WPS 或者 Windows Office 转换成 PDF 再上传。但这个措施一出无异于我们放弃了 PPT 转换的方案,这样还不如直接跟用户说:请用 PDF 上传吧,PPT 我们不支持来的直接。 商业方案也不一定靠谱 到了今年,课件转换这个模块已经可以说是如鲠在喉,不吐不快了,无论是用户还是内部都抱怨多多。 这个时候我们试用了 Aspose.Total 和 Spire.Office 这两套方案,但是很快就被我们排除了,因为通过不了我们的“单元测试”(一大批来自老师的疑难课件)。 而经我们事后了解亿方云使用的就是 Aspose.Total 的解决方案。 PS: 特别夸一下 Spire.Office 是国人开发的,值得推荐。 Linux并非政治正确 这个时候我不得不把目光瞄向了 Microsoft Office,我想如果 Microsoft Office 都无法转换成功,那么这个世界上也没有什么软件可以转换这个课件了。 但如果使用 Microsoft Office 那么必须得安装 Windows Server 系列的系统,这无疑是对大多数Linux系运维架构的一个挑战(我们就碰到 Windows 自动更新自己重启了!自己重启了!!!)。 我用 COM Interop + C# + Windows Office 2013 迅速撸了一个转换命令行工具。然后迅速上架这个功能,发现效果提升非常明显。 首先转换内容出错肯定不存在问题了。第二个我们发现转换速度非常快,50页的PPT只需要上传、打开PowerPoint、输出图片、上传图片、更新数据库只需要不到10秒。而这个在之前是需要至少100秒的。 这使得我们在我们的产品上不得不改口说:
而这个30秒还是我们夸大了讲的。 这套方案成功的转换过 500 多页的 PPT,而这个 500 多页的 PPT 在以前的转换方案中是 100% 失败的,基本上不是在 LibreOffice 挂了,就是在 ImageMagick 挂了。 合理的技术栈永远比语言来的重要
以上这些不是不懂技术的人会讲吗,懂技术的人也会讲。我曾经在微博上说过我们一家对手公司因为使用 C++ 开发客户端导致大半年时间浪费在处理 Windows 系统的兼容性上。我也见过多家公司因为听信 Java 好,而把技术方向从 PHP 转向 Java 导致公司一蹶不振的。对于大多数基础技术公司来讲,这根本不是哪种语言好的问题,而是你能不能 Hold 住的问题。 我一直对外讲我们公司用 PHP + JavaScript,但实际上我们用的还有 Go、TypeScript、C#、C++、Java,每一块都实现的非常好,各居其位、各谋其政。但我们的核心目前还是 PHP + JavaScript。 微服务是未来,虚拟化是未来、接口是未来 学过 Golang 的朋友都知道 Golang 的接口机制非常的奇怪,**因为它的接口机制是你有没有继承不是看你有没有说我继承自某某,而是看你会不会某某的功能。 通俗讲就是:如果我们定义 Bird 类只有一个方法叫 Fly(),如果你能 Fly,那么你也叫 Bird 。 所以你用 PHP 实现或者用 Java 实现一个服务化的功能并不重要,重要的是你实现的完不完美。你能不能 Hold 举个例子:我在13年的时候用PHP实现过一个任务队列系统(PHP Coolie),今年我用 Go 重新实现 Windows 下任务队列的 Worker 。对于我来讲不是 Go 好,而是 Windows 下没有 PHP 没有 pcntl 。 Docker 大行其道的当天,对于大多数服务来讲都只需要 docker run 一下,谁还会在乎下面一层是用什么语言? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |