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 comoProveedor.x
siProveedor.x
no está definido o la obtención anterior tiene más dettl
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.
davy.ai
Caché de
x
utilizando una biblioteca de memoria compartidaPara lograr el comportamiento deseado, podríamos utilizar una biblioteca de memoria compartida como
shm-typed-array
. Creamos un búfer de memoria compartida para almacenarx
y usamos unsetInterval
para obtenerx
de la API externa y actualizar el búfer de memoria compartida cadattl
segundos.En nuestra ruta de API y en
getServerSideProps
, podemos acceder a los datos en caché dex
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 comogetServerSideProps
accedan a los mismos datos en caché dex
.Aquí tienes un ejemplo de implementación:
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 quettl
segundos. Podemos acceder a los datos en caché dex
tanto desde una ruta de API como desdegetServerSideProps
leyendo desde un búfer de memoria compartida creado utilizando la bibliotecashm-typed-array
.