2009-03-16 24 views
53

Tôi muốn biết các lý do kỹ thuật khiến webframework nâng cao có hiệu suất và khả năng mở rộng cao? Tôi biết nó sử dụng scala, trong đó có một thư viện diễn viên, nhưng theo hướng dẫn cài đặt nó cấu hình mặc định là với cầu cảng. Vì vậy, nó sử dụng thư viện diễn viên để quy mô?lý do tại sao thang máy web có thể mở rộng được?

Bây giờ là khả năng mở rộng được xây dựng ngay bên ngoài hộp. Chỉ cần thêm các máy chủ và nút bổ sung và nó sẽ tự động mở rộng, đó là cách nó hoạt động? Nó có thể xử lý 500000+ kết nối đồng thời với các máy chủ hỗ trợ không.

Tôi đang cố tạo một khung dịch vụ web cho cấp doanh nghiệp, có thể đánh bại những gì ở đó và dễ dàng mở rộng, có thể định cấu hình và bảo trì. Định nghĩa của tôi về mở rộng quy mô chỉ là thêm nhiều máy chủ hơn và bạn sẽ có thể đáp ứng được tải phụ.

Cảm ơn

+1

Đây thực sự là một chủ đề lớn, tôi nghĩ bạn nên tập trung vào câu trả lời cho các khu vực cụ thể của phần mềm máy chủ –

Trả lời

3

Jetty có lẽ là điểm xuất phát, nhưng nam diễn viên kết thúc lên phục vụ theo yêu cầu, tôi khuyên bạn nên có một cái nhìn vào ví dụ twitter-esque, 'chạy mau' để xem làm thế nào bạn sẽ có thể tạo ra một dịch vụ rất khả năng mở rộng. IIRC, đây là một trong những điều khiến mọi người chú ý đến Twitter.

170

Cách tiếp cận của thang máy đối với khả năng mở rộng nằm trong cùng một máy. Chia tỷ lệ trên các máy là một chủ đề lớn hơn, khó khăn hơn. Câu trả lời ngắn gọn là: Scala và Lift không làm bất cứ điều gì để giúp hoặc cản trở việc mở rộng theo chiều ngang. Với các diễn viên trong một máy duy nhất, Lift đạt được khả năng mở rộng tốt hơn bởi vì một cá thể đơn lẻ có thể xử lý nhiều yêu cầu đồng thời hơn so với hầu hết các máy chủ khác. Để giải thích, trước tiên tôi phải chỉ ra các sai sót trong mô hình xử lý yêu cầu theo yêu cầu cổ điển. Chịu với tôi, điều này sẽ yêu cầu một số lời giải thích.

Một khung công tác điển hình sử dụng chuỗi để phục vụ yêu cầu trang. Khi máy khách kết nối, khung công tác gán một luồng ra khỏi một nhóm. Chủ đề đó sau đó thực hiện ba điều: nó đọc yêu cầu từ một ổ cắm; nó thực hiện một số tính toán (có khả năng liên quan đến I/O đến cơ sở dữ liệu); và nó sẽ gửi phản hồi trên ổ cắm. Ở mỗi bước khá nhiều, luồng sẽ kết thúc trong một thời gian. Khi đọc yêu cầu, nó có thể chặn trong khi chờ mạng. Khi thực hiện tính toán, nó có thể chặn trên đĩa hoặc mạng I/O. Nó cũng có thể chặn trong khi chờ cơ sở dữ liệu. Cuối cùng, trong khi gửi phản hồi, nó có thể chặn nếu máy khách nhận dữ liệu từ từ và các cửa sổ TCP được lấp đầy. Nhìn chung, các chủ đề có thể chi tiêu 30 - 90% thời gian của nó bị chặn. Tuy nhiên, nó dành 100% thời gian cho một yêu cầu đó.

Một JVM chỉ có thể hỗ trợ quá nhiều luồng trước khi nó thực sự chậm lại. Lập lịch trình chủ đề, tranh chấp cho các thực thể chia sẻ bộ nhớ (như các hồ bơi kết nối và màn hình), và các giới hạn hệ điều hành gốc đều áp đặt các hạn chế về số lượng chủ đề mà một JVM có thể tạo ra.

Vâng, nếu JVM bị hạn chế về số chuỗi tối đa của nó và số lượng chủ đề xác định số lượng yêu cầu đồng thời mà máy chủ có thể xử lý, thì số lượng yêu cầu đồng thời sẽ được xác định theo số chuỗi.

(Có những vấn đề khác có thể áp đặt giới hạn thấp hơn --- GC sân đập, ví dụ. Chủ đề là một yếu tố hạn chế cơ bản, nhưng không phải là người duy nhất!)

