商城架构演变

性能

一开始的重点是提高服务的性能、反应速度,并且尽可能的保证系统的安全。

第一阶段

第一阶段

商城第一阶段的框架采用的是传统的动静分离+负载均衡的配置。

  • 最外层是采用F5做的负载均衡和反向代理
  • 两台Ngnix服务器负责处理静态资源的请求,并将动态请求分发给Tomcat服务器集群
  • 商城的应用(网站、触屏版等)都建立在Tomcat服务器上,主要采用SpringMVC + Freemarker
  • 应用通过API服务器暴露出的接口对数据库进行增删改查的操作

第二阶段

第二阶段框架的出现是为了解决第一阶段暴露出的几个问题:

  • Tomcat服务器过于忙碌:

    • Tomcat服务器的一般工作流为:接收到Ngnix服务器转发的动态请求 => 将动态请求按照业务逻辑调用API服务器的接口 => 将API服务器返回的数据和Freemarker结合,生成HTML文件
    • 对于经常被访问到的页面(首页、商品详情页等),Tomcat服务器需要不断重复他的一般工作流,即使最后生成的HTML文件都是一模一样的。
  • Tomcat服务器API服务器交互过于频繁:即使API服务器有如memcached类的缓存,依然会有很多不必要的网络消耗

因此,我们觉得最好能将HTML文件缓存下来

第二阶段

我们在Tomcat服务器上加上了EhCache过滤器。一些经常会被访问到的页面(譬如首页、商品详情页等)在第一次被访问过并成功生成HTML页面后,会被记录在内存中,下一次访问的时候就不会再向API服务器请求,也不会再解析Freemarker模板,内存中的页面会直接返回。

第三阶段

第二阶段的框架一上线就暴露出了问题:页面不能及时更新,需要等EhCache自带的缓存更新机制(通常是缓存池满了)激活,缓存才会更新;而我们需要缓存更新是及时的、是可控的。

所以,我们自制了一个叫Backbone的微服务

第三阶段

其实Backbone目前就被当成了一个定时任务系统,只不过起名的时候,我们对这个系统寄以重托,所以给了一个很大的名号。

工作流是这样的:

  • 当有缓存的内容进入EhCache的时候,Backbone会接收到请求的参数
  • Backbone根据接收到的请求参数,按照业务逻辑,请求API服务器;之后将API服务器返回的结果拼接,生成一个签名,最后将<请求参数,签名>存入Redis
  • Backbone定期从Redis中取出请求参数,并按照页面逻辑,请求API服务器,如果API服务器返回的结果拼接后的签名和Redis中存的签名一致,则无变化;如果不一致,Backbone会删除Redis中的记录,并调用Tomcat服务器暴露的接口删除EhCache中该请求的缓存。

第四阶段

第三阶段的框架还是有瑕疵,有这么三个最为明显:

  • 既然第二次访问同链接访问的是缓存的内容,为什么还要到Tomcat服务器才处理
  • 缓存的HTML文件能不能看到
  • EhCache中存的很多数据都是冗余的

于是,我们采用了Ngnix+Lua的方式来解决上面三个问题。

第四阶段

Ngnix服务器Tomcat服务器生成的HTML文件保存到Redis中,这样Redis就被做成了Ngnix服务器集群统一存储HTML文件的地方。

优化

日志系统

经过四个阶段的性能优化,整个商城的服务应该算OK,接下来我们想让开发调试更轻松一些。

我们觉得目前开发调试的瓶颈是日志:

  • 一方面 因为正式环境需要堡垒机才能操作,如果需要通过看日志来解决问题,需要到堡垒机看日志或者让运维拖日志下来,整个流程非常的难受。日志不是什么生死攸关的东西,我们想要看到线上实时的日志。
  • 日志中打印了很多很多的内容,使用tail -f之类的命令,滚屏会非常的快,这样看日志太伤神了。我们想要更优雅、更简单的查看日志的方法。

一种解决方法是将日志保存到专门的一台服务器,然后通过tail -f XX | grep XXX之类的命令来看。这种方法是能基本解决以上两个问题,但是不那么优雅,不能算作一个系统的解决方案。

于是,我们采用了ElasticSearch + LogStash + KinabaELK)。一开始我们想自己利用Bootstrap或者Framework7写一套系统,但是太懒,同时也发现ELK已经把我们想做的都做了,有些小功能,我们改改Kinaba就能实现,所以直接把ELK拿来用了。

首先我们自制了一个Admin微服务来监听处理Tomcat服务器通过MQ发送过来的日志

日志系统

日志服务的工作流是这样的:

  • Tomcat服务器的日志会被发送到MQExchanger
  • Admin系统会将监听到的日志进行处理(Tomcat服务器的日志利用拓展log4j.appender,封装了一些附加信息),打印到admin-log.log文件中
  • LogStash会分析admin-log.log,并将分析的结果实时的放入ElasticSearch
  • KinabaElasticSearch提供了一个可视化的界面,在这个界面中,我们能筛选日志,能实时打印日志

小助手

最初的想法是利用Slack + Hubot,但是依然是因为懒,而转用了微信。

微信小助手的主要用处就是检查服务的上线状态,发送上线检查之类的关键字,就会激活我们写的检查程序,主要涉及商城页面能不能正常打开,有些流程能不能走通,如果走不通是因为跟API服务器的沟通断了还是API服务器坏了还是什么。其次还加上了一些权限设置以及小助手注册机制等等。

未完待续

之前坚持要自己做日志系统,还有部分原因是会根据分析日志得到的结果加上推荐系统和优化搜索。

未完待续
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,924评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,781评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,813评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,264评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,273评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,383评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,800评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,482评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,673评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,497评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,545评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,240评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,802评论 3 304
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,866评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,101评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,673评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,245评论 2 341

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,573评论 18 139
  • Ehcache是现在最流行的纯Java开源缓存框架,配置简单、结构清晰、功能强大,最初知道它,是从Hibernat...
    安易学车阅读 2,024评论 0 11
  • 第一次听到深二代这个词是在滴滴司机口 中,一次滴滴打车去南山考试,碍于我是个闷 骚的人,一般不主动搭话...
    五月的星星阅读 1,540评论 0 0
  • 浓厚的灰色云层,使得天空变得低沉,太阳像是某个画家的作品一样挂在天上,时而出现发出惨白的光,时而隐没于云层背后。空...
    安七娘阅读 258评论 0 0
  • 解法一 使用HashMap 之所以会想到用HashMap是因为对于每个字母,若使用HashMap的方式去查找只有O...
    wtmxx阅读 286评论 0 0