Kami menjalankan server Django/gunicorn di heroku. Sebagian besar pengguna kami berada di negara yang jaringan selulernya tidak terlalu bagus, sehingga sering kali koneksi mereka tidak stabil.
Sebagian besar permintaan kami adalah "postingan mentah" dari perangkat seluler dan tampaknya meskipun permintaan POST tidak sepenuhnya dikirimkan, permintaan tersebut sudah dikirim untuk ditangani oleh pekerja gunicorn. Ketika pekerja mencoba memproses permintaan dan membaca data, pekerja tersebut hanya hang menunggu data yang tersisa. Meskipun perilaku ini masuk akal untuk membaca data file/gambar dalam mode "streaming", hal ini tidak masuk akal dalam kasus kami karena semua postingan kami relatif kecil dan dapat dengan mudah dibaca oleh server web secara keseluruhan dan baru kemudian diteruskan ke gunicorn kami. pekerja.
Penyerahan awal ini menyebabkan masalah ketika kita mempunyai banyak permintaan seperti itu secara paralel - karena semua pekerja mungkin diblokir. Saat ini kami memecahkan masalah tersebut dengan menambah jumlah pekerja/dyno namun biayanya cukup mahal. Saya tidak dapat menemukan cara untuk memaksa server web atau gunicorn menunggu dan hanya meneruskan permintaan ke pekerja setelah dikirimkan sepenuhnya.
Apakah ada cara untuk membuat server web/gunicorn heroku hanya mentransfer permintaan ke pekerja gunicorn ketika permintaan tersebut telah dikirim sepenuhnya dari sisi klien (diterima sepenuhnya oleh server)?
Beberapa contoh kode (kami telah menambahkan pelacakan 'per-instruksi' newrelic untuk memastikan bahwa ini adalah baris yang tepat yang menyebabkan masalah):
def syncGameState(request):
transaction = agent.current_transaction()
with agent.FunctionTrace(transaction, "syncGameState_raw_post_data", 'Python/EndPoint'):
data = request.raw_post_data
with agent.FunctionTrace(transaction, "syncGameState_gameStateSyncRequest", 'Python/EndPoint'):
sync_request = sync_pb2.gameStateSyncRequest()
with agent.FunctionTrace(transaction, "syncGameState_ParseFromString", 'Python/EndPoint'):
sync_request.ParseFromString(data)
Berikut adalah pengukuran New Relic untuk contoh permintaan lambat ini (itu adalah POST dengan data 7K). Membaca POST membutuhkan 99% waktu metode....
web: gunicorn hellodjango.wsgi -t 3 -b 0.0.0.0:$PORT
- person dani herrera   schedule 30.08.2012