2011-02-02 8 views
8

Theo cách đơn giản, ứng dụng Java của tôi có thể được mô tả như sau:Làm thế nào để ứng dụng Java của tôi có khả năng mở rộng và khả năng chịu lỗi?

Đây là một ứng dụng web chạy trên máy chủ Tomcat có giao diện SOAP. Ứng dụng sử dụng JPA/Hibernate để lưu trữ dữ liệu trong cơ sở dữ liệu MySQL. Dữ liệu được lưu trữ bao gồm danh sách người dùng, danh sách máy chủ và danh sách URI trỏ đến tệp lớn (10 GB) trong hệ thống tệp. Toàn bộ hệ thống bao gồm một máy chủ trung tâm, nơi ứng dụng của tôi đang chạy và một loạt các máy chủ công nhân. Người dùng có thể kết nối với giao diện SOAP và yêu cầu hệ thống sao chép các tệp thuộc về một máy chủ công nhân cụ thể, sau đó có thể phân tích dữ liệu theo cách nào đó (Chúng tôi không thể sử dụng NFS, chúng tôi cần sao chép dữ liệu vào lưu trữ đĩa cục bộ của máy chủ công nhân). Sau đó, cơ sở dữ liệu lưu trữ cho mỗi người dùng lưu trữ tệp của công nhân của mình.

Hiện tại hệ thống đang chạy với một máy chủ trung tâm có ứng dụng Tomcat và cơ sở dữ liệu MySQL và 10 máy chủ công nhân và khoảng 30 người dùng có 100 tệp (trung bình 10GB) được lưu trữ phân phối trên máy chủ công nhân.

Nhưng trong tương lai, tôi phải mở rộng hệ thống theo hệ số 100-1000. Vì vậy, tôi có thể phải đối phó với 10000 người dùng, 100000 tệp và 10000 máy chủ. Và hệ thống cũng nên trở thành lỗi khoan dung, vì vậy mà tôi đã không có một máy chủ trung tâm duy nhất (đó là điểm duy nhất của sự thất bại trong hệ thống hiện nay), nhưng có lẽ một số những người thân. Ngoài ra, nếu một trong các máy chủ công nhân bị lỗi thì hệ thống sẽ được thông báo, do đó, nó không cố gắng sao chép các tệp trên máy chủ đó.

Câu hỏi của tôi bây giờ là: Tôi có thể sử dụng công nghệ Java nào để làm cho ứng dụng của tôi có khả năng mở rộng và chịu lỗi? Bạn sẽ giới thiệu loại kiến ​​trúc nào? Tôi vẫn nên có một cơ sở dữ liệu khổng lồ lưu trữ tất cả thông tin về tất cả các tệp, máy chủ và người dùng trong hệ thống ở một nơi hay tôi nên phân phối cơ sở dữ liệu của mình trên một số máy chủ và đồng bộ hóa chúng bằng cách nào đó?

Trả lời

11

Công nghệ bạn cần được gọi là Kiến trúc.

Bất kể bạn sử dụng công nghệ nào, bạn cần có một hệ thống được kiến ​​trúc tốt để mở rộng và dự phòng. Tạo một sơ đồ của toàn bộ kiến ​​trúc của hệ thống vì nó hiện đang hoạt động. Đánh dấu từng thành phần với những hạn chế của nó đối với người dùng, công việc, băng thông, không gian ổ cứng, bộ nhớ hoặc bất kỳ phần nào đang hạn chế cho ứng dụng của bạn. Điều này sẽ cung cấp cho bạn thiết kế cơ sở.

Bây giờ, hãy vẽ cùng sơ đồ đó vì nó sẽ cần phải đáp ứng các yêu cầu về khả năng mở rộng và dự phòng của bạn. Bạn có thể phải chia nhỏ các phần để làm cho nó hoạt động, hoặc phát triển các phần hoàn toàn mới. Sơ đồ này sẽ làm cho nó rất rõ ràng những gì bạn cần.

Một điều cụ thể mà tôi muốn giải quyết là cơ sở dữ liệu. Nếu bạn có thể tách cơ sở dữ liệu trên các đường hậu cần để bạn không tham gia bất kỳ truy vấn nào từ truy vấn này đến câu hỏi khác, thì bạn nên có cơ sở dữ liệu riêng biệt. Ngoài ra, cấu hình tốt nhất cho cơ sở dữ liệu là phải có mỗi cơ sở dữ liệu trên một máy nhanh với nhiều lưu trữ và thời gian truy cập rất nhanh. Nếu bạn làm điều này, điều duy nhất sẽ làm chậm cơ sở dữ liệu của bạn là truy vấn xấu hoặc bảng được lập chỉ mục kém. Theo kinh nghiệm của tôi, bạn nên tránh đồng bộ hóa cơ sở dữ liệu trừ khi bạn có một cơ sở dữ liệu chủ có quyền truy cập ghi và nó sao chép vào các cơ sở dữ liệu khác chỉ đọc. Bất kể, đây có thể là bước cuối cùng sau khi bạn đã lược tả tất cả các truy vấn của mình và bạn thực sự cần phần cứng bổ sung.