需求比较简单,提供一个异步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服务——接口部分的更多相关文章

  1. 如何设计一个异步Web服务——任务调度

    接上一篇<如何设计一个异步Web服务——接口部分> Application已经将任务信息发到了Service服务器中,接下来,Service服务器改如何对自身的资源进行合理分配以满足App ...

  2. 深入理解Tornado——一个异步web服务器

    本人的第一次翻译,转载请注明出处:http://www.cnblogs.com/yiwenshengmei/archive/2011/06/08/understanding_tornado.html原 ...

  3. 《Introduction to Tornado》中文翻译计划——第五章:异步Web服务

    http://www.pythoner.com/294.html 本文为<Introduction to Tornado>中文翻译,将在https://github.com/alioth3 ...

  4. Python开发【Tornado】:异步Web服务(一)

    异步Web服务 前言: 到目前为止,我们已经看到了许多使Tornado成为一个Web应用强有力框架的功能.它的简单性.易用性和便捷性使其有足够的理由成为许多Web项目的不错的选择.然而,Tornado ...

  5. 如何设计一个良好的API接口?

    沟通创造价值,分享带来快乐.这里是程序员阅读时间,每天和你分享读书心得,欢迎您每天和我一起精进.今天和大家一起讨论的话题是如何设计一个良好的API接口? 作者:梁桂钊 解读:张飞洪 挑战 API是软件 ...

  6. 前端利用百度开发文档给的web服务接口实现对某个区域周边配套的检索

    最近项目需要实现地图功能,以便于实现对房源周边配套设施的检索.内容如下 其实百度官方有对应的api,但是对于一个网站来说这样的样式难免有些难看 这样的结果显然不能满足当下的需求,所以我决定利用官方给的 ...

  7. [译]Spring Boot 构建一个RESTful Web服务

    翻译地址:https://spring.io/guides/gs/rest-service/ 构建一个RESTful Web服务 本指南将指导您完成使用spring创建一个“hello world”R ...

  8. WPF 多线程 UI:设计一个异步加载 UI 的容器

    对于 WPF 程序,如果你有某一个 UI 控件非常复杂,很有可能会卡住主 UI,给用户软件很卡的感受.但如果此时能有一个加载动画,那么就不会感受到那么卡顿了.UI 的卡住不同于 IO 操作或者密集的 ...

  9. 第五章:异步Web服务

    到目前为止,我们已经看到了许多使Tornado成为一个Web应用强有力框架的功能.它的简单性.易用性和便捷性使其有足够的理由成为许多Web项目的不错的选择.然而,Tornado受到最多关注的功能是其异 ...

随机推荐

  1. sysbench安装、使用、结果解读

    sysbench是一个模块化的.跨平台.多线程基准测试工具,主要用于评估测试各种不同系统参数下的数据库负载情况.目前sysbench代码托管在github上,项目地址:https://github.c ...

  2. chromedriver与chrome各版本及下载地址

    Selenium从2升级到3之后呢,Selenium 3 相较于2最大的变化就是更加的标准化,可以支持更多的浏览器.那我们做自动化的时候如果用的是selenium3的话,首先要坐的就是下载不同浏览器的 ...

  3. EF5.0中的跨数据库操作

    以前在用MVC + EF 的项目中,都是一个数据库,一个DbContext,因此一直没有考虑过在MVC+EF的环境下对于多个数据库的操作问题.等到要使用时,才发现这个问题也不小(关键是有个坑).直接说 ...

  4. myeclipse10无法weblogic10.3的问题解决方案

    在完成了myec与wl10的基本配置后,启动报如下错误 Parsing Failure in config.xml: java.lang.AssertionError: java.lang.Class ...

  5. 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 ...

  6. 【转】给网站添加X-UA-Compatible标签

    X-UA-Compatible是神马? X-UA-Compatible是IE8的一个专有<meta>属性,它告诉IE8采用何种IE版本去渲染网页,在html的<head>标签中 ...

  7. redis命令手册

    Redis 键(key) 命令 命令 描述 Redis DEL 命令 该命令用于在 key 存在是删除 key. Redis Dump 命令 序列化给定 key ,并返回被序列化的值. Redis E ...

  8. 如何用IDEA http://localhost:8080/不带上项目名访问

    IDEA TOMCAT设置中把这里的项目名去掉即可

  9. Inter exchange Client Address Protocol (ICAP)- 互换客户端地址协议

    https://github.com/ethereum/wiki/wiki/Inter-exchange-Client-Address-Protocol-(ICAP) Transferring fun ...

  10. VS2010自行编译OpenCV2.4.4时缺少python27_d.lib的解决方法

    错误 24 error LNK1104: 无法打开文件“python27_d.lib”  C:\OpenCV\VS2013_64\modules\python\LINK opencv_python 编 ...