10

Trước hết, tôi có một câu hỏi khái niệm, Liệu từ "phân tán" chỉ có nghĩa là ứng dụng được chạy trên nhiều máy? hoặc có những cách khác mà một ứng dụng có thể được coi là phân tán (ví dụ nếu có nhiều mô-đun độc lập tương tác với togehter nhưng trên cùng một máy thì điều này có được phân phối không?).Làm thế nào để xây dựng một ứng dụng java phân tán?

Thứ hai, tôi muốn xây dựng một hệ thống thực hiện bốn loại tác vụ, sẽ có nhiều khách hàng và mỗi khách hàng sẽ có nhiều nhiệm vụ của từng loại để chạy định kỳ. Ví dụ: customer1 sẽ có task_type1 ngày hôm nay, task_type2 sau hai ngày và cứ thế, có thể có customer2 có task_type1 được thực thi cùng lúc với task_type1 của customer1. tức là cần có sự đồng thời. Cấu hình để thực thi các tác vụ sẽ được lưu trữ trong DB và kết quả của các nhiệm vụ này cũng sẽ được lưu trữ trong DB. khách hàng sẽ sử dụng hệ thống từ trình duyệt web (trang html) để tương tác với hệ thống (về cơ bản, cấu hình nhiệm vụ và xem kết quả). Tôi nghĩ về việc sử dụng một webservice còn lại (sử dụng JAX-RS), nơi các trang html sẽ liên lạc với và trên các chủ đề sử dụng phụ trợ để thực thi đồng thời. Câu hỏi:

  1. Điều này nghe có vẻ đơn giản, nhưng tôi có đi đúng hướng không? hoặc tôi nên sử dụng các công nghệ hoặc khái niệm khác như Java Beans chẳng hạn?

2.Nếu cách tiếp cận của tôi tốt, tôi có cần sử dụng ngôn ngữ kịch bản như JSP hoặc tôi có thể gửi biểu mẫu html trực tiếp đến các url còn lại và nhận kết quả (sử dụng JSON chẳng hạn) không?

  1. Nếu tôi muốn làm cho ứng dụng được phân phối, có thể với ý tưởng của tôi không? Nếu không thì tôi cần sử dụng cái gì?

Xin lỗi vì có nhiều câu hỏi, nhưng tôi thực sự nhầm lẫn về điều này.

+0

bạn có thực sự mong đợi rằng 'task_type1',' task_type2', v.v ... sẽ rất chuyên sâu về CPU không? Bạn đã * thử nghiệm * để xác nhận điều đó chưa? Có thực sự sẽ có rất nhiều người dùng sử dụng ứng dụng cùng một lúc? Nó có thể là một máy chủ duy nhất có thể xử lý tải tốt và phân phối các ứng dụng sẽ chỉ phức tạp những thứ không có lợi ích bổ sung. 2, không giả sử bạn cần chủ đề bởi vì "nhiệm vụ cần phải được thực hiện cùng một lúc". Trừ khi bạn cần tận dụng lợi thế của nhiều CPU, một chủ đề kéo các nhiệm vụ ra khỏi một hàng đợi công việc có thể sẽ hoạt động tốt. –

+0

@ AlexD các nhiệm vụ không phải là CPU chuyên sâu, nhưng nếu tôi nhận được nhiều khách hàng với nhiều nhiệm vụ thì đây có thể là một vấn đề trong tương lai, tôi đang xem xét khả năng mở rộng cho tương lai. Tôi giả sử một máy chủ sẽ xử lý ngay bây giờ. Nhưng tôi muốn biết cách phân phối nó trong trường hợp tôi cần. I E.Tôi muốn hiểu các khái niệm về phân phối. – Sami

+0

@AlexD Về chủ đề, tôi cần các nhiệm vụ được thực hiện vào các thời điểm cụ thể, ví dụ, có thể có task_type1 sẽ được thực hiện lúc 10:00 sáng cho khách hàng1 và một task_type1 khác cho khách hàng2 cũng lúc 10:00 sáng. Tôi cần một số loại đồng thời trong thực thi. tức là: xử lý hai tác vụ song song. – Sami

Trả lời

5

Thuật ngữ "ứng dụng phân tán" có nghĩa là các phần của hệ thống ứng dụng sẽ thực thi trên các nút tính toán khác nhau (có thể là CPU/lõi khác nhau trên các máy khác nhau hoặc giữa nhiều CPU/lõi trên cùng một máy).

Có nhiều giải pháp công nghệ khác nhau cho câu hỏi về cách hệ thống có thể được xây dựng. Vì bạn đã hỏi về công nghệ Java, ví dụ bạn có thể xây dựng ứng dụng web bằng Bộ công cụ Web của Google, công cụ này sẽ cung cấp cho bạn trải nghiệm người dùng khách hàng dựa trên trình duyệt phong phú. Đối với máy chủ đã triển khai các phần của hệ thống của bạn, bạn có thể bắt đầu bằng cách sử dụng các servlet đơn giản chạy trong một thùng chứa servlet như Tomcat. Các servlet của bạn sẽ được gọi từ trình duyệt bằng cách sử dụng các cuộc gọi thủ tục từ xa dựa trên HTTP.

