HTTP2

2016-08-10 7 views
10

पर पाइथन (फ्लास्क) आरईएसटी एपीआई की सेवा करना मेरे पास पाइथन रीस्ट सेवा है और मैं HTTP2 का उपयोग करके इसे सेवा देना चाहता हूं। मेरा वर्तमान सर्वर सेटअप nginx -> Gunicorn है। दूसरे शब्दों में, nginx (पोर्ट 443 और 80 जो पोर्ट 443 पर रीडायरेक्ट करता है) एक रिवर्स प्रॉक्सी के रूप में चल रहा है और आगे गनिकॉर्न (पोर्ट 8000, कोई एसएसएल) के लिए अनुरोध नहीं कर रहा है। nginx HTTP2 मोड में चल रहा है और मैं सर्वर को सरल GET भेजने के बाद क्रोम का उपयोग करके और 'प्रोटोकॉल' कॉलम का निरीक्षण करके सत्यापित कर सकता हूं। हालांकि, गनिकोर्न रिपोर्ट करता है कि अनुरोध प्राप्त करने वाले अनुरोध HTTP1.0 हैं। इसके अलावा, मैं इसे इस सूची में मिल coulnt't: https://github.com/http2/http2-spec/wiki/Implementations तो, मेरे सवाल कर रहे हैं:HTTP2

  • यह HTTP2 के साथ एक अजगर (बोतल) आवेदन सेवा करने के लिए संभव है? यदि हां, कौन से सर्वर इसका समर्थन करते हैं?
  • मेरे मामले में (एक रिवर्स प्रॉक्सी सर्वर और एक वास्तविक एपीआई की सेवा), जो सर्वर को HTTP2 का समर्थन करना है?

कारण मैं HTTP2 उपयोग करना चाहते हैं, क्योंकि कुछ मामलों में मैं सभी को एक साथ हज़ारों अनुरोधों को प्रदर्शन करने के लिए की जरूरत है और मैं अगर HTTP2 की मल्टिप्लेक्स अनुरोध सुविधा चीज़ों को गति कर सकते हैं देखने के लिए दिलचस्पी थी है। क्लाइंट के रूप में HTTP1.0 और पायथन अनुरोध के साथ, प्रत्येक अनुरोध ~ 80ms लेता है जो अस्वीकार्य है। दूसरा समाधान सिर्फ मेरे आरईएसटी संसाधनों को थोक/बैच करना होगा और एक ही अनुरोध के साथ एकाधिक भेजना होगा। हां, यह विचार ठीक लगता है, लेकिन मुझे वास्तव में यह देखने में दिलचस्पी है कि HTTP2 चीजों को गति दे सकता है या नहीं।

अंत में, मुझे यह उल्लेख करना चाहिए कि क्लाइंट पक्ष के लिए मैं हाइपर http2 एडाप्टर के साथ पाइथन अनुरोध का उपयोग करता हूं।

उत्तर

9

क्या HTTP/2 के साथ पाइथन (फ्लास्क) एप्लिकेशन की सेवा करना संभव है?

हां, आपके द्वारा प्रदान की जाने वाली जानकारी के अनुसार, आप इसे ठीक कर रहे हैं।

मेरे मामले में (एक रिवर्स प्रॉक्सी सर्वर और एक वास्तविक एपीआई की सेवा करने वाला), किस सर्वर को HTTP2 का समर्थन करना है?

अब मैं पतली बर्फ पर चलने और राय देने जा रहा हूं।

जिस तरह HTTP/2 को अब तक तैनात किया गया है, वह एक बढ़त सर्वर है जो HTTP/2 (जैसे ShimmerCat या NginX) से बात करता है। वह सर्वर टीएलएस और HTTP/2 को समाप्त करता है, और आंतरिक अनुप्रयोग से बात करने के लिए HTTP/1, HTTP/1.1 या FastCGI का उपयोग करता है।

कम से कम सैद्धांतिक रूप से, किनारे सर्वर HTTP/2 वेब अनुप्रयोग पर बात कर सकते हैं? हां, लेकिन HTTP/2 जटिल है और आंतरिक अनुप्रयोगों के लिए, यह बहुत अच्छी तरह से भुगतान नहीं करता है।

ऐसा इसलिए है क्योंकि अधिकांश वेब एप्लिकेशन ढांचे को सामग्री के अनुरोधों को संभालने के लिए बनाया गया है, और यह HTTP/1 या FastCGI के साथ पर्याप्त रूप से पर्याप्त है। यद्यपि अपवाद हैं, वेब अनुप्रयोगों के HTTP/2 के subtleties के लिए थोड़ा उपयोग नहीं है: मल्टीप्लेक्सिंग, प्राथमिकता, सभी सुरक्षा सावधानियों के असंख्य, और इसी तरह।

चिंताओं के परिणामस्वरूप अलगाव मेरी राय में एक अच्छी बात है।


आपका 80 एमएस प्रतिक्रिया समय थोड़ा प्रयोग कर रहे हैं HTTP प्रोटोकॉल के साथ क्या करना है, लेकिन अगर उन 80 एमएस ज्यादातर इनपुट/आउटपुट के लिए इंतज़ार कर खर्च कर रहे हैं, तो निश्चित रूप से समानांतर में बातें चल रहा एक अच्छी बात है ।

गनिकॉर्न प्रत्येक अनुरोध को संभालने के लिए थ्रेड या प्रक्रिया का उपयोग करेगा (जब तक कि आप ग्रीनलेट बैकएंड को कॉन्फ़िगर करने के लिए अतिरिक्त मील नहीं गए हैं), तो विचार करें कि गनिकॉर्न को हजारों कार्यों के कारण आपके मामले में व्यवहार्य है या नहीं।

यदि आपके अनुरोधों की सामग्री इसे अनुमति देती है, तो आप अस्थायी फ़ाइलों को बना सकते हैं और उन्हें HTTP/2 एज सर्वर के साथ सेवा कर सकते हैं।

0

अब पाइथन ऐप से सीधे HTTP/2 की सेवा करना संभव है, उदाहरण के लिए Twisted का उपयोग करना। आपने विशेष रूप से एक फ्लास्क ऐप के बारे में पूछा है, जिस स्थिति में मैं (पूर्वाग्रह के साथ) Quart की सिफारिश करता हूं जो कि फ्लास्क एपीआई एसिंसिओ (HTTP/2 समर्थन के साथ) पर पुन: कार्यान्वित किया गया है।

आपका वास्तविक मुद्दा,

ग्राहक के रूप में HTTP1.0 और अजगर अनुरोध के साथ

, प्रत्येक अनुरोध ~ लेता 80ms

मेरे लिए चलता है समस्या आप अनुभव हो सकता है प्रत्येक अनुरोध है कि यह है कि एक नया कनेक्शन खोलता है। यह HTTP/2 की आवश्यकता के बिना connection pool के उपयोग के माध्यम से कम किया जा सकता है।

संबंधित मुद्दे