Pemrosesan Batch Request dengan API Gateway

Bobur Umurzokov

Bobur Umurzokov

April 27, 2023

Technology

Batch request processing adalah teknik yang kuat digunakan dalam pengembangan web untuk meningkatkan kinerja API. Teknik ini memungkinkan pengembang untuk mengelompokkan beberapa permintaan API ke dalam satu siklus permintaan/respon HTTP. Dengan kata lain, satu permintaan API dari klien dapat diubah menjadi beberapa permintaan API ke sekumpulan server backend, dan responsnya digabungkan menjadi satu respons ke klien. Hal ini dapat secara signifikan mengurangi jumlah perjalanan bolak-balik antara klien dan server.

Dalam artikel ini, kita akan menjelajahi cara mengimplementasikan batch request processing di Apache APISIX dan melihat beberapa kasus penggunaan di mana teknik ini dapat bermanfaat.

Teknik ini mirip dengan pola API Composition yang banyak diterapkan dalam arsitektur Microservices.

Batch request processing vs multiple API calls

Mengapa menggunakan batch request processing?

Ketika klien mengirim beberapa permintaan API ke server, setiap permintaan memerlukan siklus permintaan/respon HTTP yang terpisah. Hal ini dapat mengakibatkan peningkatan latensi, penurunan kinerja, dan peningkatan beban server. Dengan mengelompokkan beberapa permintaan ke dalam satu batch request, jumlah siklus permintaan/respon HTTP dapat dikurangi, sehingga meningkatkan kinerja dan mengurangi latensi.

Batch request processing dapat sangat berguna dalam skenario di mana Anda perlu mengambil atau memperbarui beberapa catatan dalam satu transaksi, seperti:

  • Mengambil beberapa catatan dari database
  • Memperbarui beberapa catatan dalam database
  • Menjalankan beberapa permintaan API untuk menyelesaikan suatu tugas

Contoh dunia nyata untuk batch request processing

Contoh 1:

Misalkan Anda memiliki aplikasi media sosial yang menampilkan feed pengguna, yang mencakup postingan dari teman-teman mereka dan halaman yang mereka ikuti. Untuk mengisi feed ini, Anda perlu membuat beberapa permintaan API untuk mengambil data yang diperlukan, seperti:

  • Mengambil daftar teman pengguna dan halaman yang mereka ikuti.
  • Untuk setiap teman atau halaman, ambil postingan terbaru mereka.

aplikasi media sosial yang menampilkan feed pengguna

Dalam pendekatan tradisional, Anda akan melakukan setiap permintaan API ini secara terpisah. Pertama, Anda mengambil daftar teman pengguna dan dalam permintaan kedua, Anda mendapatkan postingan terbaru untuk setiap teman pengguna. Hal ini dapat mengakibatkan peningkatan latensi, terutama ketika pengguna memiliki banyak teman dan mengikuti banyak halaman.

Contoh 2:

Contoh lain, Anda memiliki aplikasi seluler yang menampilkan daftar produk untuk dijelajahi oleh pengguna. Untuk mengisi daftar ini, Anda perlu membuat beberapa permintaan API untuk mengambil data produk dari server jarak jauh, seperti:

  • Mengambil daftar ID produk.
  • Untuk setiap ID produk, ambil detail produk (nama, deskripsi, gambar, dll.)

Contoh 3:

Bayangkan Anda memiliki aplikasi web untuk manajemen konferensi di mana ada beberapa pembicara dalam sistem dan Anda ingin menampilkan sesi dan topik terkait seorang pembicara pada satu halaman web. Layanan backend Conference API memiliki dua endpoint berbeda /speaker/{speakerId}/sessions dan /speaker/{speakerId}/topics untuk mengekspos informasi ini. Untuk menampilkan sesi dan topik yang dimiliki oleh satu pembicara, Anda dapat mengirim dua permintaan dari aplikasi frontend yang bukan solusi ideal. Sebagai gantinya, Anda dapat menggunakan API Gateway untuk mengelompokkan semua permintaan ini ke dalam satu permintaan HTTP, seperti yang dijelaskan di bagian selanjutnya.

Batch request processing dengan API Gateway

Batch request processing dengan Apache APISIX API Gateway

