记一个社交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的开发过程——基础架构选型(转自一位大哥)的更多相关文章

  1. [已开源/文章教程]独立开发 一个社交 APP 的源码/架构分享 (已上架)

    0x00 背景 真不是和被推荐了2天的博客园一位大神较真,从他那篇文章的索引式文章内容也学习到了很多东西,看评论区那么多对社交APP源码有兴趣的,正巧我上周把我的一个社交APP开源了,包括androi ...

  2. 独立开发 一个社交 APP 的架构分享 (已实现)

    (本博客为原创:http://www.cnblogs.com/linguanh/)   My BananaCloud Android Application 前言:  这算是我的第一个 完完全全 由自 ...

  3. 分析一个贴图社交app的失败原因:FORK(相机)

    FORK(相机)是一个通过分享图片来建立社交的app,它有着鲜明的配色,还算不错的贴图创新,细腻的产品设计,但是由于产品定位不清晰.设计亮点不多以及推广不利,从2014年5月第一版开始就没有火过.所以 ...

  4. Hadoop(分布式系统基础架构)---Hive与HBase区别

    对于刚接触大数据的用户来说,要想区分Hive与HBase是有一定难度的.本文将尝试从其各自的定义.特点.限制.应用场景等角度来进行分析,以作抛砖引玉之用.  Hive是什么? Apache Hive是 ...

  5. WCF技术剖析之一:通过一个ASP.NET程序模拟WCF基础架构

    原文:WCF技术剖析之一:通过一个ASP.NET程序模拟WCF基础架构 细算起来,已经有好几个月没有真正的写过文章了.近半年以来,一直忙于我的第一本WCF专著<WCF技术剖析>的写作,一直 ...

  6. SaltStack 是一个服务器基础架构集中化管理平台

    SaltStack详细部署   一.基础介绍============================================================================== ...

  7. 移动APP的IM后台架构浅析

    IM(InstantMessaging 即时通讯)作为一项基础功能,很多APP都有,比如:手机QQ.微信.易信.钉钉.飞信.旺旺.咚咚.陌陌等.而IM如同我们日常生活中的水和电一样,必不可少,也是很多 ...

  8. [Architecture Design] 3-Layer基础架构

    [Architecture Design] 3-Layer基础架构 三层式体系结构 只要是软件从业人员,不管是不是本科系出身的,相信对于三层式体系结构一定都不陌生.在三层式体系结构中,将软件开发所产出 ...

  9. b2c项目基础架构分析(二)前端框架 以及补漏的第一篇名词解释

    继续上篇,上篇里忘记了也很重要的前端部分,今天的网站基本上是以一个启示页,然后少量的整页切换,大量的浏览器后台调用web服务局部.动态更新页面显示状态这种方式在运作的,从若干年前简单的ajax流行起来 ...

随机推荐

  1. ubuntu下安装与测试mysql

    1.在决定安装mysql之前,要先确定系统是否已经安装mysql. 输入: 1 mysql 结果:说明尚未安装mysql The program 'mysql' is currently notins ...

  2. eclipse中maven项目部署到tomcat

    其实maven项目部署到tomcat的方式很多,我从一开始的打war包到tomcat/webapps目录,到使用tomcat-maven插件,到直接使用servers部署,一路来走过很多弯路. 下面就 ...

  3. 浅谈学习C++时用到的【封装继承多态】三个概念

    封装继承多态这三个概念不是C++特有的,而是所有OOP具有的特性. 由于C++语言支持这三个特性,所以学习C++时不可避免的要理解这些概念. 而在大部分C++教材中这些概念是作为铺垫,接下来就花大部分 ...

  4. pythonweb自动化测试

    from selenium import webdriverimport time def capture(url, save_fn="capture.png"): browser ...

  5. iTunes获取下载的安装包

    打开iTunes, 偏好设置,选择高级,即可找到文件路径

  6. linux查看某个端口被占用

    如8003 端口 使用命令:netstat -nlptu |awk '{print $4,$7}' | grep 8003 [root[@bogon](/user/bogon) ~]# netstat ...

  7. uDig 简介

    uDig是一个 open source (EPL and BSD) 桌面应用程序框架,构建在Eclipse RCP和GeoTools(一个开源的Java GIS工具包)上的桌面GIS(地理信息系统) ...

  8. sgu 495. Kids and Prizes (简单概率dp 正推求期望)

    题目链接 495. Kids and Prizes Time limit per test: 0.25 second(s)Memory limit: 262144 kilobytes input: s ...

  9. org.codehaus.jackson.map.JsonMappingException: No serializer found for class org.hibernate.proxy.pojo.javassist.

    2011-08-16 13:26:58,484 [http-8080-1] ERROR [core.web.ExceptionInterceptor] - org.codehaus.jackson.m ...

  10. 解决 border-radius 元素在应用了 transform 的子元素 时overflow:hidden 失效的问题

    受大家启迪,于是最近深入研究了一下Css3中的一些属性.之中也是碰到了个不为我知的问题,在这里特此总结并与大家分享. 问题重现:在父元素上应用了 border-radius 的圆角属性.加上  ove ...