合理的技术栈永远比语言来的重要

知道个人人都知道我是作在线教育,准确的应该说是高中生在线一对一辅导平台。php

这个平台最核心的服务应该就是上课服务了,这个上课服务里面包含着什么呢?我来列一下:html

  1. 白板互动系统(屏幕共享系统)git

  2. 语音即便通信系统github

  3. 文字即时通信系统docker

  4. 课件中心数据库

  5. 题库中心服务器

其余服务先不说,首先说说这个课件中心,其实也就是将 PPT、PPTX、PDF 之类的文件转换成图片使其能够在白板互动系统里面使用,看似很是简单的模块,咱们却碰到了很是多的问题。我总结了咱们才到的几个坑,一一列在下面。架构

网上搜索到的并不是是最完美的方案,仅仅能用而已.运维

最初咱们的解决方式是使用网上 LibreOffice 转换 Office 文档到 PDF ,而后再使用 ImageMagick(或者GhostScript)转换 PDF 到指定图片格式的方案。 这个方案很是的简单,我甚至没有上队列,仅仅使用 CRON 定时脚本就搞定了了。微服务

而后咱们很快就放弃了这个方案,由于 LibreOffcie 对于 Microsoft Office的支持实在是太有限,不少 PPT 转换出来简直是面目全非。对于内嵌对象的支持跟上很是糟糕,不少内嵌对象每每没法显示,好比数学公式。固然还有转换时间过长的问题,由于咱们屌丝的服务器,基本上转换一个 50 页的文档须要5分钟,这个体验太糟糕了!

某些时候云服务也不是很是靠谱.

鉴于咱们使用的七牛存储,而七牛上恰好有 亿方云文档转换服务,因此咱们很快就将咱们的
PPT 转换到 PDF 这个本地步骤变成了使用亿方云的服务。这种方式咱们使用了很是长的一段时间。可是没法转换成功的问题仍是断续存在的,虽然转换时间大大下降了。总之咱们在第一个方案上碰到的问题基本上第二个方案都有除了频率小了,转换速度快了。

clipboard.png

而事实上七牛也含蓄的说明了这个服务是不靠谱的。

有些时候99%的成功几率都难以容忍

随着咱们规模的扩大,课件转换问题就像一个幽灵同样环绕在个人周围,由于即便只有 1% 的转换失败几率,那么咱们一周也至少会碰到 5 例失败,这个很是影响咱们的工做效率。而实际上的转换失败几率远比这个大。因此我明白了不少时候为何不少公司要把可靠性要定在5个9甚至6个9那么高了。

这个影响很是的大,以致于咱们不得不出了一个奇葩的规则补救:若是你上传 PPT 转换失败,请用 WPS 或者 Windows Office 转换成 PDF 再上传。但这个措施一出无异于咱们放弃了 PPT 转换的方案,这样还不如直接跟用户说:请用 PDF 上传吧,PPT 咱们不支持来的直接。

商业方案也不必定靠谱

到了今年,课件转换这个模块已经能够说是如鲠在喉,不吐不快了,不管是用户仍是内部都抱怨多多。

这个时候咱们试用了 Aspose.TotalSpire.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秒的。

这使得咱们在咱们的产品上不得不改口说:

clipboard.png

而这个30秒仍是咱们夸大了讲的。

这套方案成功的转换过 500 多页的 PPT, 而这个 500 多页的 PPT 在之前的转换方案中是 100% 失败的,基本上不是在 LibreOffice 挂了,就是在 ImageMagick 挂了。

合理的技术栈永远比语言来的重要

阿里巴巴用 Java 咱们也用 Java 吧?
PHP 这东西没什么难度的?
是否是 C++ 开发的会稳定点?
微软的东西,仍是算了吧用开源的吧!

以上这些不是不懂技术的人会讲吗,懂技术的人也会讲。我曾经在微博上说过咱们一家对手公司由于使用 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 一下,谁还会在意下面一层是用什么语言?

相关文章
相关标签/搜索