Web项目中后台进程的应用

实在没精力想一个劲爆的Title了😂😂😂

书接上回, 小白用加持各种缓存解决了访问数激增带来的访问变慢的问题后, 好日子没过几天, 又出了新的问题. 某日豆瓣的API挂掉了, 然后连带着小白的系统也跟着挂了. 在从零开始构建那一章里我们设计了在用ISBN查询图书信息的时候, 是通过豆瓣的API远程的获取对应ISBN号的图书信息, 在通过HTTP客户端访问远程信息的时候一般会加上超时时间, 万一网络环境不好访问不到呢, 过了超时时间就会报错, 作为一个能徒手从零写完整个系统的小白呢, 很自然的用了常用的超时参数20秒, 但是小白的服务器只有4个核, 当超过4个人同时在通过ISBN查询的时候, 就把小白的系统挂住了.

很多时候, 我们需要在逻辑里加入 1. 需要长时间运行的逻辑(比如, 压缩图片, 压缩视频) 2. 需要长时间或者不定时间IO等待的逻辑(比如请求站外的资源, 接口)的时候, 我们不能把这些逻辑写到控制器逻辑中, 因为这些操作都会导致控制器挂起, 然后后果就和小白的应用一样了. 

学过多线程的同学这个时候会灵光一闪, 诶, 我用多线程, 遇到这种逻辑就新建一个线程, 然后放到线程里执行, 怎么样? 听起来是个不错的主意, 但是, 当你要重启服务的时候就要小心了, 万一还有现成没有结束呢, 服务就被重启了, 然后就杯具了.

所以为了和Web服务的进程里解藕出来, 我们需要把这些操作放到额外的进程里, 并且将任务数据持久化(调用的Action和参数), 这样当后端进程隔屁重启后, 还可以重新执行没有完成的任务. 当任务执行失败之后, 还可以重新执行任务, 能够设置重试的次数, 当失败超过次数后就终止执行.

比如Python的Celery, huey, Java下用Mule + Quartz or EJB Scheduling + HornetMQ, Ruby的Sidekiq或者DelayedJob.

在引入这些后端服务管理框架之后, 我们还需要用引入消息系统来对接服务管理和Web主进程.然后项目结构就是下面这样子.

加入任务后的系统结构


上图的结构是任务从控制器到消息对列, 然后在到任务管理的过程. 但是因为是通过消息中间件来传递请求的, 所以返回值也只能是以异步的形式反馈回去. 但是我们用的大多数Web框架都是同步的, 比如Django, Flask, Rails, PHP... 而我们的大多数请求也是同步的, 只有极少部分逻辑有异步的需求, 比如取返回值.

所以针对Web和App两个不同的场景, 我们有两种不同的方式.

基于Web的异步任务返回

鉴于Web的特殊性, 我们加入了一个异步的Web服务框架来实现了一个Longpulling的订阅服务.结构如下

加入异步框架后的结构

在向后台服务提交执行的请求后, 生成一个任务的unique的ID返回给网页, 网页上通过Ajax带着这个ID去向异步Web服务订阅这个ID的频道, 当后台任务执行结束的时候, 给这个频道发一个消息, 然后页面就能在第一时间得到执行完毕的消息了, 然后再通过Ajax带着频道ID去获取返回值的接口获取返回值就好了.

APP后端的异步任务返回

手机的消息最好是通过手机操作系统自身的消息机制来返回, 比如苹果的APNS, 或者安卓官方的C2DM. 但是鉴于特殊国情, 国内的话, 有一大堆三方的推送平台, 我也不造那家比那家好用多少, 你可以自行斟酌.

App后端的推送方案

要注意的一点是不管是三方推送也好, APNS也好, 都不能保证100%的到达率. 所以消息外发的任务也最好持久化, 然后通过Feedback机制确保消息到达.

经过上述的一套组合拳后, 小白的网站又可以健康稳步发展了. 不过在上面我们提到了异步Web框架, 这是前面没有涉及到的, 所以下一章我们来讨论: 异步模式

to be continue...

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

推荐阅读更多精彩内容