记一个社交APP的开发过程——基础架构选型(转自一位大哥)
记一个社交APP的开发过程——基础架构选型
- 基本产品形态
- 技术选型
最近两周在忙于开发一个社交App,因为之前做过一点儿社交方面的东西,就被拉去做API后端了,一个人头一次完整的去搭这么一套东西,上面也没有PM和各种催促,过程还是很轻松愉快充满乐趣的,现在后端已经基本完成,下周会进入联调测试的阶段,有些东西想写一写记录一下,先从技术选型开始。
基本产品形态
产品的基础功能无非是所有社交App都具备的那些东西,新鲜事、好友关系(同微博一样,单向follow)、地理位置(当前的位置、你附近的人)更多小的细节和功能点现在还不便于透露 :)
其实社交这种产品给我的感觉一直是挺怪的,相对于技术和那些抠交互的产品分析来说,这东西更让人着迷的是一种心理魔术,比如上面说道约炮App,你可能会想到陌陌,但是陌陌的产品层面上跟众多社交App是一样的,也是feed、follow和地理位置,而我们正常的社交,正常的朋友圈子用的最多的是微信而不是陌陌,但当夜深人静你想打发掉寂寞的时候,可能就会去用陌陌了,虽然功能和技术相似,但是一些产品细节对用户的暗示却造成了全然不同的结果,就跟QQ、MSN、Gtalk之间的感觉类似,虽然它们的主要功能都是聊天,但是各自的用户群和使用氛围完全不同。结合自身的需求,去体验目标用户的心理,想办法满足自己和用户的心理诉求,这也是做社交类型产品最大的乐趣吧。
技术选型
最开始的技术选型秉着简单清晰、尽快实现想法,减少复杂的引入,但是要尽量为以后的扩展做好准备这么一种想法。很多互联网创业心灵鸡汤比如《黑客与画家》、《Rework》也都大概是这么提倡的,先把东西迅速做出来,然后根据用户的回馈发现问题快速迭代。下面介绍一下我选用的技术栈:
1. 语言:
人生苦短,我用Python
2. 存储和数据访问工具:
这年代存储面临的选择的确很多,但我还是选择自己最为熟悉的MySQL,原因不必多说。根据之前的经验,像是用户表这种会保持不动,但是有些表,比如feed index我在一开始就做了sharding的处理(关于feed的实现和存储结构我在后面会进行介绍)。另外很重要的东西就是数据访问层的实现了,虽然有些东西,比如读写分离的支持,现在不会用到,但是我觉着要支持,最起码要考虑这种情况将来会发生,到时候不至于太苦逼的到处重写代码,另外对于sharding,要做到跟访问通常的表类似的轻松,最后要带点儿ORM功能。
做的第一件事情就是写这个数据访问工具,业务就是增删改查么,没有这家伙还怎么活!?用python两三百行代码对web.py的数据访问模块做下包装就搞出这么一个东西来,https://github.com/chihongze/shard.py 最终可实现读写分离和对sharding的支持。当然在用的过程中发现问题不少,有些查询不能很好的满足需求啊等等,完善中。
3. 缓存
因为这个项目属于80/20那种课余爱好,资源较少,最开始也不想大推,只是给周围的小伙伴们先玩玩,程序员怪叔叔搏妹子一笑什么的,能有两三台机器就很不错了,所以对于传说中的分布式缓存,想想还是算了,多数东西还是直接读库,但是还是搭了个Redis,做啥用?主要是三件事情:1、保存token 2、记录用户在线状态 3、防刷业务 “你输入的太快了,请休息一下继续”之类的。但是所有数据的获取还是走的存储层,到时候如果要加缓存,可以直接在存储层去加,而不必去侵犯上层业务逻辑。
4. 静态存储
做社交对图片的质量要求是很高的,多数都是会在后台专门拿出机器搭image magic等切图服务,但对于初创的社交app,搞这种东西挺耗费资源的,考虑了性价比、开发成本,就直接使用了又拍云的服务,瞬间就搞定了图片存储和处理的问题。
5. 消息队列
对于社交来说,很多事情,比如你有几万个粉丝关注,我要把你刚发的一张裸照推送给这一万个人,那么肯定不能等所有推送完毕再返回给你结果,那会等的不耐烦的,我会立即给你返回发送成功的结果,而把推送这件事情放到幕后,让它自己去玩。这样的需求情景有很多,这时就需要用到消息队列了。消息队列的产品也有很多可以选择,http://www.cnblogs.com/amityat/archive/2011/08/31/2160293.html 这篇文章对现在流行的消息队列做了下大概的介绍。个人对消息队列选择的观点,一是稳定,出了错好恢复,二是容易监控,队列堵了啊什么的我能很方便的监控到,三是并发性,四是接口要容易使用。这四点,RabbitMQ明显胜出。就选用RabbitMQ了。关于RabbitMQ使用的一些细节,会在feed分发的时候做相关介绍。
7. API Server
API全是RESTful的,用的web框架是web.py,目前调试阶段还只是web.py直接对外给客户端的同学做调试,上线后准备走Nginx的反向代理,另外最近也在研究这个项目:http://www.oschina.net/p/gunicorn 可以选择Nginx + wsgi模块 + web.py的模式,也可以是gunicorn + web.py, nginx再反向代理到gunicorn。
对于通常的API,使用web.py容易满足,但是对于我们这个应用来说,私聊是一个最为重要的功能,因此打算把聊天的服务拆出来了,单独拿tornado去做,tornado做长链接更专业一些,不同于web.py,tornado本身就是一个异步的web框架,像Node.js那样。
总体的技术选型就是这些东西吧,非常简单,都是很成熟的一些技术,也没有用什么新东西,但开发起来还是蛮爽的,尤其是Python的开发效率更是没的说,比如那个支持sharding的数据访问工具,原先用Java做过类似的事情,对Spring Jdbc Template做的封装,貌似写了十几个类文件,搞了好多天,现在用Python 两三百行直抒胸意一上午就秒掉了,开发效率完全不一个档次,哈哈哈。
记一个社交APP的开发过程——基础架构选型(转自一位大哥)的更多相关文章
- [已开源/文章教程]独立开发 一个社交 APP 的源码/架构分享 (已上架)
0x00 背景 真不是和被推荐了2天的博客园一位大神较真,从他那篇文章的索引式文章内容也学习到了很多东西,看评论区那么多对社交APP源码有兴趣的,正巧我上周把我的一个社交APP开源了,包括androi ...
- 独立开发 一个社交 APP 的架构分享 (已实现)
(本博客为原创:http://www.cnblogs.com/linguanh/) My BananaCloud Android Application 前言: 这算是我的第一个 完完全全 由自 ...
- 分析一个贴图社交app的失败原因:FORK(相机)
FORK(相机)是一个通过分享图片来建立社交的app,它有着鲜明的配色,还算不错的贴图创新,细腻的产品设计,但是由于产品定位不清晰.设计亮点不多以及推广不利,从2014年5月第一版开始就没有火过.所以 ...
- Hadoop(分布式系统基础架构)---Hive与HBase区别
对于刚接触大数据的用户来说,要想区分Hive与HBase是有一定难度的.本文将尝试从其各自的定义.特点.限制.应用场景等角度来进行分析,以作抛砖引玉之用. Hive是什么? Apache Hive是 ...
- WCF技术剖析之一:通过一个ASP.NET程序模拟WCF基础架构
原文:WCF技术剖析之一:通过一个ASP.NET程序模拟WCF基础架构 细算起来,已经有好几个月没有真正的写过文章了.近半年以来,一直忙于我的第一本WCF专著<WCF技术剖析>的写作,一直 ...
- SaltStack 是一个服务器基础架构集中化管理平台
SaltStack详细部署 一.基础介绍============================================================================== ...
- 移动APP的IM后台架构浅析
IM(InstantMessaging 即时通讯)作为一项基础功能,很多APP都有,比如:手机QQ.微信.易信.钉钉.飞信.旺旺.咚咚.陌陌等.而IM如同我们日常生活中的水和电一样,必不可少,也是很多 ...
- [Architecture Design] 3-Layer基础架构
[Architecture Design] 3-Layer基础架构 三层式体系结构 只要是软件从业人员,不管是不是本科系出身的,相信对于三层式体系结构一定都不陌生.在三层式体系结构中,将软件开发所产出 ...
- b2c项目基础架构分析(二)前端框架 以及补漏的第一篇名词解释
继续上篇,上篇里忘记了也很重要的前端部分,今天的网站基本上是以一个启示页,然后少量的整页切换,大量的浏览器后台调用web服务局部.动态更新页面显示状态这种方式在运作的,从若干年前简单的ajax流行起来 ...
随机推荐
- [转]Debian 安装与卸载包命令(APT&&DPKG)
转自:zhangjunhd 的BLOG 1.APT主要命令apt-cache search ------package 搜索包sudo apt-get install ------package 安 ...
- Eclipse下运行Maven项目提示缺少maven-resources-plugin:2.4.3
将一个手动创建的Maven项目(命令行下可正常运行)导入到Eclipse中,运行时提示这样的错误信息:[ERROR] Plugin org.apache.maven.plugins:maven-res ...
- YTU 2602: 熟悉题型——类设计( 矩形类定义【C++】)
2602: 熟悉题型--类设计( 矩形类定义[C++]) 时间限制: 1 Sec 内存限制: 128 MB 提交: 183 解决: 119 题目描述 定义一个矩形类,数据成员包括左下角和右上角坐标 ...
- AOJ -0189 Convenient Location && poj 2139 Six Degrees of Cowvin Bacon (floyed求任意两点间的最短路)
http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=78207 看懂题就好. 求某一办公室到其他办公室的最短距离. 多组输入,n表示 ...
- 邦定lua函数到C里做为回调
1, int ref = luaL_ref(L, LUA_REGISTRYINDEX); //把栈顶的obj 存在lua的表里面,返回一个唯一的引用,(栈顶的obj被自动清除),,(这个引用作为回 ...
- hql得到一个实体的数量
Session session=this.getSession;string hql="select count(tb) from table tb";Query query=se ...
- CSS构造表单
结构化表单布局 <head> <meta http-equiv="Content-Type" content="text/html; charset=G ...
- Qt之设置QWidget背景色
简述 QWidget是所有用户界面对象的基类,这意味着可以用同样的方法为其它子类控件改变背景颜色. Qt中窗口背景的设置,下面介绍三种方法. 使用QPalette 使用Style Sheet 绘图事件 ...
- HDU 5317 RGCDQ (质数筛法,序列)
题意:从1~1000,000的每个自然数质因子分解,不同因子的个数作为其f 值,比如12=2*2*3,则f(12)=2.将100万个数转成他们的f值后变成新的序列seq.接下来T个例子,每个例子一个询 ...
- matlab注释使用,以及相应的注释快捷键
1.多行注释 单行注释是加% %{ 若干语句 %} 2.快捷键 多行注释: 选中要注释的若干语句, 编辑器菜单Text-<Comment, 或者快捷键Ctrl+R 取消注释: 选中要取消注释的语 ...