es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo compartir datos entre una ruta de API y getServerSideProps?

Supongamos que necesito obtener datos no específicos del cliente x de una API externa. Para reducir el tiempo de carga, quiero obtener x una vez, almacenarlo en caché y solo volver a obtenerlo cuando:

1) una solicitud del cliente requiera x y
2) los datos almacenados en caché de x sean más antiguos que ttl segundos.

¿Cómo puedo lograr esto de manera que pueda acceder a los datos en caché de x tanto desde una ruta de API como desde getServerSideProps?

Mis enfoques

x como una propiedad de clase estática

Creé una clase Proveedor con un método estático getX que:

  • obtiene x y lo guarda como Proveedor.x si Proveedor.x no está definido o la obtención anterior tiene más de ttl segundos de antigüedad, y luego
  • devuelve Proveedor.x.

Esto no funciona, ya que Proveedor.x en getServerSideProps y Proveedor.x en la ruta de la API no apuntan al mismo objeto en la memoria. Supongo que esto se debe a que se ejecutan en workers individuales.

Guardar x en un archivo

Similar al primer enfoque, excepto que se guarda x en un archivo local en lugar de ser una propiedad estática. Esto funciona, pero es muy lento ya que tiene que leer y escribir en el disco duro en lugar de en la memoria.

Tags:  , ,

Answer

  1. Avatar for davy.ai
    Caché de x utilizando una biblioteca de memoria compartida

    Para lograr el comportamiento deseado, podríamos utilizar una biblioteca de memoria compartida como shm-typed-array. Creamos un búfer de memoria compartida para almacenar x y usamos un setInterval para obtener x de la API externa y actualizar el búfer de memoria compartida cada ttl segundos.

    En nuestra ruta de API y en getServerSideProps, podemos acceder a los datos en caché de x leyendo desde el búfer de memoria compartida. Esto es mucho más rápido que leer desde un archivo y garantiza que tanto la ruta de API como getServerSideProps accedan a los mismos datos en caché de x.

    Aquí tienes un ejemplo de implementación:

    const Shm = require('shm-typed-array'); // importar biblioteca de memoria compartida
    
    const ttl = 60; // tiempo de vida en segundos
    
    // crear búfer de memoria compartida para almacenar x
    const shmX = new Shm.Float64Array(1);
    
    // función para obtener y guardar x
    const fetchAndUpdateX = async () => {
      const response = await fetch('https://external-api.com/x');
      const x = await response.json();
      shmX[0] = x;
    };
    
    // obtener y actualizar x en un intervalo
    setInterval(fetchAndUpdateX, ttl * 1000);
    
    // función para obtener los datos en caché de x
    const getCachedX = () => shmX[0];
    
    // utilizar getCachedX en tu ruta de API y getServerSideProps
    

    Con este enfoque, podemos obtener x una vez, almacenarlo en caché y solo obtenerlo nuevamente cuando sea necesario y los datos en caché sean más antiguos que ttl segundos. Podemos acceder a los datos en caché de x tanto desde una ruta de API como desde getServerSideProps leyendo desde un búfer de memoria compartida creado utilizando la biblioteca shm-typed-array.

Comments are closed.