我的应用程序最多运行180个AJAX作业,这些作业在服务器端是IO密集型的(长时间运行的SELECT查询).
我想优化我可用的多个CPU内核的负载,从每个AJAX调用顺序执行的设计切换到执行这些请求的设计,最多并行执行4个请求.
一个可能但丑陋的解决方案可能是在客户端上同时发出所有180个请求,并让服务器使用Semaphore存储的Session或者Application级别.我将在稍后讨论应用程序工作负载.
我想找到一个更好的解决方案,其中调用全部按顺序启动(表上的每一行是一个不同的检查查询)但是当任何终止时,下一个启动并且有一些(即4个)并发AJAX请求与各自的装载机指标.
我曾尝试使用Threadpool-js,但我发现自己无法使用工作者的jQuery
我目前的代码如下
function GlobalCheck() { //entry point
if (ValidateDate()) {
//Below are global variables
list = $(".chkClass:checked"); //Only checked rows deal to AJAX request
num = $(".chkClass:checked").length; //Total number of ajax calls
done = 0; //Count of complete calls. When it reaches num we are done!
if (list.length == 0) {
alert('...');
return;
}
$(".pMessage").fadeOut();
$(".tbStatus").html('');
$(".submit").hide();
$(".exportFunctions").fadeOut();
$(".loader").show();
$(":checkbox").attr('disabled', true);
SingleCheck(0); //simplification, I do other …Run Code Online (Sandbox Code Playgroud) 我们有一个Rails应用程序,我们在html头中包含我们的应用程序依赖项application.js:
//= require jquery
//= require analytics
// other stuff...
Run Code Online (Sandbox Code Playgroud)
然后在单个页面上,我们在页面底部有一个脚本标记,用于analytics:
<script>
analytics.track('on that awesome page');
</script>
Run Code Online (Sandbox Code Playgroud)
这通常很好,但偶尔我们会看到错误analytics is not defined,最近一次是在Chrome 43上.因为所有内容都应该同步加载,这似乎应该是开箱即用,但我将脚本更改为:
<script>
$(document).ready(function () {
analytics.track('on that awesome page');
});
</script>
Run Code Online (Sandbox Code Playgroud)
而现在我们偶尔会看到$ is not defined.我们没有看到来自同一IP的任何其他错误,否则我会怀疑出现了问题application.js.任何其他想法为什么它可能会破裂?您可以在此处查看示例页面.
完整的application.js:
// Polyfills
//= require es5-shim/es5-shim
//= require es5-shim/es5-sham
//= require polyfills
//
// Third party plugins
//= require isMobile/isMobile
//= require jquery
//
//= require jquery.ui.autocomplete
//= require jquery.ui.dialog …Run Code Online (Sandbox Code Playgroud) 此问题是Max HTTP Connections的扩展
Web工作者给这个等式带来了什么样的影响,限制会增加吗?如同3个网络工作者能够发送(3*浏览器限制)请求?
我正在ASP.NET MVC3中进行企业应用程序开发.当然,我有不同的主布局和多个视图.
我的担忧
我的想法
请分享您的想法,欢迎任何想法和建议!
编辑:2012年9月1日
下面的答案更多地讨论了Web应用程序开发领域的优化技术 - 欣赏这些答案.
我想从体系结构的角度讨论,重点是创建正在呈现的页面所需的动态资源集合.
例如,在特定的视图中,我想使用需要jquery-ui-1.8.11.min.js的jQuery UI,在某些视图中我想使用需要MicrosoftMvcAjax.js和jquery.unobtrusive-ajax的MVC3 ajax. min.js
我不想在主布局中包含永久引用,这将导致为所有视图加载这些j.相反,我想在运行时包含动态的js文件.
希望这可能会增加清晰度!
谢谢你的帮助 - 维诺德
编辑澄清:
在性能方面(虽然这仍然是一个狂野的术语,我知道),哪个更好 - 通过RequireJS加载本地版本或jQuery的CDN版本?
为了记录,RequireJS在线文档包含一些似乎阻止CDN使用的段落,虽然我不太确定100%的含义:
不要在构建中混合使用CDN加载和shim配置.示例场景:您从CDN加载jQuery但使用shim配置加载类似于依赖于jQuery的Backbone的股票版本.在进行构建时,请确保在构建的文件中内联jQuery,并且不要从CDN加载它.否则,Backbone将在构建文件中内联,并且将在加载CDN的jQuery之前执行.这是因为shim配置只会延迟加载文件,直到加载依赖项,但不会对define进行任何自动换行.在构建之后,依赖关系已经内联,shim配置不能延迟执行非define()'d代码,直到以后.define()模块在构建之后可以使用CDN加载的代码,因为它们正确地将它们的源包装在定义工厂函数中,该函数在加载依赖项之前不会执行.所以上课:shim config是非模块化代码遗留代码的一种权宜之计.define()'d模块更好.
理论上,使用CDN jQuery文件会导致另外一个HTTP请求(不能使用r.js与其他JS文件合并),但是具有潜在的好处,即访问者可能已经从其他网站缓存了CDN版本.访问过.
但是,如果我从googled信息中得到了正确的结果,你仍然需要向r.js提供一个本地jQuery副本,因为生成的缩小的JS文件仍然需要包含jQuery模块的副本以确保依赖性的一致性.这将导致在本地和CDN上加载jQuery.(希望我得到这个部分吧?)
那么,哪种方式更好?
我正在使用由IIS 7.5托管的WebApi休息服务控制器,我从这篇文章中了解到:
一的WebAPI服务,默认情况下,并行执行所有传入的请求,但只有当目前的多个请求(在某一时刻)的来源不同的会话. 也就是说,如果单个客户端将同时向服务器发送一些请求,则所有这些请求将按顺序执行,并且不会同时执行.
这种行为对我们来说是一个真正的问题,因为在某些情况下,我们的客户端会异步地(通过浏览器)从不同客户端的侦听器发送大量请求,并且所有这些请求实际上都会排队,而不是在服务器上同时执行.因此,在某些情况下,我们遇到了严重的性能问题,这些问题在客户的网页上非常明显.
我们怎样才能解决这个问题?我知道我们可以 禁用会话状态,但这不是正常的事情.
我使用 Vuejs 和 DataTransfer 异步上传文件,并且我希望允许拖放多个文件一次上传。
我可以进行第一次上传,但是在上传完成时,Javascript 已经垃圾收集或更改了 DataTransfer 项目对象。
我怎样才能重新设计这个(或克隆事件/DataTransfer 对象),以便在整个 ajax 调用过程中我仍然可以使用数据?
我已经遵循了关于如何使用 DataTransfer 的 MDN 文档,但我很难将它应用于我的特定案例。我也试过复制事件对象,正如你在我的代码中看到的那样,但它显然没有做深复制,只是传递了引用,这没有帮助。
methods: {
dropHandler: function (event) {
if (event.dataTransfer.items) {
let i = 0;
let self = this;
let ev = event;
function uploadHandler() {
let items = ev.dataTransfer.items;
let len = items.length;
// len NOW EQUALS 4
console.log("LEN: ", len);
if (items[i].kind === 'file') {
var file = items[i].getAsFile();
$('#id_file_name').val(file.name);
var file_form = $('#fileform2').get(0);
var form_data = new FormData(file_form);
if (form_data) { …Run Code Online (Sandbox Code Playgroud) "服务器必须按照收到请求的相同顺序发送对请求的响应".
所以,我想,如果我从浏览器发出多个AJAX请求,它们仍将按照服务器接收它们的顺序进行处理.
但后来,我正在阅读Alex Maccaw的这篇文章,他说:
"最后一个问题是与并行发送的Ajax请求.如果用户创建记录,然后立即更新同一记录,将同时发送两个Ajax请求,一个POST和一个PUT.但是,如果服务器在"创建"之前处理"更新"请求,它就会吓坏.它不知道哪条记录需要更新,因为还没有创建记录.
解决方案是管道Ajax请求,并以串行方式传输它们.Spine默认执行此操作,排队POST,PUT和DELETE Ajax请求,以便一次发送一个.只有在前一个请求成功返回后才发送下一个请求."
那么,我如何以编程方式创建Alex Maccaw提到的场景?
为什么Firefox随机停止加载<script>用js动态添加的标签?
在这张图片上,我动态加载这些脚本,然后将它们添加到dom中
相当随机,结果就是这样,动态加载的随机脚本和其他脚本(7-15s之间)之间存在很大的滞后
我实际上加载了我的脚本
function(url, callback){
var elem = document.createElement("script");
elem.async = true;
elem.src = url;
elem.type = "text/javascript";
elem.onload = callback;
document.getElementsByTagName("body")[0].appendChild(elem);
}
Run Code Online (Sandbox Code Playgroud)
编辑:
当我在我的html页面中添加脚本标签时,滞后不会出现,它只会在我用JavaScript加载脚本时出现.但实际上我需要用JavaScript加载这些脚本.
有一个小 提示的错误https://jsfiddle.net/ccgb0hqr/如果警报显示立即刷新页面,直到错误发生
我正在尝试用javascript预加载音频文件.我正在使用chrome,当我的文件的http请求长大的文件数被chrome取消时...为什么?我能做什么?这是我的代码:
filesToLoad = 44;
filesLoaded = 0;
for ( var ni = 1; ni < filesToLoad; ni++) {
console.log("start::: " + ServerPath + 'audio/' + ni + '.mp3');
loadAudio(ServerPath + 'audio/' + ni + '.mp3');
}
function loadAudio(uri) {
var audio = new Audio();
audio.addEventListener('canplaythrough', isAppLoaded, true); // It
audio.src = uri;
return audio;
}
function isAppLoaded() {
filesLoaded++;
if (filesLoaded >= filesToLoad) {
cb();
}
console.log("load::: " + ServerPath + 'audio/' + filesLoaded + '.mp3');
}
function cb() { …Run Code Online (Sandbox Code Playgroud) javascript ×7
ajax ×2
asp.net-mvc ×2
html ×2
http ×2
jquery ×2
analytics ×1
asynchronous ×1
browser ×1
c# ×1
cdn ×1
css ×1
firefox ×1
html5 ×1
html5-audio ×1
loading ×1
razor ×1
requirejs ×1
script-tag ×1
vuejs2 ×1
web-worker ×1