@drawoharaik ❤️ dit! << klik me 🐛 🫖 🧚
/defeating-the-sticky-wicket-of-api-limits-with-a-javascript-worker-army
gepubliceerd op: 2013-11-12

TL;DR

als jij veel te veel werk hebt om te doen op de server in verband met api-limieten

geef een deel van het werk over aan de browsers van je klanten om uit te voeren - stuur de resultaten terug naar je database

het probleem

Afgelopen week had ik te maken met (g-provider) api-limieten en te veel geolocatie-aanvragen van een server(s). Ik heb daar een beetje aan gewerkt, dingen op de achtergrond doen, met periodieke herhaaldingen - je weet: de standaard zaken...

De api in kwestie wordt beperkt door ip, en de documentatie raadt aan om hiervan gebruik te maken door de meeste api-aanroepen client-side te doen - in js.

Nu, in dit specifieke geval had ik de resultaten van de api-aanroepen absoluut nodig om server-side te blijven, dus ik kwam op dit compromis (op meer dan één manier) oplossing

de oplossing

Ga ervan uit dat bepaalde klanten bereid zijn om hun cpu te gebruiken om de gegevens te vullen waar ze geïnteresseerd in zijn om mee te werken. In het Nederlands, laat sommige van je klanten taken uitvoeren van een javascript-werkrij om de pomp te activeren waar ze geïnteresseerd in zijn om uit te drinken.

In mijn geval heb ik bepaalde geselecteerde interfaces (die geïnteresseerd zijn in de uitvoer van de genoemde taken) die een klein iframe uitvoeren

<!-- zet een taakrijloopner op bepaalde pagina's/weergaven/indelingen -->
<iframe height="0" width="0" style="display:none;" src="/javascript_jobs/runner"></iframe>
<!-- de taakrijloopner -->
<%= javascript_include_tag :jquery %>
<%= javascript_include_tag :jobs %>
<script>
  jQuery(function(){
    jobs.complete = function(job){
      document.write('voltooide taak ' + job.id);
      document.write('<br>');
    };
    setTimeout(function(){ jobs.start(); }, 1000);
  });
</script>

De js die nodig is om te communiceren met de taakrij is kort en eenvoudig

Alles wat het doet is een taak ophalen, uitvoeren en terugsturen naar de server - zowel de doorvoersnelheid als het maximum aantal taken te uitvoeren in acht nemend.

if(!window.jobs){
//
  window.jobs = {};
  window.jobs.count = 0;
  window.jobs.max = 256;
  window.jobs.throttle = 1000;
  window.jobs.complete = function(){};
//
  jobs.get_next_job = function(){
    var success = function(response){
      job = response['data']['job'];
      if(job){
        jobs.count++;
        jobs.run(job, function(job){
          if(jobs.count