最近要做个视频社交移动应用产品,我主要负责后端架构这方面。先列了几个选项,分别谈一谈,断断续续写的,想到哪些记下来
几个后端方案的选型:SpringBoot、Jersey、Play、Django、Go、Node.js、C&C++。
SpirngBoot:SpringBoot是最近两年Java圈谋求突围的一个东西,我之前一个产品有同事用这个,我Review他的代码发现其主要特点是把注解替代XML配置,其他方面和传统的spring系的那些东西区别不大,总体来说这个东西在传统SSH中规中矩的基础上小有“创新”,也可以说是换汤不换药,适合大量Javaer的中型以上团队,其生产效率一般。突出特点:对于大多数Javaer易于接受
Jersey:可能是Java圈子里面比较代表型的Restfui框架,JAX-RS标准的参考实现,一些典型Restful服务需要的特性都以内建或者插件的方面提供了。我做上个项目的调研时,曾经对它和DjangoRestFramework做过特性对比,个人感觉后者胜出,这个东西可能需要稍微好学求进的Javaer团队才能接受。因为其和传统SSH有一定特性差别,国内有一本专门讲这个的书。突出特点:Java界RS标准的参考实现
Play:这东西号称真正Java圈的Django、RoR,我在某Java社区看到很多Javaer都不推荐,我个人是想玩玩的,不过其2.0后偏向Scala,给整个团队推这个东西,我估计比较难。官方给出的使用理由:Developer friendly、Scale predictably、Modern web & mobile、Solid & fast、Massive ecosystem、Proven in production。其中有一点需要强调一下:就是它很容易利用JavaEE的强大生态圈,JavaEE雄霸这么多年,其生态积累还是不可小视的。Play使用案例:Linkedin、Klout、the Guardian、Gilt、ZapTravel。突出特点:占用资源少的同时高性能。
Django:Django是我过去几年主要使用的Web框架,其DjangoRestFramework我个人认为比Jersey要Nice一点。Django在Web方面是All In One,其Rest框架是简单快捷。其1.8以后的RDB Schema Migrations这个东西对于对DB Schema做版本管理真是方便。缺陷:它的实例性能肯定要比Java弱(这在生产部署中其实不是问题),而且版本更新很快,特性还在不断扩展中,比如最近的Django Channel。优点:开发效率真是迅捷啊。我个人认为它在互联网产品和普通企业应用开发方面真是值得推荐。官方给出的使用理由:Ridiculously fast、Fully loaded、Reassuringly secure、Exceedingly scalable、Incredibly versatile。其使用案例:Disqus、Instagram、Knight Foundation、MacArthur Foundation、Mozilla、 National Geographic、Open Knowledge Foundation、Pinterest、Open Stack。突出特点:开发效率快,功能特性完备。对于大多数产品和应用,Python系都是不错的选择。
go:我们做大用户量的社交聊天工具,肯定得考虑这个东西。这东西在C的基础上除了加了点动态语言的特性,还特别做了了强悍的协程和通道专门用来做高并发网络服务程序,我个人认为他做高并发实时Socket服务器肯定很合适,其他方面可能还得分析。突出特点:可以与其它网络服务开发语言构成全Golang栈
node.js:不用说了,据说这玩意单进程能跑出上面Go多进程实例的HTTP性能,而且这玩意号称就是做DIRT数据密集型实时(data-intensive real-time)程序的。突出特点:性能强悍,Web前后端语言一直
C&C++:为什么最后居然加了这两个玩意,主要原因是我们这个产品一个特点是视频,我估计视频的编码解码甚至通信说不定都得用这东西写,说实话刚毕业把C++当神语言,这么多年写业务应用,已经没有那种情节了,不过有些东西可能真的还得靠它来实现。另外说一点Douban的使用语言饼图C只比python少一点点。突出特点:底层高性能开发
个人倾向:PythonDjango、Play、Go、Node.js、C&C++
应用方向:
业务Restful服务:DjangoRest、Jersey、Play。Restful服务的两种架构倾向:1、初期和发展期不一样;2、全栈Go,一步到位。
高并发网络服务:Go和Node.js
这个项目中的本地视频编解码组件:C&C++
不得不用Java的情景:一些Java实现的框架组件的做互操作,要方便一点。其中Play的scala在其优点中也提到Java生态圈这个事情,证明这个优势不容小觑。
这个项目的Restful业务服务模块最终决定选择分两步走的策略,初期选择DjangoRest框架快速设计实现,后期可以再用GoWeb或者Play之类的高性能解决方案优化实现。Django Rest Framework、Jersey之类的框架除了提供面向Rest服务的实现方案,同时也引导项目的Restful设计趋于规范。在Restful规范设计这方面推荐两本书:《Restful Web Services Cookbook中文版》和《Restful Web APIS中文版》,帮助大家的Restful API早日成为真正的Restful API。选用DjangoRest的另外一个优势是Python,我们这个项目是社交产品,选用图书库neo4j作为主要存储设施之一,和其他Python库一样,neo4j的python操作库API也是很简单易用。
这个项目的应用容器技术层的技术选型已经基本结束。
下一步就是要熟悉Golang高并发网络服务和C++媒体编解码问题了。