Execute o mais rápido possível muitos comandos curl

Execute o mais rápido possível muitos comandos curl

Estou coletando alguns dados localmente em casa em um Raspberry Pi e quero enviar os dados o mais rápido possível para uma API REST (que possuo) em um servidor na web.

Os dados coletados localmente poderiam fluir até 100 registros por segundo.

Se eu executar um comando curl em um loop, ele enviará os dados... Aguarde a resposta 200 e processe o próximo registro... Muito mais lento que meu fluxo de dados interno.

Encontrei algumas dicas aqui no Stackoverflow e tentei adaptá-las, mas não enviava os comandos curl em paralelo.

Sei que meu código não é dos mais bonitos (principalmente sobre o uso da função mycurl) e estou pronto para sugestões

#!/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

Responder1

GNU Parallel tem uma sobrecarga de 2 a 5 ms por trabalho, que está chegando perto de 100 entradas por segundo. Para atenuar isso, você pode envolvê-lo com parallel --pipe. Isso deve executar cerca de 25.000 trabalhos em paralelo por segundo em uma 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

Responder2

Por que não desviar cada curlchamada para segundo plano: curl... &. Colocar um "e" comercial no final de um comando shell é como usar um ;ponto e vírgula, só que bifurca o processo em segundo plano.

informação relacionada