Ver Mensaje Individual
  #1 (permalink)  
Antiguo 11/07/2012, 18:17
Avatar de jmsarmiento
jmsarmiento
 
Fecha de Ingreso: julio-2012
Ubicación: Puente Alto, Santiago
Mensajes: 4
Antigüedad: 12 años, 4 meses
Puntos: 0
SSE para Notificaciones

Estimados conocedores de la Web...
me dirijo a ustedes por recomendación de @cvander, así es que procedo.

Actualmente estoy desarrollando una plataforma Workflow de gestión interna que, aunque no se espera que tenga miles de usuarios recurrentes, si pudiera tener varias decenas. Entonces, es necesario que la actividad que está sucediendo en el sistema y que sea relevante para un usuario conectado, se le informe en el momento. Es decir, se necesita implementar notificaciones online.
Entonces pensé en implementar Server Side Events. Actualmente funciona y me informa los eventos correctamente, pero estoy haciendo las pruebas yo sólo... no puedo evitar pensar el estrés del servidor con 100 usuarios conectados y por cada usuario un proceso en loop consultando la "tabla de notificaciones" cada 3 o 5 segundos más lo que el usuario esté haciendo como trabajo personal.

No se me ocurre una manera óptima de "almacenar los eventos -> informar los eventos -> acciones por evento".

Actualmente los eventos relevantes los estoy almacenando en una tabla en MySQL, la que es consultada en un loop por el servidor SSE.

Les adjunto los códigos para que quede un poco más claro:

Código Cliente:
Código:
var evtSource = new EventSource("include/sse.php");

evtSource.addEventListener("actividad", function(e) {  
		
		var obj = JSON.parse(e.data);  

		/* CÓDIGO QUE PROCESA LA RESPUESTA DEL EVENTO */
}, false);
Código del servidor (sse.php):
Código:
header("Content-Type: text/event-stream\n\n"); 

$cont = 0;

$conn = new mysqli("localhost","USER","PASS","BD");

$sql = "SELECT count(*) as contador FROM notificacion WHERE idusuario = " . $_SESSION["id_usuario"];

while (true) {  
	$rs = $conn->query($sql);
	$fila = $rs->fetch_array(MYSQLI_ASSOC);
    
    if($cont != $fila["contador"]){
		$cont = $fila["contador"];
		
		echo "event: actividad\n";
		echo 'data: {"cont": "' . $cont . '"}';  
		echo "\n\n"; 
	} 
	
	$rs->close();
		
	ob_flush();  
	flush();  
	sleep(5);  
}
Les agradecería mucho su opinión y ayuda.