Hace ya casi un año que Amazon publicó que estaban desarrollando el soporte de Amazon SQS como «Event Source» para una función Lambda, y desde que la solución estuvo disponible buscaba una escusa para poder encontrar un mini proyecto para probarla.
Para el desarrollo interno de la empresa tengo un «Bot» que obtiene de manera diaria un CSV con alrededor de 1.000.000 de filas. Para todos los que estamos acostumbrados a trabajar con archivos grandes, 1M de datos no suena tan complejo, por lo que a pesar de tener mejores opciones decidí que era el momento de hacer una prueba de fuego parseando este archivo y enviando el resultado directamente a la cola fila por fila para luego ser procesado a través de una función lambda.
Este post es para comentar sobre la estructura final del proyecto, y como se fue modificando para poder funcionar de manera correcta.
Yo tengo el tema de los contribuyentes en php y se demora aprox entre 2 a 5 minutos, si quieres te paso el script
Feliz. Puedes crear un GitHub si lo deseas :). Hasta ahora lo que más demora es la descarga del archivo desde el server internacional.
Claro pero deberia demorarse nomás de un par de minutos.
Como consejo trata de meter todo en una transacción. mejora por 1000%
te comentare por aquí el codigo
$mysqli->report_mode = MYSQLI_REPORT_STRICT;
$mysqli->query(«TRUNCATE TABLE empresas_sii;»);
$mysqli->query(«START TRANSACTION»);
$mysqli->query(«SET FOREIGN_KEY_CHECKS = 0;»);
$mysqli->query(«SET UNIQUE_CHECKS = 0;»);
$mysqli->query(«SET AUTOCOMMIT=0;»);
echo «\r\nActualizando Base de Datos…»;
echo «\r\nEste proceso puede tardar varios minutos, tenga paciencia…»;
# Recorrer las filas del archivo csv fgetcsv(RECURSO,LARGO,DELIMITADOR,STRING ENCLOUSURE)
while($data=fgetcsv($archivo, 0 ,$separador_columnas)){// 20 megas
if($i>0){
# Obtener la cantidad de columnas de la fila seleccionada
$num=count($data);
# $RUT; RAZON SOCIAL; NUMERO RESOLUCION; FECHA RESOLUCION; MAIL INTERCAMBIO; URL
$rut=$mysqli->real_escape_string(«$data[0]»);
$razon_social=$mysqli->real_escape_string(«$data[1]»);
$numero_resolucion=$mysqli->real_escape_string(«$data[2]»);
$fecha_resolucion=$mysqli->real_escape_string(«$data[3]»);
$mail_intercambio=$mysqli->real_escape_string(«$data[4]»);
$url_intercambio=$mysqli->real_escape_string(«$data[5]»);
# NO existe el rut en la base datos clientes
if(!$mysqli->query(«INSERT INTO empresas_sii (
rut,
razon_social,
numero_resolucion,
fecha_resolucion,
mail_intercambio,
url ) VALUES (‘$rut’,’$razon_social’,’$numero_resolucion’,’$fecha_resolucion’,’$mail_intercambio’,’$url_intercambio’);»)){
printf(«Errormessage: %s\n», $mysqli->error);
}else{
echo «INSERTADO REGISTRO $i \r\n»;
}
}
$i++;
}
$mysqli->query(«SET UNIQUE_CHECKS = 1»);
$mysqli->query(«SET FOREIGN_KEY_CHECKS = 1»);
$mysqli->query(«COMMIT»);
$mysqli->query(«SET AUTOCOMMIT = 1»);
Muchas gracias !