2010-07-21 34 views
6

Tôi phải triển khai một máy khách HTTP trong Java và theo nhu cầu của tôi, có vẻ như cách hiệu quả nhất để làm điều đó là triển khai đường dẫn HTTP (theo RFC2616).HTTP 1.1 Đường ống

Ngoài ra, tôi muốn gửi đường ống POST. (Ngoài ra tôi không nói về ghép kênh. Tôi đang nói về pipelining tức là nhiều yêu cầu qua một kết nối trước khi nhận bất kỳ yêu cầu HTTP phản hồi nào)

Tôi không thể tìm thấy thư viện của bên thứ ba nói rõ rằng nó hỗ trợ pipelining. Nhưng tôi có thể sử dụng ví dụ Apache HTTPCore để xây dựng một khách hàng như vậy, hoặc nếu tôi phải tự xây dựng nó.

Vấn đề tôi gặp phải là ý tưởng hay. Tôi đã không tìm thấy bất kỳ tài liệu tham khảo có thẩm quyền rằng HTTP pipelining là một cái gì đó nhiều hơn một mô hình lý thuyết và được thực hiện đúng bởi các máy chủ HTTP. Ngoài ra, tất cả các trình duyệt hỗ trợ pipelining đều có tính năng này tắt theo mặc định.

Vì vậy, tôi nên cố gắng triển khai ứng dụng khách như vậy hoặc tôi sẽ gặp nhiều rắc rối do triển khai của máy chủ (hoặc proxy). Có bất kỳ tài liệu tham khảo nào đưa ra các hướng dẫn về chúng không?

Nếu đó là ý tưởng tồi thì mô hình lập trình thay thế cho hiệu quả là gì? Các kết nối TCP riêng biệt?

+0

Không hoàn toàn những gì bạn cần, nhưng serf là ​​thư viện C triển khai đường dẫn HTTP http://code.google.com/p/serf/ Tôi không chắc chắn 100% nếu nó hỗ trợ bài đăng pipelined. – Rup

+0

Cảm ơn bạn, tôi phải làm điều đó trong java – Cratylus

+0

@ user384706 Không bao giờ thử serf, nhưng nếu thực sự làm những gì bạn muốn và mọi thứ khác không thành công, thì bạn luôn có thể thử JNI/JNA. – luiscubal

Trả lời

8

Tôi đã thực hiện một khách hàng HTTP pipelined. Khái niệm cơ bản có vẻ dễ dàng nhưng việc xử lý lỗi rất khó.Hiệu suất đạt được là không đáng kể mà chúng tôi đã từ bỏ các khái niệm từ lâu.

Theo ý kiến ​​của tôi, điều đó không có ý nghĩa đối với trường hợp sử dụng thông thường. Nó chỉ có một số lợi ích khi các yêu cầu có kết nối logic. Ví dụ, bạn có một giao dịch 3-yêu cầu và bạn có thể gửi tất cả trong một lô. Nhưng thông thường bạn có thể kết hợp chúng thành một yêu cầu nếu chúng có thể được pipelined.

Tiếp theo là một rào cản tôi có thể ghi nhớ,

  1. keepalive TCP của không đảm bảo kết nối liên tục. Nếu bạn có 3 yêu cầu đường ống trong kết nối, máy chủ sẽ ngắt kết nối sau phản hồi đầu tiên. Bạn phải thử lại hai yêu cầu tiếp theo.

  2. Khi bạn có nhiều kết nối, cân bằng tải cũng phức tạp. Nếu không có kết nối nhàn rỗi, bạn có thể sử dụng kết nối bận hoặc tạo kết nối mới.

  3. Hết giờ cũng khó khăn. Khi một yêu cầu hết thời gian, bạn phải loại bỏ tất cả sau khi yêu cầu bởi vì họ phải quay trở lại theo thứ tự.

+0

@ZZ Coder Cảm ơn bạn! Trong khách hàng của bạn, bạn đã gửi đường dẫn POSTs? Trường hợp của tôi không bình thường. Tôi muốn đường dẫn POST thời gian thực kích hoạt các hành động trong trung tâm cuộc gọi. Bất kỳ thông tin nào bạn có thể nhớ, đặc biệt là về hành vi của máy chủ/proxy được đánh giá cao! – Cratylus

+0

Có. Nó xử lý POST. Không có khác biệt ngoại trừ việc bạn phải nhớ cơ thể nếu bạn thực hiện thử lại logic. –

