@Jörn -- The technique of trying to provide a failover option from a CDN to a local copy is, in my opinion, no more "introducing another point of failure" than it is in hardware failover where you have two disks (or disk arrays) mirrored, so in case one dies, the backup mirror can take over.
Just because you have twice as many disks doesn't mean you doubled the points of failure. It depends on how you configure the use of both. On the contrary, I think perhaps you halved the points of failure, since you are saying now that failure must be twice as bad for the user to notice it. --Kyle On Oct 11, 3:11 pm, Jörn Zaefferer <[email protected]> wrote: > Aren't you just introducing another point of failure? > > Jörn > > > > On Sat, Oct 10, 2009 at 6:20 PM, getify <[email protected]> wrote: > > > Couldn't there be a special URL for a CDN, like an "are you alive" > > type url, that we load first, and then, if that works (and quickly), > > we proceed to load the other files. If not, the CDN is assumed to be > > "down" (or at least too slow), so we failover to loading local > > versions. > > > This is a really rough sketch of an idea, and admittedly pretty ugly, > > but I think it might work (or something close to it). > > > Here's a working example: http://test.getify.com/cdn-failover/ > > > That example fakes a CDN alive check by calling a URL called > > "cdnalive" which will randomly choose to: > > 1. return a 404 > > 2. delay 5 seconds to respond > > 3. respond right away with a simple script snippet that says "var > > googlecdn = true;" > > > If the Google CDN implemented a check url such as that, you could call > > it to test if the CDN was gonna respond quickly, and then decide to > > where to load scripts from accordingly. > > > The logic is very simple (though it looks a little bit complicated). > > Basically, just set a 2 (or whatever length) second timeout, then try > > to load the "alive" check url. If it loads in time, and successfully > > (defining the "googlecdn" variable), proceed to load the scripts from > > the CDN. Otherwise, load the scripts from the local copies. > > > And here's the code for those who want to see it: > > > <script type="text/javascript"> > > function initScripts() { > > // jquery and jquery-ui are now loaded, go for it! > > alert("jQuery and jQueryUI loaded!"); > > } > > > var aliveFailed = null, cdnFailed = false; > > > (function(global){ > > aliveFailed = setTimeout(function(){ > > cdnFailed = true; > > addScript("jquery.min.js", // load scripts from local instead > > function(){ > > addScript("jquery-ui.min.js", > > initScripts > > ); > > } > > ); > > },2000); // only wait 2 seconds for CDN to respond, otherwise pull > > from local copies > > > var head = document.getElementsByTagName("head"), // this is a > > "live" DOM collection, so will update whenever HEAD is ready > > script_done = {}; > > > global.addScript = function(src,onload) { > > var args = arguments; > > if (head[0] == null) { // head not ready yet > > setTimeout(function(){addScript.apply(null,args);},25); > > } > > var script = document.createElement("script"); > > script.type = "text/javascript"; > > script.onload = script.onreadystatechange = function(){ > > if (!(script.readyState && script.readyState!=="complete" && > > script.readyState!=="loaded") && typeof script_done[script.src] === > > "undefined") { // successful load detected > > script_done[this.src] = true; > > script.onload = script.onreadystatechange = null; > > onload(); > > } > > }; > > script.src = src; > > head[0].appendChild(script); > > } > > })(window); > > </script> > > <script rel="googlecdnalive" src="[**http://ajax.googleapis.com/alive? > > **]" type="text/javascript"></script> > > <script type="text/javascript"> > > if (!cdnFailed && typeof googlecdn !== "undefined") { // > > 'googlecdn' defined in the cdn alive check > > clearTimeout(aliveFailed); > > addScript("http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/ > > jquery.min.js", // CDN is up, pull scripts from there > > function(){ > > addScript("http://ajax.googleapis.com/ajax/libs/jqueryui/ > > 1.7.2/jquery-ui.min.js", > > initScripts > > ); > > } > > ); > > } > > </script> > > > On Oct 10, 11:02 am, Steven Black <[email protected]> wrote: > > > I just tested this in a variety of ways and both John's and Phil's > > > methods work great and you're right: appendChild and prependChild both > > > work. > > > > Cool! > > > > **--** Steve > > > > On Oct 9, 10:44 pm, Michael Geary <[email protected]> wrote: > > > > > prependChild or appendChild wouldn't make any difference; they're both > > > > asynchronous. > > > > > Regarding that sub-packet-sized package with a fast timeout, how would > > you > > > > implement that short of recompiling the browser? :-) > > > > > -Mike > > > > > On Fri, Oct 9, 2009 at 6:54 PM, Steven Black <[email protected]> > > wrote: > > > > > > First of all, thanks @jresig because that's just way too elegant. I > > > > > was anticipating something far more complex. > > > > > > A couple of questions: > > > > > > Ifhttp://cdn/jQuery.jsfails, we want the local-domain jQuery.js to > > > > > load next, BEFORE the any other subsequent script which is likely a $ > > > > > (function(){}) or a call for plugin, both of which have a jQuery > > > > > predicate. So I don't sense that Phil's ...('head')[0].appendChild > > > > > (script) would work reliably. Am I wrong about that? Does this > > > > > really work as you expect, Phil? I would expect a prependChild(), > > no? > > > > > > Second, Dave raises another crux of the matter: we need to bail to > > the > > > > > failover ASAP, ideally within a second or two. It's almost as if we > > > > > need the CDNs to also provide a sub-packet-sized package we could > > > > > request, wrapped inside a very short timeout to bail to the failover. > > > > > > **--** Steve > > > > > > On Oct 9, 9:10 am, Dave Methvin <[email protected]> wrote: > > > > > > > I took this great idea and went ahead implementing it on a few > > sites I > > > > > > > maintain using different syntax. > > > > > > > It's more than a syntax change; it's entirely different semantics. > > > > > > Your version fetches a copy of jQuery asynchronously. If there is > > > > > > a .ready() handler below that block of code, jQuery may not be > > loaded > > > > > > by the time it is reached and you'll get errors. By using > > > > > > document.write and a script tag, you can be guaranteed that the > > > > > > browser won't proceed to run any code below it until it either > > loads > > > > > > the script or gets an error back from the request (like a 404 or a > > > > > > timeout). > > > > > > > I'd think the timeout situation is the most likely outcome when > > > > > > Google's CDN is down, which means the user will see a blank screen > > for > > > > > > 30 to 60 seconds before it even reaches the document.write anyway. > > So > > > > > > it seems like you'd need to load the Google CDN version > > asynchronously > > > > > > to prevent that. But that raises the question of what to show the > > user > > > > > > while it's trying to find a reachable version of jQuery...- Hide > > quoted text - > > > > - Show quoted text -- Hide quoted text - > > - Show quoted text - --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "jQuery Development" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/jquery-dev?hl=en -~----------~----~----~----~------~----~------~--~---
