3 técnicas simples para aislar secuencias de comandos de AdWords y mantenerlos en buen funcionamiento

A+ A-
google-adwords-rojo-1920

El mundo puede ser un lugar peligroso. Usted escribe su cuidado AdWords sorprendentes código de script y, como un aprendizaje cría de ave para volar, lo envía al mundo y esperar lo mejor.

Pero su código realiza llamadas a otras API que pueden fallar o desaparecer sin previo aviso. También se basa en una hoja de cálculo que puede romperse o tener problemas en cualquier momento.

No se puede controlar estos eventos externos, pero puede crear salvaguardas para aislarse de ellos. Y cuando algo malo sucede, usted puede ser notificado rápidamente.

Una de las cosas interesantes acerca de JavaScript (y muchos otros idiomas) es la capacidad de asignar funciones a las variables. Que le permite pasar fácilmente a las funciones a otras funciones, según sea necesario. Aquí está un ejemplo sencillo:

 función main () {
  función theExecutor (theFunctionToExecute) {
    theFunctionToExecute retorno ();
  }

  función test1 () {Logger.log ( 'Este es función de prueba 1'); }
  función test2 () {Logger.log ( 'Este es función de prueba 2'); }
  theExecutor (test1);
  theExecutor (test2);
}

El código anterior ilustra que se puede enviar funciones (test1, test2) en otras funciones (theExecutor) como variables y ejecutarlos simplemente añadiendo entre paréntesis. Vamos a utilizar esta técnica para crear contenedores para nuestra lógica principal, que nos ayudarán a aislar de acontecimientos externos.

Encontrar Código lenta

Cada segundo está ejecutando su código es un segundo más que algo externo a su guión es capaz de causar un problema. Con el fin de acelerar algo, es necesario medirlo. Aquí es donde entra en juego el código de perfiles.

Perfilado es el acto de medir el rendimiento de varias partes de su código para identificar dónde se están utilizando más recursos. En el caso de secuencias de comandos de AdWords, sólo estamos realmente preocupados por el tiempo, por lo que podemos crear un generador de perfiles simples para medir el tiempo de ejecución de nuestro código.

 / **
 * Código de perfiles simple para medir el tiempo
 * @param funcToProfile - la función a ejecutar (requerido)
 * @param storein - un hash para almacenar los resultados en (opcional)
 * Si no se pasa en, registra los resultados de consola
 * @returns {*} valor devuelto por funcToProfile
 * @author Russ salvaje @russellsavage
 * /
función de perfiles (funcToProfile, storein) {
  si (funcToProfile!) {return; }
  var inicio, final, diff, RetVal;
  start = new Date () getTime (.);
  RetVal = funcToProfile ();
  final = new Date () getTime ().;
  diff = extremo - empezar;
  si (storein! = null) { 
    if (! storein [funcToProfile.name]) { 
      storein [funcToProfile.name] = diff; 
    } Else { 
      storein [funcToProfile.name] + = diff; 
    }
  } Else { 
    Logger.log ([ 'función Ran', funcToProfile.name, 'en', diff, 'ms.'] Unirse ( '').); 
  }
  volver RetVal;
}

La función de perfiles se puede colocar alrededor de cualquier parte de su código que desea medir con el fin de determinar el tiempo de ejecución. Aquí hay un ejemplo:

 función main () {
  perfilador (función testing_profiler () {
    Utilities.sleep (5000);
  });
}

El código anterior debe imprimir algo así como “función testing_profiler Ran en 5008ms.” A los registros. Si desea agregar la cantidad total de tiempo que una acción particular dentro de un bucle se está ejecutando, se puede enviar en un argumento opcional de hash y luego imprimir ese valor después. Aquí hay un ejemplo:

 función main () {
  var profilerLog = {}; // Aquí es donde almaceno el tiempo de ejecución
  for (var i = 0; i <10; i ++) {
    perfilador (función testing_profiler_loop () {
      Utilities.sleep (1000);
    }, ProfilerLog); // Asegúrese de que pasarlo a la función
  }
  printProfilerLog (profilerLog);
}

/ **
  * Una función sencilla de imprimir el registro de perfil
  * /
función printProfilerLog (log) {
  Logger.log ( '');
  Logger.log ( 'RESULTADOS PROFILER');
  Logger.log ( '------------------------');
  for (var clave en el registro) {
    Logger.log ([ 'función', clave, 'ascendió', log [clave], 'MS']. Join ( '').);
  }
  Logger.log ( '------------------------');
}

Observe cómo estoy pasando el profilerLog en la función de generador de perfiles en cada llamada. Eso me permite agregar las llamadas a cada función llamada e imprimir los resultados utilizando printProfilerLog. Los resultados se vería algo como esto:

 Resultados del Analizador
------------------------
función testing_profiler_loop totalizó 10016ms.
------------------------

Esto debería ayudar a determinar donde las partes lentas de su código son para que pueda optimizar. Sólo asegúrese de eliminar cualquier código de perfiles antes de ir en vivo para que haga las cosas no reducir la velocidad.