Untuk mengimplementasikan batch request processing di APISIX, Anda dapat menggunakan plugin batch-requests. Plugin ini memungkinkan Anda untuk mendefinisikan sekumpulan permintaan API dalam satu payload permintaan HTTP POST. Setiap permintaan dapat memiliki metode HTTP, jalur URL, set header, dan payload sendiri. Lihat contoh perintah curl di bawah ini untuk contoh 3 (permintaan Conference API):

curl -i http://{API_GATEWAY_HOST_ADDRESS}/speaker -X POST -d \ '{ "pipeline": [ { "method": "GET", "path": "/speaker/1/topics" }, { "method": "GET", "path": "/speaker/1/sessions" } ] }'

Ketika batch request diterima oleh APISIX, plugin batch-requests akan mem-parsing payload dan menjalankan setiap permintaan dalam batch secara paralel. Plugin ini juga akan menggabungkan respons dari setiap permintaan dan mengembalikannya dalam satu respons HTTP ke klien. Lihat bagian demo berikutnya untuk mempelajari cara mencapai ini langkah demi langkah.

Demo plugin batch requests

Sebelum Anda dapat menggunakan plugin batch-requests, Anda perlu menginstal Apache APISIX.

Prasyarat

  • Docker digunakan untuk menginstal etcd dan APISIX yang dikontainerisasi.
  • curl digunakan untuk mengirim permintaan ke APISIX Admin API. Anda juga dapat menggunakan alat mudah seperti Postman untuk berinteraksi dengan API.

APISIX dapat dengan mudah diinstal dan dijalankan dengan skrip quickstart berikut:

curl -sL <https://run.api7.ai/apisix/quickstart> | sh

Konfigurasi layanan backend (upstream)

Anda perlu mengkonfigurasi layanan backend untuk Conference API yang ingin Anda arahkan permintaannya. Ini dapat dilakukan dengan menambahkan server upstream di Apache APISIX melalui Admin API.

curl http://127.0.0.1:9180/apisix/admin/upstreams/1 -X PUT -d ' { "name": "Conferences API upstream", "desc": "Register Conferences API as the upstream", "type": "roundrobin", "scheme": "https", "nodes": { "conferenceapi.azurewebsites.net:443": 1 } }'

Buat Rute untuk API batch processing

