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

1

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 podem 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 o fluxo de dados interno.

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

Eu sei que meu código não é o mais bonito (particularmente 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
    
por Pierre H. 26.08.2018 / 10:21

1 resposta

0

O GNU Parallel tem uma sobrecarga de 2-5 ms por trabalho que está se aproximando de suas 100 entradas por segundo. Para atenuar isso, você pode envolvê-lo com parallel --pipe . Isso deve executar cerca de 25.000 tarefas 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
    
por 27.08.2018 / 00:52