2016-08-10 22 views
10

Tôi có dịch vụ REST REST và tôi muốn phục vụ nó bằng HTTP2. Thiết lập máy chủ hiện tại của tôi là nginx -> Gunicorn. Nói cách khác, nginx (cổng 443 và 80 chuyển hướng đến cổng 443) đang chạy như một proxy ngược và chuyển tiếp các yêu cầu tới Gunicorn (cổng 8000, không có SSL). nginx đang chạy trong chế độ HTTP2 và tôi có thể xác minh rằng bằng cách sử dụng chrome và kiểm tra cột 'giao thức' sau khi gửi GET đơn giản tới máy chủ. Tuy nhiên, Gunicorn báo cáo rằng các yêu cầu nhận được là HTTP1.0. Ngoài ra, tôi coulnt't tìm thấy nó trong danh sách này: https://github.com/http2/http2-spec/wiki/Implementations Vì vậy, câu hỏi của tôi là:Cung cấp API REST (Flask) REST qua HTTP2

  • Có thể phục vụ một (Flask) ứng dụng Python với HTTP2? Nếu có, máy chủ nào hỗ trợ nó?
  • Trong trường hợp của tôi (một máy chủ proxy ngược và một máy chủ phục vụ API thực tế), máy chủ nào phải hỗ trợ HTTP2?

Lý do tôi muốn sử dụng HTTP2 là vì trong một số trường hợp, tôi cần thực hiện hàng nghìn yêu cầu và tôi quan tâm xem tính năng yêu cầu ghép kênh của HTTP2 có thể tăng tốc độ không. Với HTTP1.0 và Yêu cầu Python là ứng dụng khách, mỗi yêu cầu mất ~ 80ms không thể chấp nhận được. Các giải pháp khác sẽ chỉ là số lượng lớn/batch tài nguyên REST của tôi và gửi nhiều với một yêu cầu duy nhất. Vâng, ý tưởng này nghe có vẻ tốt, nhưng tôi thực sự quan tâm để xem liệu HTTP2 có thể tăng tốc mọi thứ hay không.

Cuối cùng, tôi nên đề cập rằng đối với phía máy khách, tôi sử dụng các yêu cầu Python với bộ điều hợp Hyper http2.

Trả lời

9

Có thể phân phối ứng dụng Python (Flask) bằng HTTP/2 không?

Có, theo thông tin bạn cung cấp, bạn đang thực hiện tốt.

Trong trường hợp của tôi (một máy chủ proxy ngược và một phân phát API thực tế), máy chủ nào phải hỗ trợ HTTP2?

Bây giờ tôi sẽ đạp trên băng mỏng và đưa ra ý kiến.

Cách HTTP/2 đã được triển khai cho đến nay là bằng cách có máy chủ cạnh hội thoại HTTP/2 (như ShimmerCat hoặc NginX). Máy chủ đó chấm dứt TLS và HTTP/2 và từ đó sử dụng HTTP/1, HTTP/1.1 hoặc FastCGI để nói chuyện với ứng dụng bên trong.

Có thể, ít nhất về mặt lý thuyết, một máy chủ cạnh nói HTTP/2 với ứng dụng web? Có, nhưng HTTP/2 là phức tạp và cho các ứng dụng bên trong, nó không trả hết rất tốt.

Đó là vì hầu hết các khung ứng dụng web được xây dựng để xử lý các yêu cầu cho nội dung và được thực hiện đủ tốt với HTTP/1 hoặc FastCGI. Mặc dù có những ngoại lệ, các ứng dụng web có ít sử dụng cho sự tinh tế của HTTP/2: ghép kênh, ưu tiên, tất cả các biện pháp phòng ngừa an ninh, v.v.

Sự tách biệt kết quả là quan điểm của tôi là một điều tốt.


thời gian đáp ứng 80 ms của bạn có thể có ít để làm với các giao thức HTTP bạn đang sử dụng, nhưng nếu những 80 ms chủ yếu dành chờ đợi cho đầu vào/đầu ra, thì tất nhiên chạy thứ song song là một điều tốt .

Gunicorn sẽ sử dụng một chuỗi hoặc một quy trình để xử lý từng yêu cầu (trừ khi bạn đã đi xa thêm dặm để cấu hình chương trình phụ trợ greenlets), vì vậy hãy cân nhắc việc cho phép Gunicorn sinh ra hàng nghìn tác vụ là khả thi trong trường hợp của bạn.

Nếu nội dung yêu cầu của bạn cho phép, có thể bạn có thể tạo tệp tạm thời và phân phát chúng bằng máy chủ cạnh HTTP/2.

0

Hiện tại, bạn có thể phân phối HTTP/2 trực tiếp từ ứng dụng Python, ví dụ: sử dụng Twisted. Bạn hỏi cụ thể về một ứng dụng Flask mặc dù, trong trường hợp tôi muốn (với thiên vị) đề nghị Quart đó là Flask API reimplemented trên đầu trang của asyncio (với sự hỗ trợ HTTP/2).

vấn đề thực tế của bạn,

Với HTTP1.0 và Python Các yêu cầu như khách hàng, mỗi yêu cầu có ~ 80ms

gợi ý với tôi rằng vấn đề bạn có thể gặp là mỗi yêu cầu mở một kết nối mới. Điều này có thể được giảm bớt thông qua việc sử dụng connection pool mà không yêu cầu HTTP/2.