Kita perlu membuat rute baru yang mencegat permintaan ke /speaker dan mengekspos endpoint virtual publik untuk batch processing menggunakan plugin [public-api](https://apisix.apache.org/docs/apisix/plugins/public-api/).

curl http://127.0.0.1:9180/apisix/admin/routes/a -X PUT -d ' { "uri": "/speaker", "plugins": { "public-api": { "uri": "/apisix/batch-requests" } } }'

Buat Rute untuk endpoint topik dan sesi pembicara

Selanjutnya, kita membuat rute lain untuk endpoint topik dan sesi pembicara (/speaker/*/topics dan /speaker/*/topics yang cocok) sehingga permintaan individual yang diekstrak oleh API Gateway dari batch request untuk mengambil topik atau sesi pembicara diteruskan ke endpoint Conference API yang bertanggung jawab dan kami merujuk ke layanan upstream yang ada.

curl http://127.0.0.1:9180/apisix/admin/routes/b -X PUT -d ' { "methods": ["GET"], "uris": ["/speaker/*/topics","/speaker/*/sessions"], "plugins": { "proxy-rewrite":{ "host":"conferenceapi.azurewebsites.net" } }, "upstream_id":"1" }'

Anda mungkin memperhatikan bahwa kami menggunakan plugin proxy-rewrite lainnya dan secara implisit menentukan alamat host untuk Conference API. Jika tidak, API Gateway dapat melakukan konversi DNS dan meminta Conference API dengan alamat IP-nya.

Uji batch request processing

Berikut adalah contoh cara menggunakan plugin batch-requests di APISIX:

curl -i http://127.0.0.1:9080/speaker -X POST -d \ '{ "pipeline": [ { "method": "GET", "path": "/speaker/1/topics" }, { "method": "GET", "path": "/speaker/1/sessions" } ] }'

Dalam contoh ini, rute didefinisikan untuk endpoint /speaker, yang mendukung batch request processing melalui plugin batch-requests. Plugin ini dikonfigurasi dengan sekumpulan dua permintaan, masing-masing mengambil catatan pembicara berdasarkan ID dengan topik dan sesi. Jika Anda menjalankan perintah ini, Anda akan mendapatkan respons gabungan dari API Gateway:

[ { "body":"{\r\n \"collection\": {\r\n \"version\": \"1.0\",\r\n \"links\": [],\r\n \"items\": [\r\n {\r\n \"href\": \"https://conferenceapi.azurewebsites.net/topic/8\",\r\n \"data\": [\r\n {\r\n \"name\": \"Title\",\r\n \"value\": \"Microsoft\"\r\n }\r\n ],\r\n \"links\": [\r\n {\r\n \"rel\": \"http://tavis.net/rels/sessions\",\r\n \"href\": \"https://conferenceapi.azurewebsites.net/topic/8/sessions\"\r\n }\r\n ]\r\n },\r\n {\r\n \"href\": \"https://conferenceapi.azurewebsites.net/topic/10\",\r\n \"data\": [\r\n {\r\n \"name\": \"Title\",\r\n \"value\": \"Mobile\"\r\n }\r\n ],\r\n \"links\": [\r\n {\r\n \"rel\": \"http://tavis.net/rels/sessions\",\r\n \"href\": \"https://conferenceapi.azurewebsites.net/topic/10/sessions\"\r\n }\r\n ]\r\n }\r\n ],\r\n \"queries\": [],\r\n \"template\": {\r\n \"data\": []\r\n }\r\n }\r\n}", "status":200, "headers":{ "Expires":"-1", "Connection":"keep-alive", "Pragma":"no-cache", "Content-Length":"953", "Server":"APISIX/3.2.0", "Content-Type":"application/vnd.collection+json", "X-AspNet-Version":"4.0.30319", "Cache-Control":"no-cache", "X-Powered-By":"ASP.NET" }, "reason":"OK" }, { "body":"{\r\n \"collection\": {\r\n \"version\": \"1.0\",\r\n \"links\": [],\r\n \"items\": [\r\n {\r\n \"href\": \"https://conferenceapi.azurewebsites.net/session/206\",\r\n \"data\": [\r\n {\r\n \"name\": \"Title\",\r\n \"value\": \"\\r\\n\\t\\t\\tjQuery Mobile and ASP.NET MVC\\r\\n\\t\\t\"\r\n },\r\n {\r\n \"name\": \"Timeslot\",\r\n \"value\": \"05 December 2013 09:00 - 10:00\"\r\n },\r\n {\r\n \"name\": \"Speaker\",\r\n \"value\": \"Scott Allen\"\r\n }\r\n ],\r\n \"links\": [\r\n {\r\n \"rel\": \"http://tavis.net/rels/speaker\",\r\n \"href\": \"https://conferenceapi.azurewebsites.net/speaker/16\"\r\n },\r\n {\r\n \"rel\": \"http://tavis.net/rels/topics\",\r\n \"href\": \"https://conferenceapi.azurewebsites.net/session/206/topics\"\r\n }\r\n ]\r\n }\r\n ],\r\n \"queries\": [],\r\n \"template\": {\r\n \"data\": []\r\n }\r\n }\r\n}", "status":200, "headers":{ "Expires":"-1", "Connection":"keep-alive", "Pragma":"no-cache", "Content-Length":"961", "Server":"APISIX/3.2.0", "Content-Type":"application/vnd.collection+json", "X-AspNet-Version":"4.0.30319", "Cache-Control":"no-cache", "X-Powered-By":"ASP.NET" }, "reason":"OK" } ]

Ukuran maksimum dari batch request dibatasi oleh API Gateway. Anda dapat memeriksa dokumentasi API Gateway untuk batasan saat ini dan konfigurasi timeout permintaan.

Takeaways

  • Batch request processing dengan API Gateway dapat menjadi teknik yang berguna untuk meningkatkan kinerja API Anda.
  • Apache APISIX menyediakan plugin bernama batch-requests yang memungkinkan pengembang untuk mengimplementasikan batch request processing dengan mudah.

Langkah selanjutnya

Dengan API Gateway, juga dimungkinkan untuk menyediakan beberapa bentuk agregasi kustom dalam data respons kepada pengguna Anda. Anda dapat menggunakan plugin serverless-function untuk menjalankan kode kustom dan menggabungkan respons dari layanan backend dan mengembalikannya ke konsumen API dalam struktur yang berbeda.

Konten yang direkomendasikan

Tags: