Tengo un DB de sabor sqlite que contiene una tabla, tiene alrededor de 10k elementos con 5 columnas. En una de las columnas tengo un 'temporizador', básicamente, un número que he dado y el propósito es disminuirlo a medida que pasa el tiempo (idealmente cada segundo) hasta que llega a cero. Cuando llegue a cero quiero realizar una acción.

Proceso de pensamiento

1er: puedo actualizar mi base de datos para cada elemento necesario (probablemente para los 2k de los 10k) cada 10s (setInternal) -como para no estresarlo- y verificar si alguno de los elementos llegó a cero. Soy reacio a esta manera, ya que siento que podría no ser tan eficiente.

2do: Como estoy en nodejs puedo usar tiempos de espera. Lea una vez que mi base de datos obtenga todos los usuarios deseados, y para cada uno de ellos cree un método setTimeout. Después de un minuto más o menos, actualice la base de datos, nested-setInternal Dado que cada setTimeout toma alrededor de 35bytes del montón de nodejs, no es un mal método. -Ahora creo que este es el camino a seguir.

3er: descubrí esto https://github.com/kelektiv/node -cron github, que básicamente es un programador de tareas. Después de mirar su código por un momento, no creo que sea malo, pero realmente no creo que tenga que usar un paquete externo aquí.

Nota: Cualquiera de los métodos anteriores que debo usar en caso de que el proceso se bloquee, se restablecerán (pierde completamente el punto) sin actualizar mi DB periódicamente, por lo que supongo que no puedo evitarlo.

Pregunta: ¿Qué debo hacer para actualizar eficientemente un temporizador en mi base de datos cada pocos segundos (así que todo el tiempo mi proceso está activo), sin agotar mis recursos?

Perdón por aquellos que leen todo y sienten que perdieron su tiempo.

0
nonerth 31 mar. 2017 a las 20:56

2 respuestas

La mejor respuesta

No almacene el tiempo restante en la base de datos. En su lugar, almacene la marca de tiempo absoluta de la acción.

Luego, simplemente puede solicitar cualquier acción que deba manejarse:

SELECT *
FROM actions
WHERE timestamp > (last handled timestamp)
  AND timestamp <= (current timestamp);

(Si la columna timestamp está indexada, esta consulta es muy eficiente).

También puede obtener el tiempo hasta el próximo evento, para programar un tiempo de espera:

SELECT timestamp
FROM actions
WHERE timestamp > (last handled timestamp)
ORDER BY timestamp ASC
LIMIT 1;
1
CL. 31 mar. 2017 a las 20:09

El flujo puede ser el siguiente

  1. Al iniciar el servidor se llama a un método que verificará el campo del temporizador en la tabla si se encuentra cero para cualquier registro, solo realizará su operación. (Usar promesa en funcionamiento).
  2. Cuando la promesa se supere, llame a otra función y en esa función espere un segundo y luego vuelva a llamar a la función anterior.

Puede utilizar la función recursiva llamando con cierto retraso de tiempo. Este retraso es solo para reducir la carga de la base de datos o los puntos muertos.

0
Sunil Prajapati 31 mar. 2017 a las 18:12