如何设计一个异步Web服务——接口部分
需求比较简单,提供一个异步Web服务供使用者调用。比如说,某应用程序需要批量地给图片加lomo效果。由于加lomo效果这个操作非常消耗CPU资源,所以我们需要把这个加lomo效果的程序逻辑放到一台单独的服务器上去运行,以免影响应用本身所在服务器的性能。
这篇先讲讲服务的接口部分,侧重于理清应用和服务之间的调用关系,有时间的话,后面再写一篇关于服务内部任务分派资源调度的随笔。
根据这个需求,我们可以很快设计出一套流程:
Application通过向service的addTask接口post任务相关的信息创建一个任务,同时,service将此任务的任务id,即taskId返回给Application,以便Application接下来可以用这个taskId通过getStatus接口查询此任务的进行状态。
问题一:
Application作为一个独立的应用,他肯定需要有自己的任务管理逻辑。也就是说,Application在向Service发出创建任务的请求前,肯定需要先往自己的DB中写入一条对应这个任务的相关数据,以便后续跟踪每个任务的状态和数据。那么application在收到response时,如何将这个response的taskId和自己之前写入DB的那条数据对应起来呢?
如果是上面的那种接口设计,应该是无法实现这个要求的。所以我们需要给addTask接口加一个用来标记任务唯一性的参数customId。如下图:
问题二:
根据上面的设计,Application在创建task之后,会不断调用Service的getStatus接口,来获取该任务的最新状态,比如任务是在等待中、进行时还是已完成。但是,这显然不是一个非常高效的方式。如果任务进行的时间比较长,Application则会在这段时间内多次调用getStatus接口以及时获取任务状态信息。这样做不但加重了Application的负担,更加重了Service的负担。所以,我们可以把这个地方的依赖关系反过来,让Service主动将任务的状态信息通知给Application。相应的,Service和Application的接口也要做相应变化:
如上图,我们将原来由Application调用Service的getStatus接口的过程,改为了Service调用Application的setStatus接口。这样就实现了,一旦task状态发生变化,Service都能实时通知Application,从而减少了两个服务间无用的请求。
问题三:
假如,Application调用Service的addTask接口后,服务器因为种种原因无法响应外部请求了。那么接下来,当task结束以后,Service就没法将这个重要的状态信息反馈给Application了。而且,由于Service不可能永远不停地尝试去调用Application的setStatus接口,直到成功。那么,当Application重新启动以后如何获取之前那个任务的状态就成了一个问题。所以,基于这样的原因,之前的getStatus接口其实还是有存在的必要的。
有了getStatus这个接口以后,如若Application在调用addTask以后出现当机等现象而错过了Service推送的task完成的消息。那么Application在重新启动以后,还可以自己通过Service的getStatus接口获取这个任务的最新状态。
至此,API部分设计完毕。
关于接口的部分,目前我所能想到的问题大概就这么多,不知道有没有什么遗漏或不妥。希望大家不吝赐教,在下感激万分。
下篇:《如何设计一个异步Web服务——任务调度》
如需转载,请注明转自:http://www.cnblogs.com/silenttiger/p/4076333.html
欢迎关注我的微信公众号:老虎的小窝
如何设计一个异步Web服务——接口部分的更多相关文章
- 如何设计一个异步Web服务——任务调度
接上一篇<如何设计一个异步Web服务——接口部分> Application已经将任务信息发到了Service服务器中,接下来,Service服务器改如何对自身的资源进行合理分配以满足App ...
- 深入理解Tornado——一个异步web服务器
本人的第一次翻译,转载请注明出处:http://www.cnblogs.com/yiwenshengmei/archive/2011/06/08/understanding_tornado.html原 ...
- 《Introduction to Tornado》中文翻译计划——第五章:异步Web服务
http://www.pythoner.com/294.html 本文为<Introduction to Tornado>中文翻译,将在https://github.com/alioth3 ...
- Python开发【Tornado】:异步Web服务(一)
异步Web服务 前言: 到目前为止,我们已经看到了许多使Tornado成为一个Web应用强有力框架的功能.它的简单性.易用性和便捷性使其有足够的理由成为许多Web项目的不错的选择.然而,Tornado ...
- 如何设计一个良好的API接口?
沟通创造价值,分享带来快乐.这里是程序员阅读时间,每天和你分享读书心得,欢迎您每天和我一起精进.今天和大家一起讨论的话题是如何设计一个良好的API接口? 作者:梁桂钊 解读:张飞洪 挑战 API是软件 ...
- 前端利用百度开发文档给的web服务接口实现对某个区域周边配套的检索
最近项目需要实现地图功能,以便于实现对房源周边配套设施的检索.内容如下 其实百度官方有对应的api,但是对于一个网站来说这样的样式难免有些难看 这样的结果显然不能满足当下的需求,所以我决定利用官方给的 ...
- [译]Spring Boot 构建一个RESTful Web服务
翻译地址:https://spring.io/guides/gs/rest-service/ 构建一个RESTful Web服务 本指南将指导您完成使用spring创建一个“hello world”R ...
- WPF 多线程 UI:设计一个异步加载 UI 的容器
对于 WPF 程序,如果你有某一个 UI 控件非常复杂,很有可能会卡住主 UI,给用户软件很卡的感受.但如果此时能有一个加载动画,那么就不会感受到那么卡顿了.UI 的卡住不同于 IO 操作或者密集的 ...
- 第五章:异步Web服务
到目前为止,我们已经看到了许多使Tornado成为一个Web应用强有力框架的功能.它的简单性.易用性和便捷性使其有足够的理由成为许多Web项目的不错的选择.然而,Tornado受到最多关注的功能是其异 ...
随机推荐
- sysbench安装、使用、结果解读
sysbench是一个模块化的.跨平台.多线程基准测试工具,主要用于评估测试各种不同系统参数下的数据库负载情况.目前sysbench代码托管在github上,项目地址:https://github.c ...
- chromedriver与chrome各版本及下载地址
Selenium从2升级到3之后呢,Selenium 3 相较于2最大的变化就是更加的标准化,可以支持更多的浏览器.那我们做自动化的时候如果用的是selenium3的话,首先要坐的就是下载不同浏览器的 ...
- EF5.0中的跨数据库操作
以前在用MVC + EF 的项目中,都是一个数据库,一个DbContext,因此一直没有考虑过在MVC+EF的环境下对于多个数据库的操作问题.等到要使用时,才发现这个问题也不小(关键是有个坑).直接说 ...
- myeclipse10无法weblogic10.3的问题解决方案
在完成了myec与wl10的基本配置后,启动报如下错误 Parsing Failure in config.xml: java.lang.AssertionError: java.lang.Class ...
- Oracle 12C Data Gurad RAC TO RAC
Oracle 12C RAC TO RAC Data Guard on RHEL7 0.环境说明 primary db physical standby 操作系统 rhel7 x86_64 rhe ...
- 【转】给网站添加X-UA-Compatible标签
X-UA-Compatible是神马? X-UA-Compatible是IE8的一个专有<meta>属性,它告诉IE8采用何种IE版本去渲染网页,在html的<head>标签中 ...
- redis命令手册
Redis 键(key) 命令 命令 描述 Redis DEL 命令 该命令用于在 key 存在是删除 key. Redis Dump 命令 序列化给定 key ,并返回被序列化的值. Redis E ...
- 如何用IDEA http://localhost:8080/不带上项目名访问
IDEA TOMCAT设置中把这里的项目名去掉即可
- Inter exchange Client Address Protocol (ICAP)- 互换客户端地址协议
https://github.com/ethereum/wiki/wiki/Inter-exchange-Client-Address-Protocol-(ICAP) Transferring fun ...
- VS2010自行编译OpenCV2.4.4时缺少python27_d.lib的解决方法
错误 24 error LNK1104: 无法打开文件“python27_d.lib” C:\OpenCV\VS2013_64\modules\python\LINK opencv_python 编 ...