Sau này nếu bạn gặp phải vấn đề về khả năng mở rộng, bạn có thể bắt đầu di chuyển các phần của logic nghiệp vụ sang các thành phần EJB3 mà cuối cùng có thể triển khai trên nhiều nút tính toán trong ngữ cảnh của máy chủ ứng dụng. Tôi không nghĩ rằng bạn không cần phải giải quyết vấn đề này cho đến khi bạn chạy nó. Thật khó để nói liệu bạn sẽ không biết nhiều hơn về bản chất của các nhiệm vụ mà khách hàng sẽ thực hiện.

4

Để trả lời câu hỏi đầu tiên của bạn - bạn có thể nhận biểu mẫu để gửi trực tiếp đến các url còn lại. Rõ ràng nó phụ thuộc chính xác vào yêu cầu của bạn.

Như @AlexD được đề cập trong các nhận xét ở trên, bạn không phải lúc nào cũng cần phân phối ứng dụng, tuy nhiên nếu bạn muốn, bạn nên xem xét JMS, API nhắn tin. để chạy gần như bất kỳ số lượng máy ứng dụng công nhân nào, sẵn sàng gửi tin nhắn từ hàng đợi tin nhắn và xử lý chúng.

Nếu bạn muốn tạo ứng dụng được phân phối động, chạy trên nhiều máy ảo có nguồn lực thấp (ví dụ như trường hợp Micro EC2 của Amazon) hoặc phần cứng vật lý, có thể được thêm và xóa theo ý muốn để đáp ứng nhu cầu. bạn có thể cân nhắc việc tích hợp nó với Project Shoal, đây là một khung công tác Java cho phép phân cụm các nút ứng dụng và khiến chúng xuất hiện/biến mất bất cứ lúc nào. Project Shoal sử dụng JXTA và JGroups làm giao thức truyền thông cơ bản.

Một tuyến đường khác có thể là phân phối ứng dụng của bạn bằng cách sử dụng EJB s đang chạy trên máy chủ ứng dụng.

6

Tôi chỉ muốn thêm một điểm vào các câu trả lời đã được đăng. Xin vui lòng nhận xét của tôi với một hạt muối, vì tất cả các ứng dụng web tôi đã từng xây dựng chỉ chạy trên một máy chủ (ngoài các ứng dụng được triển khai cho Heroku, có thể "phân phối" ứng dụng của bạn cho bạn).

Nếu bạn cảm thấy rằng bạn có thể cần phải phân phối ứng dụng của bạn cho khả năng mở rộng, điều đầu tiên bạn nên suy nghĩ về là không dịch vụ web và xử lý đa luồng và thông điệp của hàng đợi và Enterprise JavaBeans và ...

Điều đầu tiên để suy nghĩ về chính miền ứng dụng của bạn và ứng dụng sẽ làm gì. Các bộ phận chuyên sâu của CPU sẽ ở đâu? Phụ thuộc có gì giữa các phần đó? Các bộ phận của hệ thống có tự nhiên phân tách thành các quá trình song song không? Nếu không, bạn có thể thiết kế lại hệ thống để làm cho nó như vậy? QUAN TRỌNG: dữ liệu nào cần được chia sẻ giữa các luồng/quy trình (cho dù chúng đang chạy trên cùng một máy hoặc khác nhau)?

Tình huống lý tưởng là nơi mỗi luồng/quy trình/máy chủ song song có thể nhận được dữ liệu riêng của nó và làm việc trên đó mà không cần chia sẻ. Thậm chí tốt hơn là nếu một số phần nhất định của hệ thống có thể được tạo thành không trạng thái - mã không quốc tịch vô hạn song song (dễ dàng và tự nhiên). Việc chia sẻ dữ liệu thường xuyên và chi tiết hơn giữa các tiến trình song song là, ứng dụng sẽ càng ít khả năng mở rộng. Trong trường hợp cực đoan, bạn thậm chí có thể không nhận được bất kỳ tăng hiệu suất từ ​​phân phối các ứng dụng. (Bạn có thể thấy điều này với mã đa luồng - nếu chủ đề của bạn liên tục tranh giành cho cùng một khóa, chương trình của bạn thậm chí có thể chậm hơn với nhiều luồng + CPU hơn một luồng + CPU.)

khái niệm phân tích công việc cần làm là quan trọng hơn những công cụ hoặc kỹ thuật bạn thực sự sử dụng để phân phối ứng dụng. Nếu phân tích khái niệm của bạn là tốt, nó sẽ dễ dàng hơn nhiều để phân phối ứng dụng sau này nếu bạn bắt đầu chỉ với một máy chủ.

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