Go 1.27 يجعل برامج HTTP أسرع بنحو 5 مرات بإعادة استخدام الاتصال تلقائيًا
نشرت مدونة Go الرسمية مقالة تشرح تغييرًا في Go 1.27 جعل البرنامج نفسه، بالطلبات نفسها، أسرع بنحو 5 مرات، إذ صار يستغرق نحو 150 مللي ثانية. والسبب سطر لم يكن المطورون يكتبونه.
والآلية تبدأ من HTTP/1. فالاستجابات على الاتصال نفسه تصل متتالية كتدفق واحد من البايتات، ولا يعرف العميل أين تبدأ الاستجابة التالية إلا بعد أن يقرأ جسم الاستجابة الحالية حتى نهايته. فإذا قرأ البرنامج الـ status code فقط وترك الـ body، يصبح الاتصال غير صالح لإعادة الاستخدام، فيتركه Go ويفتح اتصالًا جديدًا.
وتكلفة الاتصال الجديد تُدفع في الشبكة لا في المعالج. فالـ TCP handshake يحتاج round trip واحدًا، وTLS 1.2 يحتاج اثنين آخرين. وتقول المقالة إن زمن الوصول بين المناطق قد يبلغ 50 مللي ثانية أو أكثر في الاتجاه الواحد، أي 100 مللي ثانية لكل round trip، فتذهب 300 مللي ثانية على إنشاء الاتصال وحده قبل أي طلب.
والتفصيل الأدق أن البرنامج قد يقرأ الـ body وتبقى منه بايتات قليلة. فالمقالة تذكر أن json.Decoder يقرأ الـ object ويترك سطر النهاية، وهذا وحده يمنع إعادة الاستخدام. ولا توجد المشكلة في HTTP/2 لأنه يعتمد على multiplexing.
وما فعله Go 1.27 أنه صار يفرّغ ما تبقى من الجسم تلقائيًا في الخلفية، بحد أقصى 50 مللي ثانية أو 256 كيلوبايت. وصارت التوصية الرسمية إغلاق الـ body فقط، فيصبح الكود الذي كان يفرّغ الجسم يدويًا غير ضروري.
ويزداد أثر هذا التغيير على الفرق في المنطقة العربية، لأن كثيرًا من الـ APIs التي تتصل بها مستضافة خارجها، فزمن الـ round trip أطول، وتكلفة كل اتصال جديد أعلى ممن يعمل قرب الخادم.