了解XMLHTTP异步调用WebService

news/2024/7/16 8:09:23

眼下AJAX炒的很火,它是javascript和xml的技术结合,异步交互、JavaScript脚本和XML封装数据是AJAX的三大特征。xmlhttp是ms几年前就有的技术了,近年也有不少相近的架构,上篇文章介绍了在客户端用脚本进行WebService调用,本文将重点了解异步调用。

异步 RPC

异步远程过程调用 (RPC) 是同步 RPC 机制的扩展。在同步 RPC 中,发出 RPC调用的线程将阻塞客户端,直到 RPC调用完成。异步 RPC 允许发出调用的线程继续执行,并且稍后再获取结果。同样,在异步 RPC 服务器上,即使在已调度的调用从应用程序代码返回到 RPC 运行时(管理器例程)后,逻辑 RPC 调用仍可继续进行

对于XMLhttp调用WebService,还需了解以下2点

HTTP 双连接限制

HTTP 规范表明,一个 HTTP 客户端与任一服务器最多可以同时建立两个 TCP 连接。这可以防止单个浏览器在浏览某个页面(例如,具有 120 个嵌入的缩略图)时,由于连接请求过多而使服务器负载过重。此时,浏览器将仅创建 2 个连接,然后通过这两个管道开始发送 120 个 HTTP 请求,而不是创建 120 个 TCP 连接并通过每个连接来发送 HTTP 请求。对于中间层,此方法的问题在于,中间层可能会有 50 个同时请求连接的用户。如果不得不为每个用户进行一次 MapPoint .NET Web 服务调用,将会有 48 个用户等待两个管道中的一个空闲下来。

线程池限制

ASP.NET 处理传入的请求的方式是通过一个称为进程线程池的一组线程为其提供服务。正常情况下,请求传入后,池中某个空闲的线程将为其提供服务。这里的问题在于,进程线程池不会创建无数个线程来处理大量的请求。具有最大线程数限制是一件好事,因为如果我们无限地创建线程,计算机上的全部资源将只能用来管理这些线程了。通过限制所能创建的线程数,我们可以把线程管理的系统开销保持在一个可控的水平。如果某个请求传入时线程池中的所有线程都被占用,则该请求将排队等候,在忙线程完成任务后,空闲出来的线程才能处理新请求。此方法实际上比切换到某个新线程更有效,因为不需要在请求之间进行线程切换。但存在的问题是,如果线程的使用效率不高(尤其是在非常忙的 Web 服务器上),则等候的请求队列会变得很大。

更多的线程池资料,可以查阅这里

考虑一下从 ASP.NET 页面进行 Web 服务调用的情况。如果进行同步调用,则正在运行的线程将被阻塞,直到 Web 服务调用完成为止。在调用期间,线程无法进行任何其他活动。它无法处理其他请求,只能等待。如果某个单处理器计算机上具有默认的工作线程数 20,则只需 20 个同时进行的请求即可用完全部线程,以后的请求必须排队等候。

重要信息:异步调用WebService时,请使用多线程编程技术。

异步WebService 调用时,如果不使用多线程技术,则在两个或多个线程同时尝试访问同一数据时,将会出现问题。原因就是上面的两个限制

性能和开销

异步调用实际上会使请求处理增加额外的开销,比同步调用要慢 20-30%。异步调用不应直接用作同步调用的替换方法。异步处理程序的用途是在该处理程序处理原始请求的同时,释放 ASP.NET 线程池线程以服务其他请求。只有在服务请求的工作需要大量非 CPU 绑定时间才能完成时,这一功能才有意义。例如,如果请求的完成取决于很多远程过程调用(或者 Web 服务调用)的完成,则适合于实现异步处理程序。如果生成异步处理程序以服务大量消耗 CPU 的请求,则只会增加与 ASP.NET 线程池线程竞争的线程,并且实际上可能会延长请求的总体处理时间。尽管就单个调用所用的时间而言,异步调用较慢,但若有效地使用(如使用重叠调用),则可以显著提高总的吞吐量。


http://www.niftyadmin.cn/n/2851424.html

相关文章

北京大学陈斌教授 python_Python程序设计(胡新明)

Python [paɪθən] 语言,由Guido van Rossum大牛在1990年发明,它是当今世界最受欢迎的计算机编程语言,也是一门对大多数人“学了能用、学了有用、学会能久用”的计算生态语言。本课程的教学目的是使学生具备:通过 Python 程序设计…

ubuntu 18.04-desktop 安装ros 机器人开发环境——筑梦之路

ubuntu 18.04-desktop 安装ros 机器人开发环境需要注意的是这里要安装桌面版系统,ros会涉及到图形程序和建模百度百科的介绍:https://baike.baidu.com/item/ros/4710560?fraladdin#备份自带的软件源 sudo cp /etc/apt/sources.list /etc/apt/sources.l…

Oracle修改SQL语句带时间函数

update 表名 set timeto_date(2012-04-26 03:51:13,yyyy-MM-dd hh24:mi:ss) where id1

python plot label改字体_python – 如何在matplotlib图中更改xticks字体大小

参见英文答案 >Matplotlib make tick labels font size smaller 10个我有以下代码:axdf_pivoted.plot(figsize(30,15),linewidth5)plt.xticks( rotation45)plt.tick_params(labelsize 20)plt.xlabel(transaction_date, font…

php 图片 chunked,php下HTTP Response中的Chunked编码实现方法

进行Chunked编码传输的HTTP Response会在消息头部设置:Transfer-Encoding: chunked表示Content Body将用Chunked编码传输内容。Chunked编码使用若干个Chunk串连而成,由一个标明长度为0的chunk标示结束。每个Chunk分为头部和正文两部分,头部内…

android php get post request,yii2 的 request get post 基本用法 – 通用获取get/post请求

Get Post 基本用法1、普通的get和pst请求$request Yii::$app->request;$get $request->get();// equivalent to: $get $_GET;$id $request->get(id);// equivalent to: $id isset($_GET[id]) ? $_GET[id] : null;$id $request->get(id, 1);// equivalent to…

python分析nginx日志_信息、分析-统计nginx日志的python实现 -by小雨

#!/usr/local/python#-*- coding: utf-8 -*-importosimporttimeimportreimportsysimportip_location"""定义一个间时类,可以选取要分析的间时段,如果没有指定间时段,则分析部全log"""classTimeParser(object):def __init_…

将该字符串首尾的空格去掉,如果字符

string inputStr" xx xx ";inputStrRegex.Replace (inputStr.Trim()," *"," ");