Lift tách riêng chủ đề từ yêu cầu. Trong Nâng, yêu cầu không không kết nối một chuỗi. Thay vào đó, một luồng sẽ thực hiện một hành động (như đọc yêu cầu), sau đó gửi một thông báo tới một diễn viên. Diễn viên là một phần quan trọng của câu chuyện, bởi vì chúng được lên kế hoạch thông qua các chủ đề "nhẹ". Một nhóm các luồng được sử dụng để xử lý các thông điệp trong các tác nhân. Điều quan trọng là phải tránh các hoạt động chặn bên trong của các diễn viên, vì vậy các chủ đề này sẽ nhanh chóng trở lại hồ bơi.(Lưu ý rằng hồ bơi này không hiển thị cho ứng dụng, nó là một phần của sự hỗ trợ của Scala cho các diễn viên.) Một yêu cầu hiện bị chặn trên cơ sở dữ liệu hoặc đĩa I/O, chẳng hạn, không giữ một chuỗi xử lý yêu cầu bị chiếm đóng. Chuỗi xử lý yêu cầu có sẵn, gần như ngay lập tức, để nhận được nhiều kết nối hơn.

Phương pháp tách yêu cầu từ chuỗi cho phép máy chủ Nâng có nhiều yêu cầu đồng thời hơn so với máy chủ theo yêu cầu. (Tôi cũng muốn chỉ ra rằng thư viện Grizzly hỗ trợ một cách tiếp cận tương tự mà không có các tác nhân.) Các yêu cầu đồng thời khác có nghĩa là một máy chủ Lift đơn lẻ có thể hỗ trợ nhiều người dùng hơn một máy chủ Java EE thông thường.

+5

Tôi muốn nhiều phiếu bầu hơn cho bạn. Đó là một câu trả lời hoàn hảo. –

+23

Tôi nghĩ rằng bạn là nạn nhân của một người hỏi và chạy. Câu trả lời của bạn là tốt hơn rất nhiều sau đó câu hỏi chính nó xứng đáng. –

+1

@mtnygard: bạn nói "điều quan trọng là tránh chặn các hoạt động bên trong các diễn viên". Điều gì sẽ xảy ra nếu tôi cần thực hiện một số I/O có khả năng chặn một thời gian? Tôi có nên khởi chạy một chuỗi khác không? –

20

tại mtnyguard

"Scala và Lift không làm bất cứ điều gì hoặc là giúp đỡ hay cản trở tỉ lệ ngang"

là không hoàn toàn đúng. Nâng là khung công tác rất có trạng thái. Ví dụ nếu một người dùng yêu cầu một biểu mẫu, thì anh ta chỉ có thể gửi yêu cầu tới cùng một máy nơi biểu mẫu đến từ, vì hành động processeing biểu mẫu được lưu trong trạng thái máy chủ.

Và điều này thực sự là một thứ cản trở khả năng mở rộng theo cách, bởi vì hành vi này không phù hợp với kiến ​​trúc không được chia sẻ.

Không nghi ngờ gì về khả năng nâng cao nhưng hiệu suất và khả năng mở rộng là hai điều khác nhau. Vì vậy, nếu bạn muốn mở rộng chiều ngang với thang máy, bạn phải xác định các phiên dính trên loadbalancer sẽ chuyển hướng người dùng trong một phiên tới cùng một máy.

+12

Yep ...Đúng vậy, Foursquare và Novell Pulse đều chứng minh rằng yêu cầu phiên giao dịch của Lift không phải là vấn đề cho việc mở rộng quy mô ngang ... và với Trình quản lý cụm nâng cấp sắp tới, việc quản lý cụm sẽ dễ dàng hơn. –

+1

Trình quản lý cụm máy chủ ở đâu? – Lukasz

1

Tôi thực sự thích câu trả lời của @ dre khi anh ấy nêu chính xác trạng thái của thang máy là một vấn đề tiềm năng cho khả năng mở rộng ngang.

Sự cố - Thay vì tôi mô tả lại toàn bộ nội dung, hãy xem cuộc thảo luận (Không phải nội dung) trên bài đăng này. http://javasmith.blogspot.com/2010/02/automagically-cluster-web-sessions-in.html

Giải pháp sẽ là @dre cho biết cấu hình phiên dính trên bộ cân bằng tải ở mặt trước và thêm nhiều phiên bản khác. Nhưng kể từ khi yêu cầu xử lý trong thang máy được thực hiện trong sự kết hợp thread + diễn viên, bạn có thể mong đợi một ví dụ xử lý các yêu cầu nhiều hơn khung bình thường. Điều này sẽ cung cấp cho một cạnh hơn có các buổi dính trong khuôn khổ khác. tức là khả năng xử lý nhiều hơn của cá thể của cá nhân có thể giúp bạn quy mô

  • bạn có tích hợp tăng Akka, đây sẽ là một lợi thế khác.
Các vấn đề liên quan