Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Menyediakan respons kepada permintaan HTTP selepas menerima permintaan lain

Menyediakan respons kepada permintaan HTTP selepas menerima permintaan lain

PHPz
PHPzke hadapan
2024-02-09 13:06:181182semak imbas

收到另一个请求后提供 HTTP 请求的响应

php editor strawberry Semasa membangunkan aplikasi web, kami selalunya perlu mengendalikan permintaan HTTP dan memberikan respons yang sepadan. Apabila kami menerima permintaan, kami perlu menjana respons yang sesuai berdasarkan kandungan dan tujuan permintaan tersebut. Ini mungkin melibatkan pelbagai operasi seperti menanyakan pangkalan data, memproses data borang, memanggil API lain, dsb. Dalam artikel ini, kami akan meneroka cara mengendalikan permintaan HTTP dalam PHP dan memberikan respons yang sepadan untuk memberikan interaksi dan pengalaman pengguna yang lebih baik kepada pengguna. Sama ada anda sedang membina halaman web statik yang ringkas atau aplikasi web yang kompleks, adalah penting untuk memahami cara mengendalikan permintaan HTTP dan menjana respons.

Kandungan soalan

Kes penggunaan saya adalah untuk memberikan respons permintaan HTTP selepas menerima permintaan lain daripada pelayan yang berasingan.

  1. Saya mahu melakukan ini dengan cara yang terbaik sambil mengingati kebolehskalaan.
  2. Kami menggunakan rangka kerja Golang 1.19 dan Gin.
  3. Pelayan akan mempunyai berbilang Pod, jadi saluran tidak akan berfungsi.
  4. Semua permintaan akan tamat masa, permintaan awal akan tamat masa selepas 60 saat.

Penyelesaian semasa saya ialah menggunakan cache kongsi, di mana setiap Pod sentiasa menyemak cache. Saya percaya, saya boleh mengoptimumkan ini dengan menyalurkan, di mana sistem menyemak secara berkala untuk sebarang respons yang lengkap, dan bukannya menyemak cache satu demi satu.

Saya juga ingin mengetahui cara melaksanakannya dalam bahasa pengaturcaraan lain.

PS: Ini adalah pertanyaan berasaskan reka bentuk dan saya mempunyai reputasi untuk berkongsi hadiah di sini jadi bertanya di sini. Jika soalan tidak jelas, sila edit.

Penyelesaian

tl;dr

Penerangan masalah

Jadi, katakan aplikasi pelayan anda dinamakan server_app dan mempunyai 3 pod:

+---------------------+
     |  server_app_service |
     +---------------------+
     |  server_app_pod_a   |
     |  server_app_pod_b   |
     |  server_app_pod_c   |
     +---------------------+

Perkhidmatan anda menerima permintaan bernama "request a" dan memutuskan untuk menyampaikannya kepada server_app_pod_a. Kini, server_app_pod_a anda memajukan permintaan ke beberapa get laluan dan menunggu sejenis pemberitahuan"request a" 的请求,并决定将其传递给 server_app_pod_a。现在,您的 server_app_pod_a 将请求转发到某个网关,并等待某种通知,以继续处理客户端的响应。正如您所知,无法保证当网关执行 request b 时,服务会再次将其传递给 server_app_pod_a untuk meneruskan memproses respons pelanggan. Seperti yang anda ketahui, tiada jaminan bahawa apabila get laluan melaksanakan permintaan b, perkhidmatan akan menghantarnya kepada server_app_pod_a sekali lagi. Walaupun anda melakukan ini, pengurusan negeri aplikasi akan menjadi tugas yang sukar.

Mesej

Seperti yang anda mungkin perasan, saya tebalkan perkataan "pemberitahuan" dalam perenggan sebelumnya, itu kerana jika anda benar-benar memikirkannya, request“b” kelihatan lebih seperti pemberitahuan dengan beberapa mesej dan bukannya mesej kepada seseorang yang meminta beberapa sumber. Jadi pilihan pertama saya ialah baris gilir mesej seperti kafka (seperti yang anda tahu, terdapat banyak daripada mereka). Ideanya ialah jika anda boleh menentukan algoritma untuk mengira kunci unik permintaan, maka anda boleh dimaklumkan tentang hasilnya dalam pod yang sama. Dengan cara ini, pengurusan keadaan akan menjadi lebih mudah, dan peluang untuk mendapatkan pemberitahuan dalam pod yang sama akan lebih tinggi (sudah tentu ini bergantung pada banyak faktor, seperti keadaan baris gilir mesej). Lihat soalan anda:

  1. Saya mahu melakukan ini dengan cara yang terbaik sambil mengingati kebolehskalaan.

Sudah tentu, anda boleh menggunakan baris gilir mesej ini seperti kafka untuk mendayakan baris gilir mesej dan penskalaan aplikasi serta mengurangkan kehilangan data.

  1. Semua permintaan akan tamat masa, permintaan awal akan tamat masa selepas 60 saat.

Bergantung pada cara anda mengurus tamat masa dalam pangkalan kod anda, menggunakan konteks ialah idea yang baik.

Saya juga ingin mengetahui cara melaksanakannya dalam bahasa pengaturcaraan lain.

Menggunakan baris gilir mesej ialah idea umum yang berfungsi dengan hampir mana-mana bahasa pengaturcaraan, tetapi bergantung pada paradigma pengaturcaraan bahasa dan perpustakaan dan alatan khusus bahasa, mungkin terdapat beberapa cara lain untuk menyelesaikan masalah ini. Contohnya dalam scala 中,如果您使用一些名为 akka 的特定工具(它提供了 actor 模型编程范例),您可以使用所谓的 akka-cluster-sharding untuk menangani masalah ini. Ideanya sangat mudah, kita tahu bahawa mesti ada beberapa jenis penyelia yang mengetahui lokasi dan status sebenar pelanggannya sendiri. Jadi apabila ia menerima beberapa mesej, ia hanya tahu di mana untuk memajukan permintaan dan kepada pelakon mana (kita bercakap tentang pengaturcaraan model pelakon). Dalam erti kata lain, ia boleh digunakan untuk berkongsi keadaan di kalangan peserta yang dilahirkan pada kelompok, sama ada pada mesin yang sama atau tidak. Tetapi sebagai keutamaan peribadi saya tidak akan menggunakan komunikasi khusus bahasa dan akan berpegang pada idea umum kerana ini mungkin menyebabkan masalah pada masa hadapan.

Ringkasan

Penjelasan yang cukup panjang :). Untuk memahami perkara yang saya maksudkan, mari kita jejaki senario yang sama, tetapi dengan model komunikasi yang berbeza:

  1. Pelanggan menghantar permintaan "a" kepada perkhidmatan server_app.
  2. Perkhidmatan memilih salah satu pod (cth. server_app_pod_b) untuk mengendalikan permintaan.
  3. Kemudian pod cuba menentukan beberapa kunci untuk permintaan dan menghantarnya ke get laluan bersama-sama dengan permintaan dan tungguuntuk mesej dengan kunci itu diterbitkan dalam baris gilir.
  4. Gerbang melakukan apa yang sepatutnya dilakukan dan menghantar mesej ke baris gilir mesej menggunakan kekunci .
  5. Pod yang sama serer_app_pod_b menerima mesej dengan kunci, mendapatkan data mesej dan terus memproses permintaan pelanggan.

Mungkin ada cara lain untuk menyelesaikan masalah ini, tetapi ini yang saya mahu. Harap ini membantu!

Atas ialah kandungan terperinci Menyediakan respons kepada permintaan HTTP selepas menerima permintaan lain. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam