
Estoy recopilando algunos datos localmente en casa en una Raspberry Pi y quiero enviarlos lo más rápido posible a una API REST (que soy de mi propiedad) en un servidor en la web.
Los datos recopilados localmente podrían fluir a una velocidad de hasta 100 registros por segundo.
Si ejecuto un comando curl en un bucle, enviará los datos... Espere la respuesta 200 y luego procese el siguiente registro... Mucho más lento que mi flujo de datos interno.
Encontré algunos consejos aquí en Stackoverflow e intenté adaptarlos, pero no envió los comandos curl en paralelo.
Sé que mi código no es el más bonito (particularmente en lo que respecta al uso de la función mycurl) y estoy listo para recibir sugerencias.
#!/bin/bash
host="localhost"
port="********"
mycurl() {
data="field1=${1}&field2=${2}&field3=${3}&field4=${4}&field5=${5}&field6=${6}&field7=${7}&field8=${8}&field9=${9}&field10=${10}"
curl --output /dev/null -d $data --silent -X POST https://myapi/myendpoint;
}
export -f mycurl
#----------------------LOOP starts------------------------
while true;
do
nc -d $host $port | while IFS="," read -r f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 f11 f12 f13 f14 f15 f16 f17 f18 f19 f20 f21 f22
do
if [ "$f15" != "" ]; then
seq 1000 | parallel --no-notice --joblog log -j0 mycurl ::: ${f5} ::: ${f7} ::: ${f8} ::: ${f15} ::: ${f16} ::: ${17} ::: ${18} ::: ${19} ::: ${20} ::: ${21};
fi
done
done
Respuesta1
GNU Parallel tiene una sobrecarga de 2 a 5 ms por trabajo, lo que se acerca a las 100 entradas por segundo. Para mitigar eso, puedes envolverlo con parallel --pipe
. Esto debería ejecutar alrededor de 25000 trabajos en paralelo por segundo en una máquina de 100 núcleos:
#!/bin/bash
host="localhost"
port="********"
mycurl() {
if [ "${15}" != "" ]; then
# The numbering here should probably be adjusted
data="field1=${1}&field2=${2}&field3=${3}&field4=${4}&field5=${5}&field6=${6}&field7=${7}&field8=${8}&field9=${9}&field10=${10}"
curl --output /dev/null -d $data --silent -X POST https://myapi/myendpoint;
fi
}
export -f mycurl
#----------------------LOOP starts------------------------
while true;
do
nc -d $host $port
done |
parallel -j100 --pipe --block 100k parallel --colsep , -j0 mycurl
Respuesta2
¿ Por qué no pasar cada curl
llamada a un segundo plano curl
? &
Poner un signo comercial al final de un comando de shell es como usar un ;
punto y coma, solo que bifurca el proceso a un segundo plano.