如何设计一个异步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受到最多关注的功能是其异 ...
随机推荐
- 56_实现类似spring的可配置的AOP框架
> config.properties 配置文件 key=类名 > BeanFactory Bean工厂,负责得到bean getBean("xxx") &g ...
- (转)Python3异常-AttributeError: module 'sys' has no attribute 'setdefaultencoding
基于python3.6.1版本,在一个.py文件中,加入这3行:import requests, re, sysreload(sys)sys.setdefaultencoding("utf- ...
- Object Detection API 相关
训练官方提供的数据集: http://blog.csdn.net/LiJiancheng0614/article/details/77756252 训练自己的数据集(墙外): https://medi ...
- 【转】Android实战技巧之四十九:Usb通信之USB Host
零 USB背景知识 USB是一种数据通信方式,也是一种数据总线,而且是最复杂的总线之一. 硬件上,它是用插头连接.一边是公头(plug),一边是母头(receptacle).例如,PC上的插座就是母头 ...
- PhpStorm破解版及使用教程
本文引自网络,仅供本人学习使用之用,感谢网友的分享 PhpStorm PhpStorm 是 JetBrains 公司开发的一款商业的 PHP 集成开发工具,旨在提高用户效率,可深刻理解用户的编码,提 ...
- k8s mongodb 集群配置
service.yaml apiVersion: v1 kind: Service metadata: name: mongo labels: name: mongo spec: ports: - p ...
- TDD&BDD
BDD行为驱动开发的一种敏捷开发技术 TDD测试驱动开发
- linux IP 命令使用举例(转)
ip 1.作用ip是iproute2软件包里面的一个强大的网络配置工具,它能够替代一些传统的网络管理工具,例如ifconfig.route等,使用权限为超级用户.几乎所有的Linux发行版本都支持该命 ...
- char a='1'和char a=1区别
char a='1'表示:把字符为1,ASSIC码为49的值赋值给a: char a= 1表示:把ASSIC码为1的值赋值给a
- calico 排错记录 apt-get install telnet
1.用kubespray部署一个单节点集群,kubectl get pods -n kube-system,结果: calico-node-7v8wx 1/1 Running 0 2dcalico-n ...