Los reintentos API

Otro lugar este viene muy bien está ayudando con su lógica de reintento para llamar las API externas. A veces las cosas fallan, y la mayoría de las veces, el mejor curso de acción es simplemente esperar un segundo e intentar de nuevo la llamada. Utilizando una técnica similar a la anterior, podemos implementar una función de reintento genérico que puede ser utilizado con cualquier llamada externa.

 / **
 * Código simple para volver a intentar una función dada
 * @param theFuncToRetry - la función para volver a intentar (requerido)
 * @param retryTimes - el número de reintentos (opcional)
 * @returns {*} valor devuelto por theFuncToRetry
 * @author Russ salvaje @russellsavage
 * /
función de reintento (theFuncToRetry, retryTimes) {
  veces var = retryTimes || 3;
  while (tiempos> 0) {
    tratar {
      theFuncToRetry retorno ();
    } Catch (e) {
      Logger.log (e);
      veces--;
      if (tiempos> 0) {
        Logger.log ( 'volver a intentar '+' + veces más veces ...');
        Utilities.sleep (1000);
      } Else {
        Logger.log ( 'Fuera de reintentos ...');
        tirar electrónico;
      }
    }
  }
}

El uso de este, puede volver a intentarlo limpiamente su API llama un par de veces si no logran sin estorbar encima de su código con un montón de “mientras que” bucles.

Note la llamada a la función Utilities.sleep () en la lógica de reintento. Por lo general, es una buena práctica que esperar una cierta cantidad de tiempo antes de volver a intentar la llamada para dar el servidor la oportunidad de recuperarse. Un ejemplo para el uso de este código sería el siguiente:

 función main () {
  var resp = reintento (function () {
    volver UrlFetchApp.fetch ( 'http://www.example.com/api.json');
  } / *, 10 * /); // uncomment este para volver a intentar 10 veces en lugar de 3
}

También podría enviar en el número de veces que quería volver a intentar, de lo contrario, el valor predeterminado es de tres. Ahora usted no tiene que preocuparse de los problemas del servidor intermitentes con sus APIs.

Notificar a sí mismo cuando algo falla

La aplicación final que me parece muy útil es para notificarle cuando la secuencia de comandos comienza a lanzar excepciones.

Muchas veces, los cambios de API externas o secuencias de comandos de AdWords incluso cambios y sus llamadas comenzarán a fallar. Envolviendo todo su principal función le permite notificará fácilmente cuando la secuencia de comandos comienza a fallar.

 / **
 * Permite enviar un correo electrónico cuando hay un error en theFunction
 * @param theFunction - la función a ejecutar (requerido)
 * @returns {*} valor devuelto por theFunction
 * @author Russ salvaje @russellsavage
 * /
función notifyOnError (theFunction) {
  var TO_NOTIFY = [ 'you+error@example.com'];
  tratar {
    theFunction retorno ();
  } Catch (e) {
    Logger.log (e);
    var sujeto = '[FALLO SCRIPT]' + theFunction.name;
    cuerpo var = 'El script '+ + theFunction.name' ha fallado con el error siguiente:' + e;
    para (i var en TO_NOTIFY) {
      MailApp.sendEmail (TO_NOTIFY [i], asunto, cuerpo);
    }
  }
}

Esta función simple se puede colocar en el comienzo de su función main () para que le avise automáticamente a través de correo electrónico si su código comienza a fallar. Ahora, no sólo va a ver el mensaje en los registros, pero recibirá un correo electrónico con el mensaje de error también.

 función main () {
  notifyOnError (función theNameOfTheScript () {
    var resp = reintento (function () {
      volver UrlFetchApp.fetch ( 'http://www.example.com/api.json');
    });
  });
}

Conclusión

La capacidad de pasar funciones en otras funciones como argumentos pueden ser muy útiles para mantener las secuencias de comandos aislados de los peligros del mundo exterior.

Ellos pueden ayudarle a perfilar su código para encontrar los puntos lentos y también hacen que sea más fácil de leer y mantener mediante la eliminación de la lógica de reintento y el informe de errores de sus funciones principales.

Pero estos son sólo unos pocos ejemplos. ¿Cómo estás usando esta técnica en las secuencias de comandos de AdWords?


Las opiniones expresadas en este artículo son las del autor y no necesariamente de invitados Search Engine Land. Autores del personal se enumeran aquí.


Ads

Compartir

Reciente

La mente de su negocio: Nuestros columnas de búsqueda local de 2017

los practicantes de SEO locales tienen un papel cada vez má...

SearchCap: Seguimiento de Santa, Google API términos y métricas SEO

A continuación es lo que ocurrió en busca de hoy, según ha ...

Marlene Dietrich Google Doodle honores de la carrera de la legendaria actriz

Marlene Dietrich, la icónica actriz de origen alemán, se es...

resultados de búsqueda de imágenes de Google prueba un nuevo cuadro de búsquedas relacionadas

Google está probando un nuevo cuadro de “búsquedas relacion...

Comentarios