2009-05-13 38 views
17

Có tải các máy chủ web tomcat cân bằng. Mỗi yêu cầu có thể được phục vụ bởi máy chủ tomcat khác nhau.Tải ứng dụng web cân bằng

Làm cách nào chúng tôi có thể xử lý điều này trong khi viết mã cho ứng dụng web dựa trên j2ee (thanh chống)?

Trả lời

30

Trước hết, bạn sẽ muốn thiết lập cân bằng tải cho phiên tương tác/phiên của phiên, để tiếp tục chuyển tiếp tất cả các yêu cầu tới cùng một Tomcat (miễn là nó lên) dựa trên JSESSIONID.

The Tomcat clustering doc khẳng định hai yêu cầu quan trọng cho các ứng dụng của bạn để thành công có nó phiên lặp lại:

  • Tất cả các thuộc tính phiên của bạn phải thực hiện java.io.Serializable
  • Hãy chắc chắn rằng web.xml của bạn có các yếu tố <distributable/> hoặc đặt ở <Context distributable="true" /> của bạn

Nếu bạn bắt đầu đặt Đối tượng vào Phiên không triển khai Serializable (hoặc có các thuộc tính/trường không triển khai Serializable), sau đó bạn sẽ gặp sự cố.

(Trên thực tế những điểm này tất cả các áp dụng bất kể là servlet chứa bạn đang sử dụng, tôi tin.)

Cập nhật: Để giải quyết một số câu hỏi trong các ý kiến ​​về việc tại sao sử dụng phiên dính khi bạn đang cân đối tải giữa nhiều máy chủ, tôi nghĩ rằng dễ nhất để giải thích điều này với một ví dụ.

Trước hết, điều này chỉ thực sự quan trọng nếu ứng dụng của bạn giữ một số loại dữ liệu trong phiên, có thể không phải là mọi ứng dụng đơn lẻ (mặc dù có thể là hầu hết). Nếu bạn không giữ dữ liệu trong phiên thì có thể bạn sẽ không quan tâm đến bất kỳ điều nào trong số này và bạn có thể dừng đọc ở đây.

Có môi trường nơi bạn giữ dữ liệu trong phiên nhưng bạn làm không có phiên cố định sẽ mở ra một thế giới đau đầu.

Giả sử first.jsp cập nhật một số giá trị trong thuộc tính phiên cụ thể và second.jsp xảy ra để đọc cùng thuộc tính phiên này. Bạn có thể thiết lập Tomcat để tái tạo dữ liệu phiên cho tất cả các máy chủ trong cụm, nhưng sự sao chép này không xảy ra ngay lập tức. Nếu yêu cầu ban đầu cho first.jsp được xử lý bởi và một nano giây sau khi hoàn thành, cùng một khách truy cập yêu cầu second.jsp, trong môi trường không dính của bạn sẽ được xử lý bởi server2. Kể từ khi nhân rộng không phải là ngay lập tức, bạn có bất kỳ cách nào để biết nếu bạn đang đọc dữ liệu phiên up-to-date nhất? Bạn có phải thêm một số loại logic để đồng bộ hóa lần đọc của bạn trên cụm sao? Điều này sẽ trở thành nỗi đau khổng lồ.

Thiết lập các phiên có liên quan/cố định phiên loại bỏ nhức đầu này; bằng cách có tất cả các yêu cầu từ cùng một máy chủ khách hàng bằng cùng một nút, bạn không phải lo lắng về việc "nút này có được cập nhật vào lúc nó xử lý yêu cầu không?" Khi nút không thành công, máy khách vẫn có thể chuyển đổi dự phòng sang một nút khác trong cụm, trong đó có bản sao dữ liệu phiên của nó, nhưng với phiên cố định, điều này trở thành trường hợp hiếm hoi và không phải là tiêu chuẩn.

Có một lý do khác để muốn các phiên cố định: tải giữa các nút trong cụm.Nếu một yêu cầu trong một phiên có thể được xử lý bởi bất kỳ nút nào, thì điều đó có nghĩa là bạn có bản sao tất cả được thiết lập trong cụm (nghĩa là dữ liệu phiên của node1 được thay thế cho node2, node3, ..., node N, dữ liệu phiên của node2 được nhân bản thành node1, node3, ... none N, v.v ...). Sao chép tất cả các phiên có thể trở thành băng thông và tài nguyên chuyên sâu khi cụm được lớn hơn, bởi vì mỗi bổ sung vào cụm nghĩa là một nút khác cần giao tiếp với mọi nút đơn khác trong cụm.

Một giải pháp thay thế cho dữ liệu của nút này được sao chép thành chỉ một vài "bạn bè" trong cụm sao, để trong trường hợp nút không thành công, dữ liệu có sẵn ở nơi khác nhưng không có nút nào phải có bản sao. Trong trường hợp này, bạn sẽ cấu hình cụm sao cho node1 có dữ liệu được sao chép tới các nút 2 và 3, nút 2 có dữ liệu được sao chép tới các nút 3 và 4, vv, tạo thành một chuỗi. Trong trường hợp này, việc thêm các nút bổ sung vào cụm không gây ra lượng giao tiếp giữa các nút tăng nhanh như trong một sơ đồ tất cả.

+0

Trong câu lệnh đầu tiên, bạn có nghĩa là khi Tomcat được chọn để xử lý yêu cầu đầu tiên, Tomcat phải được sử dụng để xử lý các yêu cầu sau từ trình duyệt đó. Trong trường hợp này làm thế nào để cân bằng tải giúp, nếu cùng một máy chủ tomcat phục vụ tất cả các yêu cầu? – user32262

+0

Tôi nghĩ ý tưởng chính của cân bằng tải là sử dụng nhiều máy chủ để phục vụ nhiều khách hàng. Nó không ngụ ý rằng tất cả các yêu cầu đến từ cùng một máy khách nên được phân phối cho nhiều máy chủ. Chỉ là một ý nghĩ, không chắc chắn. –

+0

Struts không khác gì trong trường hợp này. Dính vào những lời khuyên được cung cấp bởi, Matt. +1 –

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