24/05/2018, 19:50

RMI và lập trình phân tán đối tượng

Thông thường mã lệnh của một chương trình khi thực thi được tập trung trên cùng một máy, đây là cách lập trình truyền thống. Sự phát triển như vũ bão của mạng máy tính đặc biệt là mạng Internet toàn cầu, đã khiến các chương trình truyền thống này không còn ...

Thông thường mã lệnh của một chương trình khi thực thi được tập trung trên cùng một máy, đây là cách lập trình truyền thống. Sự phát triển như vũ bão của mạng máy tính đặc biệt là mạng Internet toàn cầu, đã khiến các chương trình truyền thống này không còn đáp ứng được yêu cầu nữa. Các chương trình bây giờ yêu cầu phải có sự hợp tác xử lý, tức là mã lệnh của nó đã không tập trung trên một máy mà được phân tán trên nhiều máy. Khi một ứng dụng có mã lệnh thực thi được phân tán trên nhiều máy thì chương trình đó được gọi là chương trình phân tán và việc lập trình để tạo ra các chương trình này được gọi là lập trình phân tán. Có rất nhiều công nghệ lập trình phân tán như: DCOM, CORBA, RMI, EJB.. trong đó RMI là công nghệ thuần Java và dễ lập trình nhất.

Thông thường nếu các đối tượng đựơc tập trung trên cùng một máy thì bạn có thể triệu gọi các phương thức của nó bằng cách gửu cho nó một thông báo, câu hỏi đặt ra là làm thế nào để có thể triệu gọi các phương thức của một đối tượng nằm trên một máy khác. đây chính là nội dung của lập trình phân tán mã lệnh RMI (Remote Method Invoke – tạm dịch là triệu gọi phương thức từ xa). RMI là cách thức giao tiếp giữa các đối tượng Java có mã lệnh cài đặt (bao gồm cả phương thức và thuộc tính) nằm trên các máy khác nhau có thể triệu gọi lẫn nhau.

Hình sau mô hình triệu gọi đối tượng phân tán. Trên máy A các đối tượng A1, A2 gọi các phương thức của nhau được gọi là triệu gọi phương thức cục bộ (local method invoke) đây là cách lập trình hướng đối tượng truyền thống vẫn sử dụng, tương tự các đối tượng B1, B2, B3 là các đối tượng cục bộ.

Tuy nhiên các đối tượng Java có thể triệu gọi phương thức của một đối tượng nằm trên một máy khác dựa vào giao thức triệu gọi từ xa RMI. Trong mô hình dưới đây thì lời triệu gọi phương thức của đối tượng B2 ( nằm trên máy B) từ đối tượng A1 ( nằm trên máy A) là lời gọi phương thức từ xa.

Việc triệu gọi một phương thức từ xa thoạt nhìn có vẻ đơn giản nhưng thực tế lại phức tạp hơn triệu gọi phương thức cục bộ. Các đối tượng trên hai máy khác nhau hoạt động trên hai tiến trình khác nhau (có hai không gian địa chỉ khác nhau) nên việc tham chiếu biến địa chỉ đối tượng là khác nhau. Ví dụ khi bạn truyền một đối tượng cho một phương thức triệu gọi từ xa thì thực sự bạn truyển một tham chiếu đối tượng đến phương thức từ xa, tuy nhiên vùng nhớ thực sự của đối tượng lại nằm trên một máy khác. Lời gợi phương thức cục bộ luôn trả về kết quả thông qua ngăn xếp trong khi lời gợi phương thức từ xa kết quả trả về phải thông qua kết nối mạng chính vì vậy các sự cố về truyền thông luôn có thể sẩy ra, như vậy việc bắt và kiểm soát lỗi trong các ứng dụng phân tán là rất đắt.

Đối với lời gọi phương thức cục bộ, các tham số truyền vào phương thức cũng như kết quả trả về từ phương thức được thực hiện thông qua ngăn xếp (stack) trong khi lời gọi phương thức từ xa phải được đóng gói và chuyển qua mạng.

Để đơn giản và trong suốt đối với người lập trình đối tượng Java trên hai máy khác nhau không triệu gọi phương thức của nhau một cách trực tiếp mà thông qua lớp trung gian. Lớp trung gian tồn tại ở cả hai phía: phía máy khách (nơi gọi phương thức của đối tượng ở xa) và máy chủ (nơi đối tượng thực sự được cài đặt). Phía máy khác lớp trung gian này được gọi là stub (lớp móc), phía máy chủ lớp trung gian được gọi là skeletion (lớp nối).

Ta có thể hình dung lớp trung gian stub và skel là hai người trung gian giúp các đối tượng ở xa có thể giao dịch được với nhau.

Trong hình trên bạn có đối tượng C1 được cài đặt trên máy C. trình biên dịch Java giúp ta tạo ra hai lớp trung gian C1_stub và C1_skel. Lớp C1_stub được mang về máy A. Khi A1 trên máy A triệu gọi phương thức của đối tượng C1 nó sẽ chuyển lời gọi phương thức cho lớp trung gian C1_stub. Lớp trung gian C1_stub có trách nhiệm đóng gói các tham số chuyển tham số qua mạng đến phương thức được triệu gọi của đối tượng C1. Trên máy C lớp trung gian C1_Skel có nhiệm vụ nhận các tham số và chuyển vào vùng địa chỉ thích hợp sau đó gọi phương thức tương ứng. Kết quả trả về (nếu có) của phương thức do C1 trả về sẽ được lớp C1_Skel đóng gói và chuyển ngược về cho trình khách. Trên máy khách lớp trung gian C1_Stub chuyển giao kết quả cuối cùng lại cho A1. Bằng cơ chế này A1 luôn nghĩ rằng đối tượng C1 đang tồn tại ngay trên cùng máy với nó như các đối tượng cục bộ khác. Hơn nữa nhờ có lớp trung gian C1_Stub mà khi kết nối mạng gặp sự cố thì lớp trung gian stub sẽ luôn biết cách thông báo lỗi đến đối tượng A1.

Thực tế làm cách nào A1 tham chiếu được đến C1, một khi không có đối tượng C1 được cài đặt trên máy A? C1_Stub trên máy A chỉ thực hiện việc chuyển tham số, nhận kết quả trả về nếu có và thực hiện các giao thức mạng, nó không phải là hình ảnh của C1. Để làm được điều này đối tượng C1 cần cung cấp một giao diện tương ứng với các phương thức mà các đối tượng trên máy khác có thể triệu gọi. Chúng ta tiếp tục làm sáng tỏ đìêu này khi nói về giao diện từ xa.

0