Esta es una respuesta directa a mi propia pregunta
Tiene el requisito de llamar a un microservicio REST escalable externo. Desafortunadamente, el sistema necesita unos 100 ms para responder y debe llamar al sistema varias veces con diferentes parámetros. Como los usuarios finales llaman al código, desea paralelizar las llamadas REST.
Entonces, ¿cuál es la solución «normal» para ese problema? La respuesta ABAP estándar es, por supuesto: ABAP Parallelization using Worker-Processes (usando, por ejemplo, esa maravillosa biblioteca ZHREAD por marian zeis ). Sin embargo, esto tiene múltiples problemas:
¿Entonces, cuál es la solución? En realidad es extremadamente simple e incluso está documentado en el Ayuda SAP (con ejemplos de código «un poco más antiguos»): puede simplemente llamar al método de envío de cl_http_client varias veces.
¿Cómo funciona esto? Veamos el siguiente código de ejemplo muy simple sobre cómo activar una llamada HTTP.
DO 20 TIMES.
cl_http_client=>create_by_url(
EXPORTING
url = |{ base_part_of_url }{ sy-index }{ parameters_of_url }|
IMPORTING
client = DATA(client)
).
client->request->set_method( if_rest_message=>gc_method_get ).
client->send( ).
client->receive( ).
client->close( ).
ENDDO.
En mi caso, esta solicitud tarda alrededor de 100 ms y tengo que llamarla 20 veces. Entonces, sin paralelización, tomaría alrededor de 2 segundos.
Solución: simplemente no llame a la recepción todo el tiempo (lo cual es síncrono), sino que simplemente inserte cl_http_clients en una tabla interna de clientes y, después de que todos hayan sido enviados, llame a la recepción una por una.
DATA: clients type standard table of if_http_client.
DO 20 TIMES.
cl_http_client=>create_by_url(
EXPORTING
url = |{ base_part_of_url }{ sy-index }{ parameters_of_url }|
IMPORTING
client = DATA(client)
).
APPEND client TO clients.
client->request->set_method( if_rest_message=>gc_method_get ).
client->send( ).
ENDDO.
LOOP AT clients INTO client.
client->receive( ).
client->close( ).
ENDLOOP.
El siguiente gráfico ofrece una comparación entre llamar a las solicitudes secuencialmente y en paralelo.
Es claramente visible que también hay algunos gastos generales (probablemente en mi extremo receptor), aún así funciona drásticamente mejor sin un gran aumento de la complejidad.
Observaciones adicionales:
Calle Eloy Gonzalo, 27
Madrid, Madrid.
Código Postal 28010
Paseo de la Reforma 26
Colonia Juárez, Cuauhtémoc
Ciudad de México 06600
Real Cariari
Autopista General Cañas,
San José, SJ 40104
Av. Jorge Basadre 349
San Isidro
Lima, LIM 15073