Re: bitácora con validación

From: Alvaro Herrera <alvherre(at)surnet(dot)cl>
To: Guillermo Schulman <gschulman_ml(at)yahoo(dot)com(dot)ar>
Cc: lista de correo de postgres <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: bitácora con validación
Date: 2005-06-21 15:20:06
Message-ID: 20050621152006.GA18042@surnet.cl
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

On Tue, Jun 21, 2005 at 11:26:16AM -0300, Guillermo Schulman wrote:
> Hola a todos.
> Tenemos una tabla de bitácora donde grabamos los clicks que los usuarios
> hacen en una parte de la aplicación web. El tráfico es muy alto y la
> cantidad de registros crece rápidamente. Un requisito es que no se
> graben los clicks que cumplen con una condición: aquellos que hayan
> ocurrido en el término de los 3 minutos y provengan de una misma
> dirección ip (guardada en un campo de la tabla) y alguna condición más
> que no viene al caso. Esta validación la estábamos haciendo a través de
> un trigger en el INSERT que hacía el SELECT necesario. A pesar de que el
> SELECT estaba optimizado (accedía por índices y bastante rápidamente),
> el alto tráfico y el continuo crecimiento nos obligó a desactivar el
> trigger porque estábamos perdiendo demasiada performance. Actualmente
> simplemente corremos un script nocturno para borrar los registros
> indeseados.
> Desearíamos una solución un poco más ajustada a las necesidades. La
> pregunta es: alguien conoce alguna solución alternativa que no impacte
> tan fuertemente en la performance? Se nos ocurre, por ejemplo, generar
> una PK que incluya el campo de la IP y el campo fecha/hora pero, en tal
> caso, cómo hacemos para que la unicidad funcione por lapsos de 5 minutos?

Algo que yo intentaria seria, en lugar de ingresar cada dato en la BD a
medida que se genera el click, guardar la informacion en un archivo.
Con un programilla aparte lees esos datos en memoria (digamos los de los
cinco minutos anteriores al minuto en curso), los filtras botando
aquellos que no te interesa guardar, y los ingresas todos juntos usando
COPY. Ademas, conservaria el trigger que ya tienes para los casos de
borde.

Para ahorrarte la ejecucion del trigger podrias usar un mecanismo de
ventana deslizante que vaya revisando los minutos (t-7) hasta (t-1),
elimine los que cumplan la condicion en el intervalo (t-4) hasta (t-1),
elimines los que se pasaron del intervalo (t-7), insertes los que van
entre (t-4) y (t-1). (Algo engorroso de entender pero creo que es
relativamente sencillo de implementar.)

Lo de no leer los archivos que escribes durante el minuto en curso es
para protegerte de leer archivos que esten a medio escribir. Otro
mecanismo que puedes usar para eso es usar un flock() en torno al ciclo
de readdir(), de manera que solo se puedan escribir nuevos archivos
cuando no estas leyendo. El inconveniente de esto es que va a pasar un
intervalo de tiempo (pequeño, a menos que haya mucha carga) durante el
cual no podras escribir archivos. O sea, para procesas archivos: lock,
lees todos los nombres de archivos, unlock, procesas los archivos cuyos
nombres tienes. Para escribir archivos: lock, escribes, unlock.

--
Alvaro Herrera (<alvherre[a]surnet.cl>)
"Lo esencial es invisible para los ojos" (A. de Saint Exúpery)

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Fernando San Martín Woerner 2005-06-21 15:24:41 Estrategias de recuperacion
Previous Message Jaime Casanova 2005-06-21 14:49:28 Re: Auxilio me botan del proyecto