Startup技术架构

startup-architecture

「低头做事,抬头看路。」如果说从不需要番茄钟可以连续专注地工作若干个小时不会被任何打断说明你很有耐心,那么时常抬头看路才更能体现你的大局观。

埋头做事三月,技术框架初见雏形,限于能力、成本、时间等各种因素已经做到目前所能做到的最好。期间也走了不少弯路,付出了很多时间的代价,算是一年级新生交学费了。作为Startup没办法像大公司那样上大型分布式系统和各种让人心动的技术,小米加步枪也许是更好的选择,但我相信野百合也有春天,再优秀的架构也是不断演化出来的。

业务决定了我们对技术的需求是做工具和社交类的移动端开发,但由于没有足够的时间和精力投入到Android和IOS上,这样不符合精益创业的做法,我们需要的是用MVP去快速试错,也许在当下把有限的精力投入到微信服务号和小程序是更好的选择。之前的微信服务号和小程序都是需要企业才可以注册的,虽然现在小程序开放了个人注册,但将服务号绑定附近的小程序时要求是同一主体,所以建议最好还是所有注册都使用同一公司信息。服务号和小程序加认证标志、使用微信支付、开通微信小店、调用高级API等都需要企业认证,但企业认证顺利的不真实,之前调研时网上吐槽的各种坑都没有遇到,前后2小时就通过了。然而之后的微信支付申请却被打回多次耽误了十多天,比较坑的是即使你填错一个字也不可以撤回申请,然后就是等一周后被打回后充填,需要注意的坑包括:商品类目和公司经营范围要吻合,最好上传商品图片和使用微信支付用途的说明文字截图,如果没有就一定不要填网站地址。认证通过后微信服务号也拥有了更多的权限,可以自定义菜单、开通微信小店和客服、通过程序处理消息。当然如果服务号和小程序需要从自己的服务器取数据,就不可避免的要有自己的域名,并且是配置成https可访问的。域名的使用在国内就是个巨坑,做互联网的公司需要早做准备,首先得到万网等域名服务商购得域名,然后可以去腾讯云或者阿里云做免费但漫长的域名备案,前提是你在两家买了云主机产品,然后等工信部和管局审核通过会给你下发备案号,之后还需要公安网备案,然后又是来回的提交打回修改提交的漫长过程,我们做Web站点纯粹是为了公安网备案,如果Web站点没有内容是不会给你通过的,等到网站上可以放域名备案号和公安网备案号将近一个月过去了。现在国家提倡万众创业,但这些职能部门的工作效率着实让人无语,一个月对于互联网公司来说意味着什么,说多了都是泪。前端最大的开发工作量应该就在小程序了,好在微信提供了不错的开发调试工具、较完善的开发文档、UI组件和API库,通过几个demo上手并不难。产品设计上我们追求简约清新的风格,UI和微信原生尽量保持一致,让用户有一致的使用体验,同时又要保证工具的实用性,避免打扰用户和有明显的商业气息。由于图片类应用对流量的消耗量很大,对用户和我们自身都有影响,我们从多个方面进行了优化,每张原图都经过了处理,保证清晰度的前提下控制在200k以内,图片瀑布流使用了延迟加载,上拉时才分页请求新数据,图片服务器开启gzip压缩减少下载流量,图片存储使用CDN保证了各地的访问速度。小程序同样需要考虑并发加载数据的问题,否则可能会出现图片重复显示的问题。在没有线下门店的情况下,小程序十多个入口的引流还是很明显的,我们的应用也吻合小程序「用完即走」的初衷。

后台云主机的选购也走了弯路,由于之前不想在国内备案花上百美金买了Vultr的服务器,结果备案还是跳不过的坎,只能说自己「too young too naive」。好在Vultr是按照使用量付费的,可以拿来搭Shadowsocks服务器,或者以后做爬虫之用。选择阿里云和腾讯云纠结了很久,刚好那段时间有人在朋友圈吐槽过几次阿里云偶发不可用,那段时间腾讯云的价格稍微便宜一点,而且还有一些免费实用的产品,当时还意淫如果用了腾讯云的产品,微信服务号和小程序的各种审核可能更好通过(然并卵),于是就选择了腾讯云主机。然而几个月过去了,阿里云和腾讯云价格战打起来了,现在的阿里云便宜了很多,但只能说和阿里云没缘分了,这些都是后话了。一段时间使用下来腾讯云还算稳定,没有出现服务器掉链子导致服务不可用的情况,而且各种数据分析报表很多。提供给微信服务号和小程序的后台程序部署为不同的微服务,基于Spring Boot的微服务前面配置了Nginx,Nginx根据不同的二级域名转发到不同的微服务、Web站点或者图片服务。Nginx配置了https证书,全站都通过https访问,为了节省成本申请了腾讯云的免费https证书,每个二级域名需要一年申请一次,如果有充裕的资金可以申请泛域名的证书,Startup只能在钱和麻烦面前选择麻烦了。由于对存储的性能要求不高,暂时还不需要购买MySQL、Redis、对象存储产品。结构化数据存储在本机的MySQL,只用于存放整理好的存量数据和收集用户信息。热门图片的权值计算使用了缓存定期刷新到MySQL,由于是单机部署就直接使用了Caffeine内存缓存。图片直接存放在本地磁盘,通过Nginx转发的独立二级域名进行访问,作为CDN的回源这是最节省成本的。之前试用的腾讯云对和七牛对象存储都不能满足要求,两者的免费使用量每月只有10G,纯粹用对象存储成本太高,七牛对象存储使用体验较差,没有实时的使用量统计,使用量统计和腾讯云有较大出入,果断弃之。腾讯云提供了6个自然月每月50G免费流量的CDN服务,而且价格比对象存储便宜,对前端性能优化明显。CDN的配置过程还是有很多坑的,多看几遍官方文档,实在不明白就提工单咨询腾讯的工程师基本都是可以解决的。

目前的技术架构还是比较简单的,但基本可以满足需求,而且还留有一定的优化空间。二级域名和微服务的划分,使得某个服务对性能有更高要求时可以迁移到独立的服务器或者部署多台做负载均衡。近期还有一些技术点需要攻克,比如服务号开通微信小店、微信支付开发、小程序加搜索和公告功能、图像识别技术调研等。

为自己写代码的日子不多,享受这个过程。