پخش HTTP/2 و شما، HTTP/3 استریم و wheee! – انجمن DEV

Summarize this content to 400 words in Persian Lang
HTTP/3 توسط 30.1٪ استفاده می شود از تمام وب سایت ها
HTTP/2 توسط 34.7٪ استفاده می شود از تمام وب سایت ها
برخی از روششناسیها این موارد را بالاتر میگذارند، اما با اطمینان میتوان گفت:
امروزه بخش بزرگی از ترافیک فعلی اینترنت از HTTP/3 استفاده می کند.
با این حال، این تغییر یک انقلاب آرام در صنعت ما بوده است.
HTTP/2 (و HTTP/3) قوانین بازی را برای توسعه وب تغییر می دهد!
این خلاصه ای از تعدادی مقاله دیگر و تجربه شخصی من در ساخت یک کلون جک باکس با استفاده از HTTP/3 Server Streaming با استفاده از ConnectRPC (gRPC) است.
مردم مدتهاست به HTTP/1.1 و بهترین شیوههای مرتبط با آن که در اطراف آن رشد کردهاند عادت کردهاند، اما اکنون که همه چیز تغییر کرده است، بسیاری از این موارد ارزش ارزیابی مجدد را دارند و درک دلیل آن مهم است.
در HTTP/1.1، به دلیل جستجوها، دست دادن ها و «فرآیند نوبت دهی» که اتفاق می افتد، دانلود چندین فایل کوچکتر از دانلود یک فایل با همان اندازه ترکیبی کندتر است.
در HTTP/1.1 هر اتصال یک چرخه درخواست/پاسخ تک واحدی است.
بسیاری از بهترین روش ها تحت HTTP/1.1 در واقع در استفاده از HTTP/2 یا HTTP/3 نتیجه معکوس دارند. به عنوان مثال:
در HTTP/1.1، باز کردن چندین اتصال HTTP 1.x به صورت موازی برای افزایش سرعت بارگذاری صفحه (حداکثر 6 در هر قطعه دامنه) بهترین روش است.
در HTTP/1.1 بهترین روش به هم پیوستن فایل های جاوا اسکریپت و CSS، تصاویر sprite و منابع درون خطی است.
در HTTP/1.1 بهترین روش طراحی API های خود به گونه ای است که چندین پرس و جو را دسته بندی کنید تا رفت و برگشت را به حداقل برسانید.
در مقابل، HTTP/2 (و HTTP/3) تقریباً بهنظر میرسد که هر دو جاذبه معکوس شده و تمام اصطکاکها وجود ندارند، همانطور که این شیوههای به خوبی فرسوده شدهاند. تنزل دادن عملکرد به جای افزایش عملکرد!
HTTP/2 TLS 1.3 تعداد رفت و برگشت های مورد نیاز برای راه اندازی یک اتصال HTTPS را به شدت کاهش می دهد. برای مشتریانی که قبلاً از یک سایت بازدید کردهاند، دادههایی که از این اتصال عبور میکنند از نظر رمزنگاری محافظت میشوند و نیازی به اشتراکگذاری پیامهای پروتکل تبادل کلید قبل از ارسال وجود ندارد.
HTTP/2 همچنین از مالتی پلکس شدن پشتیبانی میکند، که به مرورگر اجازه میدهد چندین درخواست را به طور همزمان در یک اتصال اجرا کند و درخواستها را به هر ترتیبی دریافت کند.
HTTP/2 از جریان ها پشتیبانی می کند، یک جریان دو طرفه از فریم ها بین مشتری و سرور. یک درخواست مشتری منفرد می تواند چندین پاسخ داشته باشد (مثلا اشتراک در به روز رسانی).
HTTP/2 دوطرفه کامل در سراسر جریان است، به این ترتیب که ممکن است یک جریان در حال ارسال باشد در حالی که دیگری در حال دریافت است. اما HTTP/2 هنوز در یک جریان معین نیمه دورو است.
HTTP/2 حداکثر 100 درخواست همزمان را که یک مرورگر می تواند از 6 تا 8 به سرور ارائه کند، پشتیبانی می کند.
HTTP/3 تقریباً HTTP/2 است اما بیش از UDP است (بله، آنها مواردی مانند اولویتبندی جریان را نیز بهبود داده و سادهسازی کردند). این از مشکل مسدود کردن سر خط TCP جلوگیری می کند، زمانی که یک صف از بسته های TCP توسط اولین بسته در صف نگه داشته می شود.
سوکت های وب و HTTP/2
HTTP/2 سوکتهای وب را برای همه موارد استفاده به جز فشار دادن، منسوخ میکند داده های باینری از سرور به a وب کلاینت JS. HTTP/2 به طور کامل از جریان باینری bidi (دو جهته) پشتیبانی می کند (ادامه مطلب را بخوانید)، اما مرورگر JS یک API برای مصرف فریم های داده باینری ندارد و AFAIK چنین API برنامه ریزی نشده است. هنگامی که مشتری یک جریان را با ارسال یک درخواست باز می کند، هر دو طرف می توانند فریم های داده را در یک سوکت ثابت در هر زمان ارسال کنند – full bidi.
برای هر کاربرد دیگری از جریان بیدی، HTTP/2 به خوبی یا بهتر از سوکت های وب است، زیرا (1) مشخصات کار بیشتری برای شما انجام می دهد، و (2) در بسیاری از موارد اجازه می دهد تا اتصالات TCP کمتری به یک مبدا باز شود.
این تفاوت چندانی با سوکتهای وب ندارد: مشتری باید قبل از اینکه سرور بتواند دادهها را به سراسر جهان ارسال کند، درخواست ارتقاء سوکت وب را آغاز کند.
بزرگترین تفاوت این است که برخلاف سوکتهای وب، HTTP/2 معنای مالتی پلکسی خود را تعریف میکند: جریانها چگونه شناسهها را دریافت میکنند و چگونه فریمها شناسه جریانی را که روی آن هستند حمل میکنند. HTTP/2 همچنین معنای کنترل جریان را برای اولویت بندی جریان ها تعریف می کند. این در بیشتر کاربردهای دنیای واقعی بیدی مهم است.
اگر شما نیاز به ساختن یک برنامه چت بلادرنگ دارید، فرض کنید، جایی که باید پیامهای چت جدید را برای همه کلاینتهای اتاق چت که دارای اتصالات باز هستند پخش کنید، میتوانید (و احتمالاً باید) این کار را بدون سوکتهای وب انجام دهید.
شما می توانید از رویدادهای ارسال شده توسط سرور برای پایین آوردن پیام ها و از Fetch api برای ارسال درخواست ها استفاده کنید. رویدادهای ارسال شده از سرور (SSE) یک API کمتر شناخته شده اما به خوبی پشتیبانی می شود که جریان سرور به مشتری پیام گرا را در معرض نمایش قرار می دهد. اگرچه برای جاوا اسکریپت کلاینت به نظر نمی رسد، مرورگر شما (اگر از HTTP/2 پشتیبانی می کند) از یک اتصال TCP مجدد برای مالتیپلکس کردن همه آن پیام ها استفاده می کند. هیچ از دست دادن کارایی وجود ندارد و در واقع یک افزایش نسبت به سوکت های وب است زیرا تمام درخواست های دیگر در صفحه شما نیز همان اتصال TCP را به اشتراک می گذارند. آیا به چندین جریان نیاز دارید؟ چندین منبع رویداد را باز کنید! آنها به طور خودکار برای شما مالتی پلکس می شوند.
رویدادهای ارسالشده از سرور علاوه بر کارآمدتر بودن منابع و تأخیر اولیه کمتری نسبت به دست دادن وبسوکت، ویژگی خوبی دارند که بهطور خودکار برمیگردند و روی HTTP/1.1 کار میکنند (اما محدودیت 6 اتصال در هر دامنه). اما هنگامی که شما یک اتصال HTTP/2 دارید، آنها فوق العاده خوب کار می کنند.
در اینجا یک مقاله خوب با یک مثال در دنیای واقعی از انجام SPA بهروزرسانی واکنشی وجود دارد.
شایان ذکر است که سوکت های وب از طریق HTTP/2 و حتی سوکت های وب از طریق HTTP/3 (UDP QUIC) نیز امکان پذیر است و عملکرد را به طور قابل توجهی بهبود می بخشد.
تاثیر HTTP/2 GraphQL یک کیسه ترکیبی است
با HTTP/2 (و HTTP/3) دسته بندی درخواست ها در حال حاضر است ضد تولید به عملکرد:
GET /widgets/5382894223,35223231,534232313,5231332435 HTTP/1.1
Accept: application/widgets+json
Host: api.widgets.org
Accept-Encoding: gzip, deflate
User-Agent: BobsWidgetClient/1.5
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
روش فوق دارای یک سری نکات منفی است. هم سرویس و هم مشتریان باید یک نقطه پایانی جدید و یک قالب جدید مبتنی بر لیست را درک کنند که API را متورم می کند – به خصوص اگر انواع مختلفی از منابع وجود داشته باشد که نیاز به درمان مشابه دارند. علاوه بر این، این رویکرد به طور جدی بر کارایی کش تأثیر می گذارد و بار سرور بیشتر و تأخیر درک شده توسط مشتری ایجاد می کند.
اگر بتوانید دقیقاً آنچه را که می خواهید برای سرور در قالبی کارآمد توصیف کنید، اکنون می تواند دقیقاً با آنچه شما می خواهید پاسخ دهد.
بدون اغراق زیاد، راه دیگری برای در نظر گرفتن HTTP/2 به عنوان یک زبان پرس و جو جدید است – زبانی که به شما امکان می دهد مجموعه بسیار پیچیده ای از درخواست ها را در حجم کمی از داده ها رمزگذاری کنید که به شدت برای انتقال بهینه شده است، در حالی که هنوز به اجزای استاندارد HTTP اجازه می دهد. – مخصوصا حافظه پنهان – برای کار با درخواست های فردی. با این حال، این هنوز است سرور محور همانطور که در حال حاضر مستلزم آن است که باطن سرور نقاط پایانی را فراهم کند دقیقا به همان اندازه که مشتری نیاز دارد، به جای اینکه به مشتری اجازه دهد مستقل درباره جزئیات تصمیم بگیرد.
با استفاده از HTTP/2، رفع می شود بیشتر مشکلات ناشی از اسناد مرکب و قالبهای مبتنی بر مجموعههای فیلد پراکنده مانند GraphQL و JSON:API:
از آنجایی که هر منبع تحت فشار در یک جریان HTTP/2 جداگانه (مالتی پلکسی HTTP/2) ارسال می شود، منابع مرتبط می توانند به صورت موازی به مشتری ارسال شوند.
در نتیجه، کلاینتها و واسطههای شبکه (مانند CDN یا پراکسی)، میتوانند هر منبع را در یک کش خاص ذخیره کنند، در حالی که جاسازی منبع فقط اجازه میدهد تا سند JSON بزرگ را در حافظه پنهان داشته باشیم، سپس باطل کردن کش کارآمدتر است و میتوان آن را انجام داد. در سطح HTTP
به طور خاص با GraphQL، استفاده از مکانیسم های کش ارائه شده توسط پروتکل HTTP آسان نیست (POST درخواست ها را نمی توان تنها با استفاده از معنای HTTP ذخیره کرد).
HTTP/2 و فدراسیون GraphQL
فدراسیون آپولو به شما امکان می دهد تا چندین API را به صورت اعلامی در یک نمودار واحد و یکپارچه ترکیب کنید. این نمودار فدرال مشتریان را قادر می سازد تا از طریق یک API با API های شما تعامل داشته باشند درخواست واحد. یعنی دیگر مطلوب نیست از نقطه نظر عملکرد در HTTP/2 یا HTTP/3. در فدراسیون، کندترین پرس و جو به گلوگاه کل پرس و جو فدرال تبدیل می شود. فدراسیون همچنین دشواری استقرار و آزمایش پذیری مستقل را افزایش می دهد. همچنین ارائه موفقیت جزئی معنی دار و خطاهای جزئی به مشتری در زمانی که سوالات فرعی خطاها را برمی گرداند، دشوار می کند. ممکن است نگرانیهای خاص دیگری وجود داشته باشد – مانند احراز هویت و محدود کردن نرخ – که در آن دروازه GraphQL هنوز مفیدتر از غیر آن است.
فدراسیون آپولو همچنین از اشتراک های GraphQL پشتیبانی نمی کند و هیچ برنامه ای برای اضافه کردن پشتیبانی ندارند
روش HTTP QUERY و GraphQL
IETF WHATWG دارای یک پسوند پیشنویس HTTP است که یک روش HTTP جدید، QUERY، را به عنوان امن، روش درخواست بی قدرت که می تواند محتوای درخواست را حمل کند. (که برای HTTP/1.1، HTTP/2 و HTTP/3 اعمال می شود). این مشخصات یک روش HTTP را تعریف می کند امن اگر وضعیت سرور را تغییر ندهد. به عبارت دیگر، یک روش در صورتی ایمن است که به یک عملیات فقط خواندنی منجر شود.
این پسوند اجازه می دهد تا پیچیده پرس و جوهای مشتری محور مانند GraphQL برای اجتناب از استفاده از POST و قادر به لذت بردن از رفتار استاندارد حافظه پنهان HTTP. وقتی با سایر مزایای عملکرد HTTP/2 و HTTP/3 ترکیب شود، باید فرصتهای جدیدی را برای تعاملات پویا با مشتری باز کند.
در مورد اینکه پروپوزال چقدر فعال است، میتوانید بسیاری از بازبینیها را در تاریخچه GitHub سند منبع در اینجا ببینید: https://github.com/httpwg/http-extensions/commits/main/draft-ietf-httpbis-safe -method-w-body.xml
و از ردیاب داده IETF برای مشاهده سایر فعالیت ها در لیست های پستی استفاده کنید:https://datatracker.ietf.org/doc/draft-ietf-httpbis-safe-method-w-body/
Node 22.2.0 از روش HTTP Query پشتیبانی می کند https://github.com/nodejs/node/issues/51562
اشتراک های GraphQL از طریق HTTP/2
خلاصه ای از مشکلات مربوط به اشتراک GraphQL از طریق WebSockets
WebSocket ها اشتراک های GraphQL شما را حالتی می کنند
WebSocket ها باعث می شوند که مرورگر به HTTP/1.1 برگردد
WebSocket ها با افشای توکن های Auth در اختیار مشتری، مشکلات امنیتی ایجاد می کنند
WebSocket ها امکان ارتباط دو طرفه را فراهم می کنند، اما اشتراک های GraphQL این امکان را ندارند
WebSocket ها برای SSR (رندر سمت سرور) ایده آل نیستند
اشتراک های GraphQL از طریق WebSockets باعث ایجاد چند مشکل در عملکرد، امنیت و قابلیت استفاده می شود.
اشتراک های GraphQL از طریق HTTP/2 با رویدادهای ارسال شده از سرور (SSE)
HTTP/2 SSE (رویدادهای ارسال شده از سرور) / Fetch بدون حالت است
HTTP/2 SSE (رویدادهای ارسال شده توسط سرور) / Fetch به راحتی قابل ایمن شدن است
HTTP/2 SSE (رویدادهای ارسال شده از سرور) / واکشی به مشتری اجازه ارسال داده دلخواه را نمی دهد
HTTP/2SSE (رویدادهای ارسال شده از سرور) / Fetch به راحتی می تواند برای پیاده سازی SSR (پردازش سمت سرور) برای اشتراک های GraphQL استفاده شود.
HTTP/3 توسط 30.1٪ استفاده می شود از تمام وب سایت ها
HTTP/2 توسط 34.7٪ استفاده می شود از تمام وب سایت ها
برخی از روششناسیها این موارد را بالاتر میگذارند، اما با اطمینان میتوان گفت:
امروزه بخش بزرگی از ترافیک فعلی اینترنت از HTTP/3 استفاده می کند.
با این حال، این تغییر یک انقلاب آرام در صنعت ما بوده است.
HTTP/2 (و HTTP/3) قوانین بازی را برای توسعه وب تغییر می دهد!
این خلاصه ای از تعدادی مقاله دیگر و تجربه شخصی من در ساخت یک کلون جک باکس با استفاده از HTTP/3 Server Streaming با استفاده از ConnectRPC (gRPC) است.
مردم مدتهاست به HTTP/1.1 و بهترین شیوههای مرتبط با آن که در اطراف آن رشد کردهاند عادت کردهاند، اما اکنون که همه چیز تغییر کرده است، بسیاری از این موارد ارزش ارزیابی مجدد را دارند و درک دلیل آن مهم است.
در HTTP/1.1، به دلیل جستجوها، دست دادن ها و «فرآیند نوبت دهی» که اتفاق می افتد، دانلود چندین فایل کوچکتر از دانلود یک فایل با همان اندازه ترکیبی کندتر است.
در HTTP/1.1 هر اتصال یک چرخه درخواست/پاسخ تک واحدی است.
بسیاری از بهترین روش ها تحت HTTP/1.1 در واقع در استفاده از HTTP/2 یا HTTP/3 نتیجه معکوس دارند. به عنوان مثال:
-
در HTTP/1.1، باز کردن چندین اتصال HTTP 1.x به صورت موازی برای افزایش سرعت بارگذاری صفحه (حداکثر 6 در هر قطعه دامنه) بهترین روش است.
-
در HTTP/1.1 بهترین روش به هم پیوستن فایل های جاوا اسکریپت و CSS، تصاویر sprite و منابع درون خطی است.
-
در HTTP/1.1 بهترین روش طراحی API های خود به گونه ای است که چندین پرس و جو را دسته بندی کنید تا رفت و برگشت را به حداقل برسانید.
در مقابل، HTTP/2 (و HTTP/3) تقریباً بهنظر میرسد که هر دو جاذبه معکوس شده و تمام اصطکاکها وجود ندارند، همانطور که این شیوههای به خوبی فرسوده شدهاند. تنزل دادن عملکرد به جای افزایش عملکرد!
HTTP/2 TLS 1.3 تعداد رفت و برگشت های مورد نیاز برای راه اندازی یک اتصال HTTPS را به شدت کاهش می دهد. برای مشتریانی که قبلاً از یک سایت بازدید کردهاند، دادههایی که از این اتصال عبور میکنند از نظر رمزنگاری محافظت میشوند و نیازی به اشتراکگذاری پیامهای پروتکل تبادل کلید قبل از ارسال وجود ندارد.
HTTP/2 همچنین از مالتی پلکس شدن پشتیبانی میکند، که به مرورگر اجازه میدهد چندین درخواست را به طور همزمان در یک اتصال اجرا کند و درخواستها را به هر ترتیبی دریافت کند.
HTTP/2 از جریان ها پشتیبانی می کند، یک جریان دو طرفه از فریم ها بین مشتری و سرور. یک درخواست مشتری منفرد می تواند چندین پاسخ داشته باشد (مثلا اشتراک در به روز رسانی).
HTTP/2 دوطرفه کامل در سراسر جریان است، به این ترتیب که ممکن است یک جریان در حال ارسال باشد در حالی که دیگری در حال دریافت است. اما HTTP/2 هنوز در یک جریان معین نیمه دورو است.
HTTP/2 حداکثر 100 درخواست همزمان را که یک مرورگر می تواند از 6 تا 8 به سرور ارائه کند، پشتیبانی می کند.
HTTP/3 تقریباً HTTP/2 است اما بیش از UDP است (بله، آنها مواردی مانند اولویتبندی جریان را نیز بهبود داده و سادهسازی کردند). این از مشکل مسدود کردن سر خط TCP جلوگیری می کند، زمانی که یک صف از بسته های TCP توسط اولین بسته در صف نگه داشته می شود.
سوکت های وب و HTTP/2
HTTP/2 سوکتهای وب را برای همه موارد استفاده به جز فشار دادن، منسوخ میکند داده های باینری از سرور به a وب کلاینت JS. HTTP/2 به طور کامل از جریان باینری bidi (دو جهته) پشتیبانی می کند (ادامه مطلب را بخوانید)، اما مرورگر JS یک API برای مصرف فریم های داده باینری ندارد و AFAIK چنین API برنامه ریزی نشده است. هنگامی که مشتری یک جریان را با ارسال یک درخواست باز می کند، هر دو طرف می توانند فریم های داده را در یک سوکت ثابت در هر زمان ارسال کنند – full bidi.
برای هر کاربرد دیگری از جریان بیدی، HTTP/2 به خوبی یا بهتر از سوکت های وب است، زیرا (1) مشخصات کار بیشتری برای شما انجام می دهد، و (2) در بسیاری از موارد اجازه می دهد تا اتصالات TCP کمتری به یک مبدا باز شود.
این تفاوت چندانی با سوکتهای وب ندارد: مشتری باید قبل از اینکه سرور بتواند دادهها را به سراسر جهان ارسال کند، درخواست ارتقاء سوکت وب را آغاز کند.
بزرگترین تفاوت این است که برخلاف سوکتهای وب، HTTP/2 معنای مالتی پلکسی خود را تعریف میکند: جریانها چگونه شناسهها را دریافت میکنند و چگونه فریمها شناسه جریانی را که روی آن هستند حمل میکنند. HTTP/2 همچنین معنای کنترل جریان را برای اولویت بندی جریان ها تعریف می کند. این در بیشتر کاربردهای دنیای واقعی بیدی مهم است.
اگر شما نیاز به ساختن یک برنامه چت بلادرنگ دارید، فرض کنید، جایی که باید پیامهای چت جدید را برای همه کلاینتهای اتاق چت که دارای اتصالات باز هستند پخش کنید، میتوانید (و احتمالاً باید) این کار را بدون سوکتهای وب انجام دهید.
شما می توانید از رویدادهای ارسال شده توسط سرور برای پایین آوردن پیام ها و از Fetch api برای ارسال درخواست ها استفاده کنید. رویدادهای ارسال شده از سرور (SSE) یک API کمتر شناخته شده اما به خوبی پشتیبانی می شود که جریان سرور به مشتری پیام گرا را در معرض نمایش قرار می دهد. اگرچه برای جاوا اسکریپت کلاینت به نظر نمی رسد، مرورگر شما (اگر از HTTP/2 پشتیبانی می کند) از یک اتصال TCP مجدد برای مالتیپلکس کردن همه آن پیام ها استفاده می کند. هیچ از دست دادن کارایی وجود ندارد و در واقع یک افزایش نسبت به سوکت های وب است زیرا تمام درخواست های دیگر در صفحه شما نیز همان اتصال TCP را به اشتراک می گذارند. آیا به چندین جریان نیاز دارید؟ چندین منبع رویداد را باز کنید! آنها به طور خودکار برای شما مالتی پلکس می شوند.
رویدادهای ارسالشده از سرور علاوه بر کارآمدتر بودن منابع و تأخیر اولیه کمتری نسبت به دست دادن وبسوکت، ویژگی خوبی دارند که بهطور خودکار برمیگردند و روی HTTP/1.1 کار میکنند (اما محدودیت 6 اتصال در هر دامنه). اما هنگامی که شما یک اتصال HTTP/2 دارید، آنها فوق العاده خوب کار می کنند.
در اینجا یک مقاله خوب با یک مثال در دنیای واقعی از انجام SPA بهروزرسانی واکنشی وجود دارد.
شایان ذکر است که سوکت های وب از طریق HTTP/2 و حتی سوکت های وب از طریق HTTP/3 (UDP QUIC) نیز امکان پذیر است و عملکرد را به طور قابل توجهی بهبود می بخشد.
تاثیر HTTP/2 GraphQL یک کیسه ترکیبی است
با HTTP/2 (و HTTP/3) دسته بندی درخواست ها در حال حاضر است ضد تولید به عملکرد:
GET /widgets/5382894223,35223231,534232313,5231332435 HTTP/1.1
Accept: application/widgets+json
Host: api.widgets.org
Accept-Encoding: gzip, deflate
User-Agent: BobsWidgetClient/1.5
روش فوق دارای یک سری نکات منفی است. هم سرویس و هم مشتریان باید یک نقطه پایانی جدید و یک قالب جدید مبتنی بر لیست را درک کنند که API را متورم می کند – به خصوص اگر انواع مختلفی از منابع وجود داشته باشد که نیاز به درمان مشابه دارند. علاوه بر این، این رویکرد به طور جدی بر کارایی کش تأثیر می گذارد و بار سرور بیشتر و تأخیر درک شده توسط مشتری ایجاد می کند.
اگر بتوانید دقیقاً آنچه را که می خواهید برای سرور در قالبی کارآمد توصیف کنید، اکنون می تواند دقیقاً با آنچه شما می خواهید پاسخ دهد.
بدون اغراق زیاد، راه دیگری برای در نظر گرفتن HTTP/2 به عنوان یک زبان پرس و جو جدید است – زبانی که به شما امکان می دهد مجموعه بسیار پیچیده ای از درخواست ها را در حجم کمی از داده ها رمزگذاری کنید که به شدت برای انتقال بهینه شده است، در حالی که هنوز به اجزای استاندارد HTTP اجازه می دهد. – مخصوصا حافظه پنهان – برای کار با درخواست های فردی. با این حال، این هنوز است سرور محور همانطور که در حال حاضر مستلزم آن است که باطن سرور نقاط پایانی را فراهم کند دقیقا به همان اندازه که مشتری نیاز دارد، به جای اینکه به مشتری اجازه دهد مستقل درباره جزئیات تصمیم بگیرد.
با استفاده از HTTP/2، رفع می شود بیشتر مشکلات ناشی از اسناد مرکب و قالبهای مبتنی بر مجموعههای فیلد پراکنده مانند GraphQL و JSON:API:
-
از آنجایی که هر منبع تحت فشار در یک جریان HTTP/2 جداگانه (مالتی پلکسی HTTP/2) ارسال می شود، منابع مرتبط می توانند به صورت موازی به مشتری ارسال شوند.
-
در نتیجه، کلاینتها و واسطههای شبکه (مانند CDN یا پراکسی)، میتوانند هر منبع را در یک کش خاص ذخیره کنند، در حالی که جاسازی منبع فقط اجازه میدهد تا سند JSON بزرگ را در حافظه پنهان داشته باشیم، سپس باطل کردن کش کارآمدتر است و میتوان آن را انجام داد. در سطح HTTP
به طور خاص با GraphQL، استفاده از مکانیسم های کش ارائه شده توسط پروتکل HTTP آسان نیست (POST
درخواست ها را نمی توان تنها با استفاده از معنای HTTP ذخیره کرد).
HTTP/2 و فدراسیون GraphQL
فدراسیون آپولو به شما امکان می دهد تا چندین API را به صورت اعلامی در یک نمودار واحد و یکپارچه ترکیب کنید. این نمودار فدرال مشتریان را قادر می سازد تا از طریق یک API با API های شما تعامل داشته باشند درخواست واحد. یعنی دیگر مطلوب نیست از نقطه نظر عملکرد در HTTP/2 یا HTTP/3. در فدراسیون، کندترین پرس و جو به گلوگاه کل پرس و جو فدرال تبدیل می شود. فدراسیون همچنین دشواری استقرار و آزمایش پذیری مستقل را افزایش می دهد. همچنین ارائه موفقیت جزئی معنی دار و خطاهای جزئی به مشتری در زمانی که سوالات فرعی خطاها را برمی گرداند، دشوار می کند. ممکن است نگرانیهای خاص دیگری وجود داشته باشد – مانند احراز هویت و محدود کردن نرخ – که در آن دروازه GraphQL هنوز مفیدتر از غیر آن است.
فدراسیون آپولو همچنین از اشتراک های GraphQL پشتیبانی نمی کند و هیچ برنامه ای برای اضافه کردن پشتیبانی ندارند
روش HTTP QUERY و GraphQL
IETF WHATWG دارای یک پسوند پیشنویس HTTP است که یک روش HTTP جدید، QUERY، را به عنوان امن، روش درخواست بی قدرت که می تواند محتوای درخواست را حمل کند. (که برای HTTP/1.1، HTTP/2 و HTTP/3 اعمال می شود). این مشخصات یک روش HTTP را تعریف می کند امن اگر وضعیت سرور را تغییر ندهد. به عبارت دیگر، یک روش در صورتی ایمن است که به یک عملیات فقط خواندنی منجر شود.
این پسوند اجازه می دهد تا پیچیده پرس و جوهای مشتری محور مانند GraphQL برای اجتناب از استفاده از POST و قادر به لذت بردن از رفتار استاندارد حافظه پنهان HTTP. وقتی با سایر مزایای عملکرد HTTP/2 و HTTP/3 ترکیب شود، باید فرصتهای جدیدی را برای تعاملات پویا با مشتری باز کند.
در مورد اینکه پروپوزال چقدر فعال است، میتوانید بسیاری از بازبینیها را در تاریخچه GitHub سند منبع در اینجا ببینید: https://github.com/httpwg/http-extensions/commits/main/draft-ietf-httpbis-safe -method-w-body.xml
و از ردیاب داده IETF برای مشاهده سایر فعالیت ها در لیست های پستی استفاده کنید:
https://datatracker.ietf.org/doc/draft-ietf-httpbis-safe-method-w-body/
Node 22.2.0 از روش HTTP Query پشتیبانی می کند https://github.com/nodejs/node/issues/51562
اشتراک های GraphQL از طریق HTTP/2
خلاصه ای از مشکلات مربوط به اشتراک GraphQL از طریق WebSockets
-
WebSocket ها اشتراک های GraphQL شما را حالتی می کنند
-
WebSocket ها باعث می شوند که مرورگر به HTTP/1.1 برگردد
-
WebSocket ها با افشای توکن های Auth در اختیار مشتری، مشکلات امنیتی ایجاد می کنند
-
WebSocket ها امکان ارتباط دو طرفه را فراهم می کنند، اما اشتراک های GraphQL این امکان را ندارند
-
WebSocket ها برای SSR (رندر سمت سرور) ایده آل نیستند
اشتراک های GraphQL از طریق WebSockets باعث ایجاد چند مشکل در عملکرد، امنیت و قابلیت استفاده می شود.
اشتراک های GraphQL از طریق HTTP/2 با رویدادهای ارسال شده از سرور (SSE)
-
HTTP/2 SSE (رویدادهای ارسال شده از سرور) / Fetch بدون حالت است
-
HTTP/2 SSE (رویدادهای ارسال شده توسط سرور) / Fetch به راحتی قابل ایمن شدن است
-
HTTP/2 SSE (رویدادهای ارسال شده از سرور) / واکشی به مشتری اجازه ارسال داده دلخواه را نمی دهد
-
HTTP/2SSE (رویدادهای ارسال شده از سرور) / Fetch به راحتی می تواند برای پیاده سازی SSR (پردازش سمت سرور) برای اشتراک های GraphQL استفاده شود.