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 đó?