+0

@ZZ Coder - Về 1: Trong trường hợp HTTP, bạn phải triển khai lại logic, và thử lại logic cho các kết nối pipelined không khác nhiều (điều duy nhất là trong trường hợp thử lại sau khi đường ống bị hỏng, bạn có để chờ phản hồi đầu tiên xem liệu đó có phải là kết nối pipelined hay không).Và hầu hết các máy chủ trong những ngày này có pipelining được kích hoạt theo mặc định, do đó, ngoại trừ các kết nối mạng rất kém đường ống giọt không nên xảy ra thường xuyên, tôi đoán –

9

POST không nên pipelined

8.1.2.2 Pipelining

Một khách hàng có hỗ trợ kết nối dai dẳng CÓ THỂ "đường ống" yêu cầu của nó (ví dụ, gửi nhiều yêu cầu mà không cần chờ đợi cho mỗi câu trả lời) . Máy chủ PHẢI gửi câu trả lời tới các yêu cầu đó theo cùng thứ tự mà đã nhận được yêu cầu.

Clients mà giả dai dẳng kết nối và đường ống ngay lập tức sau khi thiết lập kết nối NÊN được chuẩn bị để thử lại kết nối của họ nếu lần pipelined đầu tiên thất bại. Nếu khách hàng thực hiện thử lại như vậy, nó PHẢI KHÔNG phải là đường ống trước khi nó biết kết nối là liên tục. Khách hàng PHẢI cũng sẵn sàng gửi lại yêu cầu nếu máy chủ đóng kết nối trước khi gửi tất cả các câu trả lời tương ứng .

Khách hàng KHÔNG yêu cầu đường ống NÊN sử dụng phương pháp phi idempotent hoặc chuỗi phi idempotent các phương pháp (xem phần 9.1.2). Nếu không, chấm dứt sớm kết nối giao thông có thể dẫn đến kết quả không xác định . Một khách hàng có nhu cầu gửi yêu cầu không phải là yêu cầu không có giá trị NÊN chờ đến gửi yêu cầu đó cho đến khi có nhận được trạng thái phản hồi cho yêu cầu trước đó .

http://www.w3.org/Protocols/rfc2616/rfc2616-sec8.html

+4

Cảm ơn bạn đã trả lời. Nhưng NÊN KHÔNG có nghĩa là: "có thể tồn tại những lý do hợp lệ trong những trường hợp cụ thể khi hành vi cụ thể được chấp nhận hoặc thậm chí hữu ích" cho mỗi rfc 2119. Đây là một trong những trường hợp này. Trừ khi có một hàm ý trong NÊN KHÔNG định nghĩa tôi không cam kết – Cratylus

+0

@ user384706 Nếu yêu cầu của bạn thực sự là không có giá trị, có lẽ bạn đang thực sự làm một PUT? –

+0

@ user384706, Nó có nghĩa là một máy chủ tệ hại có thể nấc cục khi bạn đăng bài. Nhưng đúng, đó không phải là lỗi của bạn, nhưng khi mọi thứ không hoạt động, mọi thứ không hoạt động. Bất kỳ lỗi nào của nó cũng không quan trọng. – Pacerier

-1

pipelining hầu như không có sự khác biệt đối với máy chủ http; họ thường xử lý yêu cầu trong kết nối serially anyway - đọc yêu cầu, viết phản hồi, sau đó đọc yêu cầu tiếp theo ...

nhưng khách hàng rất có thể sẽ cải thiện thông lượng bằng cách ghép kênh. trang web thường có nhiều máy với nhiều cpus, tại sao bạn muốn tự nguyện giới hạn yêu cầu của mình thành một dòng? ngày nay nó là nhiều hơn về khả năng mở rộng ngang (yêu cầu đồng thời). tất nhiên, tốt nhất là chuẩn bị nó.

+1

Trong pipelining, ít nhất theo định nghĩa, tương tác không nối tiếp, vì các yêu cầu đến theo lô. Ngoài ra những gì nếu có một giới hạn về số lượng các kết nối mở đến cùng một máy chủ? – Cratylus

+2

Nó tạo nên sự khác biệt khi sử dụng kết nối độ trễ cao (quay số); thậm chí nhiều hơn như vậy khi nó là một "ống dẫn chất béo dài" (vệ tinh). Nó tránh được phí tổn của nhiều kết nối TCP, nhưng giữ hầu hết các ưu điểm. – lxgr

Các vấn đề liên quan