Python异步SOAP调用方案

来源:互联网 发布:好的炒股软件 编辑:程序博客网 时间:2024/05/20 22:29

        1. 问题描述

         一般来说,SOAP服务器接收到一个请求,处理这个请求,然后发送回复。这个过程通常希望是很快完成的;或者说,在用户可以接受的时间内完成。
   然而,服务器可能并不能总是很快地提供回复。一个操作可能涉及到复杂的数据库查询、文件系统或者依赖于另一个耗时的操作。这个操作将占据HTTP控制器而使得其不能接受其它的SOAP请求,这将降低系统的整体性能。
   这里是一个例子:
  
   假设有3个请求A、B和C处于HTTP请求队列(图1),A需要1秒钟完成,B需要10秒钟完成而C则需要2秒钟完成。既然这3个请求都处于同一个HTTP队列,在同步模式下,可以知道请求A将在1秒后回复,请求B将在11秒后回复,而请求C将在13秒后回复。
   在这种情况下请求C的回复会显得不合理,因为它是一个可以快速完成的任务,所以它期望能够快速地得到回复。问题在于请求B阻止了HTTP控制器处理C的请求。更槽糕的是,如果请求B需要100秒或者更多的时间才能完成,请求C则只能继续等待。
   另外,从请求B的客户端来看,它也一直在等待请求B的回复而不能做任何事情,请求B的客户端也使得它的用户处于等待状态。
  
  2. 我们的方案
  
   为了获得服务器端和客户端最大程度的灵活度,设计为基于线程池的异步处理机制,如图2:
  
  3. 客户端线程池
  
   RequestListener的实例在这里维护,它负责将远程调用请求发送给远程服务器。而有时它们也会向远程服务器询问远程方法执行的情况和状态。一旦服务器响应了数据,它将通知请求处理器RequestHandler去执行后续的指令。
  
  4. 客户端观察者
  
   这里通过引入观察者模式来使得客户端能够灵活地处理服务器响应。如果该响应是关于远程方法的执行情况信息,处理器也会将该信息显示给用户。并且这里可以定义多个观察者,从而大大地提高了事件处理的灵活性。
  
  5. 服务器端线程池
  
   对于一个需要很长时间才能完成的远程方法,最好的办法就是启用一个线程来执行它。新的线程从HTTP处理器的主线程分离开来,使得该处理器可以接受一个远程方法请求。从而大幅提高HTTP处理器对于处理类似耗时远程方法的处理性能。
  
  6. 状态跟踪
  
   HTTP是一种无状态的协议,它不能跟踪任何HTTP请求直到服务器有响应。所以,这里需要产生一个全局唯一的标识并且标记到线程池中的每个线程上去。客户端线程也需要保持这个全局唯一的标识,当客户端需要知道远程方法的执行状态时,它需要向SOAP服务器出示该标识,这样服务器才能知道客户端想知道的是哪个线程的执行状态。
   ThreadSession的实例负责维护服务器端线程池的相关数据,这其中包括线程标识,待执行的远程方法名称和参数,远程方法的输出结果。当带有全局标识的请求被HTTP处理器执行时,处理器将搜索ThreadSession实例。如果输出数据已经生成,处理器将数据整理后发送给客户端,然后ThreadSession实例负责清除执行线程的相关数据。
  
  7. 其它方面
  
   对于从HTTP处理器分离出来的线程,程序不能控制它的执行,那是操作系统的事情。然后,可以在该线程开始的时候赋予它一个较高级别的执行标识,这样线程就可以相对比较快地完成。
   从主线程分离出一个个的子线程是相对容易的。但是,让子线程增长得太快也不是好事情,某些系统对子线程的个数也有限制。另外,如果线程在执行的过程中卡死了,线程池就要负责监视和清除这些不能执行下去的线程。
某些可配置的策略可以使得这个异步调用方案更能体现出价值。显然,将所有的远程方法都使用线程池模式执行是不明智的。只有真正耗时或者用时不确定的远程方法值得启动独立的线程来执行。从客户端的角度来说,花个几秒钟来监听服务器响应来使得用户的操作更有针对性,也不失为一个好办法。
  
  8. 方案可行性及结论
  
   我们已经在Python下实现了该方案的模型。Python Web服务被发布到HPUNX机器上,并且我们使用了Python客户端和.Net客户端来验证SOAP服务。某些耗时的远程方法被设置到线程池并将以异步模式执行。测试结果表明该方案对系统总体性能有显著提升。
   测试用例使用了3个相对较快的方法(小于0.5秒)和1个较慢的方法(1.5秒)。在性能测试工具LoadRunner帮助下,我们可以模拟每3秒钟增加2个用户直到12个用户工作在该系统下。测试结果表明异步模式下每秒可以处理的HTTP请求数大大超过了同步模式,从而说明异步方案具有更好的系统性能。
  
   该方案的价值在于实现了Python Web服务的异步调用模式,这是在传统Python Web服务中所没有提供的功能。并且,观察者模式和双线程池的设计可以使得该方案在实际应用中拥有最大限度的灵活性。


原文链接:

http://www.zhichenglw.com//lunwen_show.php?lunwen_id=44312





原创粉丝点击