GIỚI THIỆU Chương đầu của luận văn sẽ giới thiệu chung nhấtnhu cầu thực thế của việc nâng cấp tự động cho các hệ thống phân tán hiện nay, cũng như mục đích, yêu cầu, các thách thực khi n
Trang 1MỤC LỤC
LỜI CAM ĐOAN i
LỜI CẢM ƠN ii
MỤC LỤC iii
DANH MỤC CÁC KÝ HIỆU, CÁC CHỮ VIẾT TẮT v
DANH MỤC CÁC HÌNH VẼ vi
MỞ ĐẦU vii
CHƯƠNG 1 GIỚI THIỆU 1
1.1 Giới thiệu chung 1
1.2 Yêu cầu, thách thức hiện tại 2
1.3 Hướng đề xuất 3
CHƯƠNG 2 NGHIÊN CỨU LIÊN QUAN 4
2.1 UpgradeJ 4
2.2 Sử dụng kĩ thuật tái cấu trúc ngăn xếp 7
2.3 Xây dựng lớp động cho đối tượng tương tranh không đồng bộ 9
CHƯƠNG 3 PHƯƠNG PHÁP NÂNG CẤP ĐỘNG HỆ THỐNG PHÂN TÁN 18
3.1 Hệ thống phân tán 18
3.2 Mô hình nâng cấp 21
3.3Hàm lịch trình 25
3.4 Đối tượng mô phỏng 26
3.5 Hàm chuyển 28
CHƯƠNG 4 THỰC NGHIỆM VÀ MÔ PHỎNG 30
4.1 Phân tích hệ thống 30
Trang 24.1.1 Biểu đồ ca sử dụng (biểu đồ Use case) 31
4.1.2 Biểu đồ trình tự 32
4.1.3 Biểu đồ lớp 37
4.1.4 Thiết kế dữ liệu 37
4.2 Mô hình nâng cấp hệ thống 38
4.3 Thử nghiệm 40
KẾT LUẬN 43
TÀI LIỆU THAM KHẢO 44
Trang 3DANH MỤC CÁC KÝ HIỆU, CÁC CHỮ VIẾT TẮT
Thuật ngữ,chữ viết tắt Giải thích
Đối tƣợng mô phỏng
Đối tƣợng mô phỏng phiên bản cũ
Đối tƣợng mô phỏng phiên bản mởi
Hàm chuyển
Hàm lịch trình
Ngôn ngữ mô hình hóa thống nhất
Trang 4DANH MỤC CÁC HÌNH VẼ
Hình 2.1 Revision upgrade 6
Hình 2.2 Evolution upgrade 6
Hình 2.3 Kiến trúc hệ thống UpStare 8
Hình 3.1 Kiểu phân chia chức năng giữa Client và Server 18
Hình 3.3 Kiến trúc ngang hàng 19
Hình 3.4 Liên lạc bằng phương thức gọi hàm từ xa RPC 20
Hình 3.5 Làm thế nào để nâng cấp xảy ra 21
Hình 3.6 Nâng cấp 2 nút từ phiên bản V lên phiên bản V+1 23
Hình 3.7 Nâng cấp 4 nút từ phiên bản V lên phiên bản V+1 24
Hình 3.8 Gọi giữa các phiên bản 27
Hình 3.9 Qua trình chuyển đổi SOs 28
Hình 3.10 Hàm chuyển trạng thái từ phiên bản V lên V+1 29
Hình 4.1 Biểu đồ ca sử dụng 31
Hình 4.2 Biểu đồ trình tự thiết lập chơi 32
Hình 4.3 Biểu đồ trình tự chơi game 33
Hình 4.4 Biểu đồ trình tự chơi lại 35
Hình 4.5 Biểu đồ trình tự chơi với người khác 36
Hình 4.6 Biểu đồ lớp 37
Hình 4.7 Biểu đồ trình tự nâng cấp 38
Hình 4.8 Biểu đồ lớp phân tích khi nâng cấp 39
Hình 4.9 Thiết lập hai máy bắt đầu chơi 40
Hình 4.10 Khi máy A yêu cầu nâng cấp 41
Hình 4.11 Sau khi nâng cấp bản đồ chương trình 42
Trang 5MỞ ĐẦU
Các hệ thống thông tin ngày nay đang từng ngày mở rộngđể phục vụ với nhiều mục đích khác nhau, nhất là các hệ thống phân tán đang dần khẳng định với những ưu thếvề chi phí, hiệu năng, khả năng mở rộng, độ tin cậy trong các hệ thốngứng dụng
nó Với hệ thống phân tán như các cụm máy chủ, hệ thống ngang hàng trong quá trình
sử dụng luôn thường xuyên đòi hỏi các yêu cầu thay đổi như thêm các tính năng, cải thiện hiệu suất, sửa lỗi, mở rộng hệ thống Các yêu cầu đó gọi chung là việc nâng cấp
hệ thống Các hệ thống này rất lớn, vì vậy thực tế các quản trị viên không thể nâng cấp các nút bằng tay (ví dụ, thông qua đăng nhập từ xa) hay nâng cấp tất cả các nút cùng một lúc Thay vào đó, phải có việc lan truyền tự động các yêu cầu thay đổi thông qua hệ thống phân tán Nhưng yêu cầu vẫn có thể kiểm soát về trình tự, sự đồng nhất tại đó các nút được nâng cấp để tránh làm gián đoạn dịch vụ đang cung cấp và không làm ảnh hưởng tới các ứng dụng có sẵn
Vì vậy, việc nghiên cứu và đưa ra các phương pháp nâng cấp tự động cho các hệ
thống hiện nay là thực sự cần thiết Với luận văn “Nâng cấp động các thành phần
của hệ thống phân tán”luận văn sẽ tập trung nghiên cứu làm thế nào thể đáp ứng các
yêu cầu thay đổi của hệ thống phân tán mà vẫn đảm bảo cho hệ thống hoạt động bình thường và ổn định
Nội dung chính của luận văn được trình bày trong 4 chương Chương 1 giới thiệu chung về việc nâng cấp Chương 2 tìm hiểu các thực trạng nâng cấp và nghiên cứu các thành phần để nâng cấp tự động hệ thống phân tán Chương 3 hướng đề xuất cho việc nâng cấp động hệ thống phân tán Chương 4 thực nghiệm và mô phỏng hướng đề xuất Phần kết luận tóm tắt kết quả đã đạt được và hướng phát triển tiếp theo của luận văn
Trang 6CHƯƠNG 1 GIỚI THIỆU
Chương đầu của luận văn sẽ giới thiệu chung nhấtnhu cầu thực thế của việc nâng cấp tự động cho các hệ thống phân tán hiện nay, cũng như mục đích, yêu cầu, các thách thực khi nâng cấp với các hệ thống thực tế hiện nay, và đưa ra bài toán, hướng giải quyết việc tự động nâng cấp hệ thống phân tán trong luận văn này
1.1 Giới thiệu chung
Các dịch vụ hiện nay đang ngày phát triển với quy mô rộng lớn, luôn thay đổi phù hợp với những thách thức và yêu cầu đặt ra.Chẳng hạn như các dịch vụ trên Internet (ví dụ, máy tìm kiếm, trò chơi trực tuyến, thanh toán trực tuyến, emai) luôn thường xuyên phải quản lý số lượng lớn các dữ liệu có giá trị, thường xuyên thay đổi phù hợp với nhu cầu thường trực của khách hàng[16] Để cung cấp các dịch vụ đó yêu cầu hệ thống gồm hàng trăm ngàn máy móc, các trung tâm xử lý dữ liệu khác nhau, thường xuyên phục vụ các yêu cầu gửi nhận của khách hàng và cũng có thể bị tấn công hay lỗi phần cứng, phần mềm và gây ra nhiều thiệt hại nghiêm trọng không lường trước Trước tình hình đó, các phần mềm của hệ thống này luôn cần nâng cấp hiện thờiđể có thể chịu lỗi, thêm các tính năng mới và cải thiện hiệu suất nhưng vẫn đảm bảo đáp ứng liên tục các dịch vụ đang cung cấp
Các yêu cầu đặt ra khi nâng cấp hệ thống cần đảm bảo các dịch vụ đang cung cấp của hệ thống không bị ngưng, các thành phần phải đồng đều và biết mối quan hệ giữa các phiên bản [17] Các phiên bản mới cho phép không được tương thích với các phiên bản cũ Bởi hiện tại vẫn còn một vài phiên bản cũ khác của hệ thống vẫn phải tiếp tục
hỗ trợ Và đặc biệt khi nâng cấp các trạng thái trong các nút vẫn đảm bảo các trạng thái khác hoạt động bình thường để cung cấp các dịch vụ hiện thời
Quá trình nâng cấp là rất khó khăn đối với các hệ thống, đặc biệt là các hệ thống phân tán, thường đòi hỏi cung cấp dịch vụ liên tục Có rất nhiều thách thức cũng như nhiều yêu cầu được đưa ra để giải quyết tốt vấn đề này Trong một hệ thống ta không thể nâng cấp tất cả các nút trong cùng một thời điểm, vì mỗi lần nâng cấp ta cần xác
Trang 7định và định nghĩa lại lịch trình khi nâng cấp các nút, hay các nút đang chạy phiên bản khác nhau vẫn có thể cần phải tương tác với nhau để hoàn thành nốt những yêu cầu nào đó
1.2 Yêu cầu, thách thức hiện tại
Trước những nhu cầu và thực trạng thực tế đòi hỏi, khi nâng cấp hệ thống phân tán cần đảm bảo một số các yêu cầu sau:
Thứ nhất là tính đơn giản, nghĩa là mô hình nâng cấp cần phải dễ sử dụng, cần phải biết mối quan hệ giữa các phiên bản khi nâng cấp xẩy ra
Tiếp theo cần phải đảm bảo tính tương thích, các phiên bản mới cho phép phải được tương thích với các phiên bản cũ, bởi trong thời gian nâng cấp, một vài phiên bản khác của hệ thống vẫn phải tiếp tục hỗ trợ và cung cấp dịch vụ cho các yêu cầu đang thực thi Do vậy hệ thống phải luôn đảm bảo các dịch vụ xuyên suốt trong quá trình nâng cấp
Trên thực tế, các hệ thống phân tán hiện nay có rất nhiều các nút và được đặt rải rác ở nhiều vị trí Do vậy để đảm bảo cho việc nâng cấp nhanh chóng, không tốn nhiều công sức, thời gian và tiền bạc thì quá trình nâng cấp nên tự động triển khai không cần nâng cấp bằng tay tại từng nút Nghĩa là khi một nâng cấp được định nghĩa tại một vị trí trung tâm, thì từ đó hệ thống nâng cấp sẽ tự động lan truyền nhận biết việc nâng cấp, sau đó tải các tệp tin và tự động cài đặt trên các nút khác trên cùng hệ thống Cuối cùng khi nâng cấp luôn cần kiểm soát các quá trình triển khai Các trình nâng cấp phải có khả năng kiểm soát khi các nút nâng cấp với độ chính xác giống như khi nâng cấp bằng tay từng nút Để tránh trường hợp xẩy ra lỗi lan truyền và đồng thời không nhận biết được nút nào nâng cấp thành công hay lỗi
Chính từ những yêu cầu thực tế trên nhận thấy quá trình nâng cấp động tương đối khó khăn và có nhiều thách thức như:
Không thể nâng cấp đồng thời các nút cùng một lúc
Một nút có thể chạy trên nhiều hơn một phiên bản hay không?
Trang 8 Đảm bảo nâng cấp luôn đáng tin cậy mọi thời điểm hay không?
Để khắc phục những khó khăn trênmột cách triệt để là tương đối khó thực hiện
Do vậy để quá trình nâng cấp diễn ra thành công và luôn đảm bảo những yêu cầu đặt
ra, trong luận văn này tôi sẽ đưa ra hướng giải quyết sẽ trình bầy chi tiết ở các phần
tiếp theo của luận văn
1.3 Hướng đề xuất
Từ những yêu cầu và thách thực thực tế đặt ra ở trên, trong khuôn khổ luận văn
này, mục tiêu chính là hỗ trợ việc nâng cấp tự động các thành phần của hệ thống phân
tán và cho phép hệ thống vẫn cung cấp đầy đủ các dịch vụ trong quá trình nâng cấp
Để nâng cấp thành công yêu cầu hệ thống cần đảm bảo những yêu cầu sau:
Nâng cấp lan truyền từ một nút tới các nút tiếp theo;
Nâng cấp tự động tại mỗi nút;
Hệ thống vẫn cần phải cung cấp dịch vụ khi khác nút khác chạy với phiên
bản khác nhau
Khi một nút nâng cấp thành công, các nút đang trỏ tới đó sẽ theo lịch trình lan
truyền để nâng cấp động tại các nút tiếp theo Tại mỗi nút sẽ thực hiện cơ chế tự nhận
biết có phiên bản mới và tự tải các tệp tin theo đúng lịch trình Để đảm bảo trong quá
trình nâng cấp các dịch vụ vẫn đảm bảo và đáp ứng đầy đủ khi các nút chạy với các
phiên bản khác nhau cần có các đối tượng mô phỏng các phiên bản trước và sau đó
Trang 9CHƯƠNG 2 NGHIÊN CỨU LIÊN QUAN
Chương này luận văn sẽ trình bày về một vàinghiên cứu trong việc nâng cấp tự động cho hệ thống phân tán đã nghiên cứu trước đó Từ những nghiên cứu đó luận văn
sẽ đưa ra những điểm làm được và chưa làm đượcđể làm tiền đề để giải quyết bài toán trong luận văn này
2.1 UpgradeJ
Đây là một kỹ thuật mà khi một chương trình chạy vẫn có thể được cập nhật các
mã mới và dữ liệu vào [10] Các tính năng chính của UpgradeJ là đáp ứng chương trình với sự tồn tại nhiều phiên bản của lớp, nâng cấp lớp động, và một mở rộng tự nhiên của hệ thống Java để hỗ trợ phiên bản và gia tăng kiểm soát kiểu
UpgradeJ cho phép các lớp trong hệ thống có thể cập nhật với phiên bản mới tự động Lệnh nâng cấp được bắt đầu bởi bởi lệnh: upgrade
Một số kí hiệu hỗ trợ nâng cấp
Kí hiệu “exact”, =, tạo nguyên thể lớp tất cả việc nâng cấp
Kí hiệu “upgradeable”, +, nâng cấp hiệu chỉnh của lớp
Kí hiệu “latest”, ++, nâng cấp mới nhất của sự tiến hóa của một lớp
UpgradeJ hỗ trợ 3 hình thức nâng cấp: New class upgrade, Revision upgrade, Evolution upgrade
New class upgrade, cho phép định nghĩa lớp mới thêm vào (trong thời gian
chạy) vào bảng lớp hiện tại Nâng cấp thêm lớp mới là một cơ chế cho phép thêm các tính năng mới vào hệ thống
new class AnimatedButton[1] extends Button[1] {
Object fancyPress() {
this.press(); }
}
Trang 10Revision upgrade, cho phép định nghĩa một phiên bản mới của lớp để thay thế
một định nghĩa lớp hiện có, chỉ trong thân chương trình Nâng cấp sửa đổi là một cơ chế để thực hiện sửa lỗi khi xẩy ra trong hệ thống
class Button[1] extends Object {
Hình 2.1 Thể hiện sơ đồ lớp cho thấy các phiên bản nâng cấp một cách rõ ràng,
và sửa đổi các mối quan hệ với một mũi tên lượn sóng Ba phiên bản của lớp Button được thể hiện như sau:
Trang 11Hình 2.1 Revision upgrade
Evolution upgrade, cho phép định nghĩa một phiên bản mới của lớp để thay thế
một định nghĩa lớp cũ Có thể thêm thuộc tính và phương thức Nâng cấp tiến hóa cung cấp sự hỗ trợ cho việc phá vỡ thay đổi hiện thời
new class Button[6] extends Object evolves Button[3]
Trang 12dụng cho các chương trình Java và không ghi lại được mức độ cập nhật giữa các đối tượng
2.2 Sử dụng kĩ thuật tái cấu trúc ngăn xếp
Kĩ thuật này được trình bày kĩ trong bài báo của Kristis Makris and Rida Bazzi [14], nó áp dụng cho các chương trình có nhiều vòng lặp lồng nhau, các hàm đệ quy, ứng dụng đa luồng Nó đảm bảo tất cả các hàm gọi trong ngăn xếp đều được nâng cấp trong cùng một thời điểm, do đó loại bỏ việc chờ đợi đối với các điểm nghỉ khi xuất hiện Hệ thống nâng cấp, UpStare, biên dịch các ứng dụng đặc biệt với khả năng xây dựng lại ngăn xếp và không phụ thuộc mã nguồn tĩnh các kiểu phân tích Thêm vào
đó, nó cho phép tiếp tục thực thi các tiến trình từ một thuật toán khác mạnh hơn trong khi sử dụng lại trạng thái chương trình đang tồn tại Với kĩ thuật tái cấu trúc ngăn xếp chương trình viết bằng C được chuyển đổi ở cấp mã nguồn trong khi vẫn giữ ngữ nghĩa thực hiện
Kĩ thuật này cho phép cập nhật tại hầu hết các điểmngay mà không cần chờ đợi tới lượt nâng cấp Đồng thời nó phù hợp khi nâng cấp với những chương trình có tính tương đồng về thuật toán có cùng các hành vi
Trang 13Hình 2.3 Kiến trúc hệ thống UpStare
Hình 2.3 [14] thể hiện một chương trình được biên dịch khi nâng cấp hệ thống, liên kết lặp lại khi câp nâng cấp động trong thời gian chạy và bắt đầu Với một phiên bản mới hơn, bộ phát triển sẽ tạo ra một bản cập nhật tự động vào nguồn được biên dịch và áp dụng để thực thi trực tiếp thông qua một kết nối TCP
Với kĩ thuật tái cấu trúc ngăn xếp việc nâng cấp hệ thống được thực hiện trong hai bước chính Trước tiên, ánh xạ tái cấu trúc ngăn xếp xác định trạng thái của ngăn xếp cũ được ánh xạ như thế nào tới trạng thái ngăn xếp mới và kiểu dữ liệu cũ được ánh xạ như thế nào tới kiểu dữ liệu mới.Sau đó tiếp tục việc thực thi các chương trình, tại bước này việc ánh xạ tiếp tục thực thi sẽ xác định trạng thái của các hàm hoạt đang hoạt động được ánh xạ tới phiên bản mới của hàm đó Ánh xạ có thể sơ đồ các hàm từ phiên bản cũ lên phiên bản mới với các thuật toán khác nhau
Tái cấu trúc ngăn xếp hoàn thành thực hiện một số mục tiêu chính như sau: Trước tiên, nó cần phải lưu trữ trạng thái trong ngăn xếp hiện tại khi gỡ bỏ hay phục hồi nâng cấp khi xây dựng lại Không giống như quá trình kiểm tra các điểm của tiến
Trang 14trình khi thực hiện, ngăn xếp được lưu trữ và phục hồi tạm dừng các tiến trình Nó hỗ trợ lưu trữ và khôi phục các khung ngăn xếp, biến cục bộ của hàm được nhóm lại xác định rõ ràng trong cấu trúc mới Đoạn mã phía dưới sẽ xác định rõ lưu trữ khung ngăn xếp được thực hiện như thế nào?
} goto functionB_6_before;
}
}
Việc nâng cấp phần mềm động sử dụng kĩ thuật tái cấu trúc ngăn xếp đảm bảo rằng cập nhật tự động có thể được áp dụng ngay lập tức, bất cứ lúc nào trong suốt quá trình thực hiện, bao gồm cả các cơ chế đa luồng lồng nhau tồn tại lâu trong vòng lặp, các chương trình gọi đệ quy Ngoài ra, nó tiếp tục thực hiện cơ chế cho phép để tiến hành thực thi từ một thuật toán khác nhau trong khi tái sử dụng trạng thái chương trình hiện thời
2.3 Xây dựng lớp động cho đối tượng tương tranh không đồng bộ
Kĩ thuật trình bày trong [9] là một cơ chế nâng cấp lớp động, cho phép kế thừa các lớp được nâng cấp trong hệ thống mà đối tượng sẽ phù hợp cho việc nâng cấp trong thời gian chạy, như việc đóng gói để phân biệt rõ ràng giữa cấu trúc bên trong và
Trang 15dịch vụ bên ngoài Như vậy các đối tượng hiện tại của lớp nâng cấp và các lớp con của
nó được phát triển trong thời gian chạy Cơ chế này được tích hợp trong Creol [7], một ngôn ngữ lập trình bậc cao, dành cho các ứng dụng phân tán bằng biện pháp kết nối đối tượng tương tranh bởi phương thức gọi không đồng bộ Nâng cấp 1 lớp tác động tới tất cả thể hiện của lớp định nghĩa lại và của các lớp con Hơn nữa, tất cả sự tồn tại của đối tượng là thể hiện của lớp và các lớp con của nó khi nâng cấp
Đối tượng tương tranh có bộ xử lý riêng, có thể đánh giá việc xử lý cục bộ, tức là
mã chương trình với các điểm nhả xử lý Xử lý có thể hoạt động, phản ánh hành vi bắt đầu vào thời điểm tạo bởi chạy phương thức, hoặc hoạt động lại, tức là đáp trả phương thức được gọi do các điểm nhả xử lý, ước lượng việc xử lý có thể được chen vào Giá trị của biến chương trình một đối tượng có thể phụ thuộc không xác định chen vào của việc xử lý Bởi vậy thể hiện của phương thức có thể là những biến cục bộ bổ sung thêm vào biến của đối tượng, đặc biệt giá trị của các biến hình thức được lưu trữ cục
bộ đối tượng có thể bao gồm một vài thể hiện (chưa xử lý) của một vài phương thức,
có thể với giá trị khác của biến cục bộ
Tất cả các đối tượng tương tác xẩy ra trong gọi phương thức Một phương thức
có thể được gọi trong hai cách đồng bộ hoặc không đồng bộ Khi một tiến trình gọi phương thức không đồng bộ, một tiến trình có thể tiếp tục các hoạt động của nó khi nó yêu cầu đáp trả lời gọi hoặc nó được trì hoãn khi tới điểm nhả xử lý trong mã nguồn của nó Không đồng bộ thiết lập gọi phương thức có thể luôn được phát ra, như nhận đối tượng không thể khóa liên kết Vượt phương thức cho phép được: nếu các phương thức đưa ra bởi việc đối tượng được gọi theo một thứ tự, đối tượng có thể bắt đầu ước lượng thể hiện của phương thức trong một thứ tự khác
Gọi phương thức không đồng bộ trong [9] được thực hiện với câu lệnh t!x.m(E), trong đó t Label cung cấp bởi lời gọi hàm cục bộ duy nhất, x là biểu thức của đối tượng, m là tên phương thức, và E là tập hợp biểu thức với những tham số hiện thời được bổ sung phương thức đang thực thi Label xác định việc gọi và có thể bị bỏ qua nếu đáp trả không rõ ràng với yêu cầu Giá trị trả về từ việc gọi xác định, biểu diễn trong danh sách biến V, bởi câu lệnh t?(V) Câu lệnh này xem như V là danh sách biến
Trang 16đặc trưng [1]: nếu trả lời được mang về, giá trị trả về được gán trong V và tiếp tục ước lượng Trong trường hợp lựa chọn lời gọi cục bộ, tức là khi giá trị của x được hiểu là đối tượng this, xử lý được nhả cho bắt đầu ước lượng của việc gọi Bên cạnh đó, ước lượng xử lý được khóa Thứ tự hủy bỏ việc chặn trong lựa chọn không đồng bộ, điểm nhả xử lý được mở đầu với yêu cầu đáp trả: nếu không có đáp trả tới, ước lượng bị trì hoẵn nhiều hơn bị chặn
Phương thức gọi đồng bộ (RPC), ngay lập tức chặn xử lý trong khi đợi sự trả lời, được viết p(E;V), đây là viết nhanh từ t!p(E);t?(V), trong đó t là nhãn của biến Ngôn ngữ không hỗ trợ việc đồng bộ lẫn nhau có thể vì thế dẫn tới tắc nghẽn
Guards: g trong lệnh await g khai báo rõ ràng cho điểm nhả xử lý Khi một Guards nó ước lượng giá trị false gặp suốt trong ước lượng tiến trình, tiến trình bị trì hoãn và nhả xử lý Sau nhả xử lý, bất kì tiến trình chưa xử lý có thể lựa chọn cho ước lượng Kiểu Guards được định nghĩa như sau:
– wait Guard (điểm nhả xử lý),
– t? Guard, trong đó t Label,
– b Guard, trong đó b là biểu thức logic cục bộ và trạng thái đối tượng,
– g1 g2 và g1 g2, trong đó g1,g2 Guard
Sử dụng wait sẽ luôn nhả xử lý Trả lời guard t? cho phép nếu trả lời việc gọi nhãn t được tới, đánh giá của trạng thái guard là nguyên tử Chúng ta cho phép await g t?(V) viết tắt await g t?;t?(V) và cho phép await p(E; V), trong đó p là một phương thức gọi (bên ngoài hoặc bên trong), viết ngắn gọn t!p(E); await t?(V) cho một số nhãn
t
Lệnh có thể bao gồm việc phản ánh các yêu cầu luồng điều khiển đối tượng nội
bộ Cho phép S1 và S2 kí hiệu danh sách các lệnh Nâng cấp danh sách lệnh là luôn có thể Thành phần tuần tự có thể đưa vào guard: await g là điểm nhả trong S1; await g; S2 Không xác định chọn S1, S2 có thể chọn S1 một lần S1 được kích hoạt hoặc S2
Trang 17một lần S2 được kích hoạt, và bị trì hoãn nếu cả hai nhánh được kích hoạt Không xác định kết sắp S1|||S2 biểu thị lệnh S1 và S2 trong một số thứ tự xen kẽ và kích hoạt Ngoài ra còn có tiêu chuẩn xây dựng cho lệnh if và phương thức gọi bên trong, bao gồm gọi đệ quy Lưu ý rằng với mục đích nâng cấp năng động, gọi đệ quy thay thế vòng lặp trong ngôn ngữ Gán cho các biến địa phương và các đối tượng được thể hiện như V:=E cho cho một danh sách phân chia của biến chương trình V và danh sách một biểu thức E, kết hợp các loại Các tham số như this, label, và caller là biến chỉ đọc Với điểm nhả, đối tượng không cần block trong khi đợi trả lời Hướng đề xuất này mềm dẻo hơn với những biến đặc trưng: trì hoãn xử lý hoặc gọi phương thức mới
có thể biểu thị trong khi đợi Nếu phương thức gọi không bao giờ trả lời, tắc nghẽn là tránh được như các hoạt động khác trong đối tượng có thể Tuy nhiên, khi trả lời tới, việc tiếp tục quá trình này phải hoàn thành với các quá trình khác đang chờ và được kích hoạt
Ngôn ngữ Creol cung cấp cơ chế cho đa kế thừa [8] ở đó tất cả các thuộc tính và phương thức của superclass được kế thừa bởi lớp con, và ở đó phương thức của các superclass có thể được định nghĩa lại Kế thừa lớp được khai báo bởi từ khóa inherits; tức là, một danh sách của tên lớp C(E) trong đó E cung cấp tham số của lớp hiện thời
Ta thấy rằng phương thức và thuộc tính được định nghĩa phía trên lớp C nếu nó được khai báo trong C hoặc ít nhất 1 lớp kế thừa bởi C Gọi bên trong được thực thi trong việc gọi và có thể Kĩ thuật này giới thiệu cú pháp t!m@C(E) cho gọi không đồng bộ
và m@C(E; V) cho gọi nội tại đồng bộ của phương thức trên C trong đồ thị kế thừa từ
C hoặc lớp con của C Việc gọi có thể kết nối với lớp xác định của đối tượng this, vì vậy được gọi static Ngược lại có thể gọi bên ngoài với @, được gọi ảo, cần xác định lớp hiện thời gọi trong thời gian chạy có thứ tự kết nối việc gọi Do đó, một phương thức khai báo trong lớp C có thể truy cập duy nhất thuộc tính khai báo trên C Trong lớp con, thuộc tính x của một superclass C bị truy cập bởi khả năng liên quan x@C
Cú pháp dưới đây định nghĩa phương thức điển hình cho mỗi thể loại Với S, V, E biểu thị cú pháp các danh sách, tập hợp, hoặc multisets cho từng loại, tùy thuộc vào ngữ cảnh
Trang 18| t!p(E) | !p(E) | p(E;V) | t?(V)
| await g | await g t?(V) | await p(E;V)
Kết nối ảo Khi một phương thức gần như được gọi trong một đối tượng o của lớp C, khai báo một phương thức được định danh trong đồ thị kế thừa của C và kết nối (ràng buộc) để gọi Để đơn giản, lời gọi được kết nối với các phương thức định nghĩa kết hợp đầu tiên ở đỉnh C trong đồ thị kế thừa, trong một lệnh đầu tiên bên trái sâu đầu tiên Giả sử cho một mối quan hệ kiểu thuộc kiểu con như là một phản xạ từng phân của kiểu với lệnh , bao gồm giao diện Kiểu dữ liệu duy nhất kiểu con của kiểu dữ liệu và giao diện (interface) có thể có duy nhất kiểu con của giao diện Nếu T T’ khi
đó bất kì giá trị nào của T có thể giả danh như giá trị của T’ Kiểu con của bộ kiểu dữ liệu là mở rộng theo từng phần của mối quan hệ kiểu con: T T’ nếu bộ T và T’ có chiều dài giống nhau l và Ti T’i cho mỗi i (0 ) và kiểu Ti và T’i cùng vị trí I
ở T và T’ Giải thích về kiểu và kết nối của phương thức, kiểu con là mở rộng của không gian hàm , trong đó A và B là bộ kiểu:
A→B A’→B’ = A A’ B’ B
Phân tích tĩnh cho lời gọi bên trong m (E; V) sẽ chỉ định kiểu duy nhất cho các tham số vào và ra tùy thuộc vào ngữ cảnh văn bản Nói cách khác các tham số hiện thời khai báo theo ngữ cảnh như E: TE và V: TV Lời gọi là type correct nếu đó là phương thức khai báo m: A→B phía trên lớp C như là TE → TV A → B Kết nối
Trang 19không đồng bộ gọi t!m(E) với thay thế t?(V) hoặc await t?(V), được điều khiển như phù hợp với lời gọi đồng bộ m(E; V)
Trong thời gian chạy đối tượng thực hiện lời gọi bên trong m: TE → TV sẽ là của lớp con C’ của C và cơ chế kết nối ảo sẽ kết nối tới khai báo của m: A’→B’ như vậy mà TE→TV A’→B’, lấy m đầu tiên như phía trên C’ Bởi vì C được kế thừa bởi C’, kết nối ảo được đảm bảo thành công Mở rộng lời gọi t!o.m(E) là kết nối thực sự trong đỉnh của đồ thị lớp định danh động của o Với điều kiện là khai báo giao diện của o hỗ trợ kí hiệu đối tượng, kết nối thành công đảm bảo cho bất kì một nguyên thể nào của lớp kiểu chính xác thực thi giao diện
Thay đổi hệ thống được giải quyết thông qua một cơ chế để nâng cấp lớp, cho phép các đối tượng hiện tại và tương lai của lớp nâng cấp và các lớp con của nó để phát triển Một lớp có thể chịu một số nâng cấp Trong nâng cấp, thuộc tính mới, phương pháp, và siêu lớp có thể được thêm vào một định nghĩa lớp, và các phương thức cũ có thể được sửa đổi Để cho phép thể hiện của phương thức cũ phát triển một cách an toàn và tránh các kiểu lỗi thời gian chạy, không có các thuộc tính, phương thức, hoặc các lớp kế thừa có thể được gỡ bỏ một phần của nâng cấp lớp Mặc dù hạn chế hơn, các nghiên cứu thực nghiệm cho thấy bổ sung và xác định lại dịch vụ đến nay hình thức phổ biến của sự tiến hóa phần mềm hơn so với loại bỏ[9]
Các thuộc tính có thể được thêm vào Các thuộc tính mới có thể được thêm vào một lớp Việc bổ sung một thuộc tính mới có cùng tên như là một thuộc tính đã được xác định trong lớp học không được phép Việc bổ sung một thuộc tính có tên giống như một thuộc tính kế thừa được cho phép Các thể hiện của lớp sau đó sẽ có cả hai thuộc tính, được truy cập bằng tên tiêu chuẩn.Như tên thuộc tính được tĩnh mở rộng vào tên tiêu chuẩn, mã cũ sẽ tiếp tục sử dụng các thuộc tính giống như trước khi nâng cấp
Các phương thức có thể được thêm hoặc định nghĩa lại Kĩ thuật này xem xét tác động của việc thêm hoặc định nghĩa lại một phương thức trong một lớp C đối với các lớp con và siêu lớp của C Nếu một phương thức là định nghĩa lại trong C, mã phương
Trang 20thức là thay thế trong tất cả các thể hiện của C và định nghĩa phương thức cũ không còn nữa Điều này dẫn đến một quy tắc kiểu con cho định nghĩa lại phương thức để đảm bảo rằng ảo liên kết thành công Do đó, chúng tôi cho phép cấu trúc dữ liệu nội
bộ của phương thức phải được thay thế, nhưng đối với hiệp phương sai và xác định lại hiệp phương sai là cần thiết cho phương thức của tham biến trong và ngoài tương ứng Nếu một phương thức được thêm vào một lớp, đảm bảo ràng buộc ảo cho các lời gọi cũ là đúng kiểu mà không đặt bất kỳ hạn chế về phương thức mới Tất cả các loại quá tải các phương thức kế thừa được cho phép, bao gồm cả quá tải đối với tham số trong hay ngoài Đối với các khai báo phương thức với cùng một số tham số trong và ngoài quá tải có thể là đối với các kiểu tham số, có thể chỉ cho tham số ngoài Nếu một phương thức m được thêm vào C và m là đã định nghĩa trước trong một lớp cha C’của
C, định nghĩa mới trong C sẽ ghi đè lên (và ẩn) các m phương thức kế thừa của C’ theo nghĩa là một cuộc gọi mà phù hợp cả hai định nghĩa sẽ bị ràng buộc khác nhau sau khi nâng cấp Phương thức siêu lớp vẫn còn có sẵn của các lời gọi tĩnh m@C’ Ràng buộc
ảo đảm bảo rằng cuộc gọi đúng kiểu trước khi nâng cấp lớp vẫn còn đúng kiểu Nếu một phương thức m được thêm vào C và m là đã định nghĩa trước trong một lớp con C’’ của C, ghi đè lên một mối quan hệ mới sẽ được giới thiệu Tuy nhiên, kết nối ảo đảm bảo đúng kiểu của lời gọi cũ cũng như các lời gọi hầu như bị ràng buộc của lớp nâng cấp Việc bổ sung một phương thức để một lớp C không cần phải được giới hạn bởi định nghĩa trong lớp con va lớp cha của C
Siêu lớp (superclasses) có thể được thêm vào Nếu một lớp C được thêm vào như
là một siêu lớp trong nâng cấp lớp, các thuộc tính và phương thức định nghĩa tại C và siêu lớp của nó trở nên có sẵn Các cơ chế ràng buộc các thực hiện theo một thứ tự left-first depth-first, do đó thứ tự của danh sách các lớp kế thừa là rất quan trọng: để giảm thiểu tác động của superclasses mới trên cơ chế ràng buộc ảo, các siêu lớp mới được thêm vào cuối danh sách thừa kế
Chúng ta hãy xem xét việc nâng cấp động qua một ví dụ Nâng cấp được sử dụng
để thêm một dịch vụ mới cho một lớp hiện có, với các hiệu ứng hiển thị cho người dùng của lớp này, và để thay đổi một giao thức truyền thông trong thời gian chạy, để
Trang 21tăng hiệu suất hệ thống một cách rõ ràng.Xem xét một tài khoản ngân hàng của giao diện Account, với phương thức đối với tiên gửi và tài khoản giao dịch, như vậy giao dịch cần phải đợi cho đến khi tài khoản có đủ tiền
Version 1
class BankAccount implements Account
beginvar bal : Int = 0
with Any
op deposit (in sum : Nat) == bal := bal+sum
op transfer (in sum : Nat, acc : Account ) ==
await bal ≥ sum ; bal := bal−sum; acc.deposit(sum) end
Nâng cấp lớp động cho phép thêm các dịch vụ mới của ứng dụng mà không cần dừng hệ thống Chúng tôi xem xét việc thêm điều khiện rút quá số tiền gửi Nâng cấp lớp BankAccount sẽ thêm phương thức overdraft_open như một đối tượng hỗ trợ giao diện Banker có thể thiết lập nhiều nhất quá số tiền gửi cho tài khoản Phương thức giao dịch này sẽ nâng cấp để có thêm điều kiện mới này vào tài khoản
Version 2
upgradeclass BankAccount
beginvar overdraft : Nat = 0
with Any
op transfer (in sum : Nat, acc : Account) ==
await bal ≥ sum−overdraft; bal := bal−sum; acc.deposit(sum)
Trang 22Với kĩ thuật nâng cấp này, có tác dụng triệt để trên các lớp con và các thể hiện của nó Việc nâng cấp này cho phép thêm các thuộc tính mới, phương thức mới, các lớp mới trong khi vẫn tồn tại phương thức cũ có thể định nghĩa lại Nhưng vẫn chưa giải quyết được nâng cấp các lớp kế thừa
Trang 23CHƯƠNG 3 PHƯƠNG PHÁP NÂNG CẤP ĐỘNG CHO HỆ THỐNG
PHÂN TÁN
Trong chương này, luận văn sẽ trình bầy phương pháp luận nâng cấp tự động các thành phần của hệ thống phân tán, và nghiên cứu các thành phần của hệ thống phân tán
3.1 Hệ thống phân tán
Hệ phân tán là một tập hợp các máy tính độc lập được sử dụng một cách kết hợp
để thực hiện một tác vụ đơn hoặc để cung cấp một dịch vụ đơn Hệ phân tán thể hiện dưới nhiều kiến trúc khác nhau [8]: Kiến trúc client – server, kiến trúc peer to peer, kiến trúc lai,
Hình 3.1 Kiểu phân chia chức năng giữa Client và Server
Hình 3.1 thể hiện kiến trúc phân chia chức năng giữa Client và Server Hình (a) giao diện người dùng nằm cả hai phía client và server, mọi yêu cầu đều được
xử lý phía Server Tương tự như vậy, việc xử lý các chức năng ở phía server được giảm thiểu, được xử lý cả phía client
Trang 24Hình 3.2 Kiến trúc ngang hàng
Mô hình hệ thống phân tán là tập hợp các đối tượng giao tiếp với nhau bằng cách chia sẻ bộ nhớ hay truyền thông điệp [2] Với nhiều dạng liên lạc khác nhau, ví dụ như liên lạc hướng điều khiển: truyền điều khiển theo thông điệp, mô hình hệ thống xây dựng bằng cách gọi hàm từ xa (RPC) hay gọi phương thức từ xa (RMI) Khi đó mỗi phần trạng thái đối tượng (mỗi đối tượng là một thể hiện của một lớp) có thể nằm trên đĩa hoặc nằm trên một nút khác Các nút khác nhau có khả năng chạy các lớp khác nhau Đa phần các đối tượng không bao giờ mất hoàn toàn trên hệ thống, nó có thể phục hồi trên các vị trí khác nhau
Với cách thức liên lạc bằng cách gọi hàm từ xa (RPC - Remote Procedure Call) Đây là cách thức thay thế mô hình truyền thông điệp kiểu input/output bằng cách chạy một lời gọi hàm tại một máy ở xa bằng cách:
Đồng bộ - block khi gửi thông điệp gọi hàm
Ứng dụng không cần biết chi tiết truyền thông điệp
Dùng các tham số lời gọi hàm để truyền dữ liệu
Client gọi hàm stub địa phương, stub thực hiện việc truyền thông điệp và đóng gói dữ liệu (marshalling)
Dùng cơ chế gọi hàm để che dấu liên lạc giữa bên gọi và bên được gọi
Trang 25Cách liên lạc này có thể bị lẫn giữa thao tác địa phương và thao tác trên máy ở
xa
Hình 3.3 Liên lạc bằng phương thức gọi hàm từ xa RPC
Hình 3.3 thực thi ở phía client bằng cách: Client gọi client stub Stub dựng thông điệp; gọi hệ điều hành địa phương HĐH gửi thông điệp tới HĐH ở xa HĐH ở xa chuyển thông điệp cho server stub Stub tháo gỡ các tham số và gọi server Ở phía server: Server trả kết quả cho stub Stub dựng thông điệp; gọi HĐH HĐH gửi thông điệp cho HĐH của client HĐH của client chuyển thông điệp cho client stub Stub tháo
dỡ kết quả và trả về cho client
Sự chuyển dịch từ RPC tới RMI (gọi phương thức từ xa) là sự chuyển dịch từ tư tưởng server sang tư tưởng đối tượng Với RPC: phải chỉ định tường minh server của hàm cần gọi, server lưu thông tin trạng thái của client Trong khi đó RMI: đích là một đối tượng cụ thể, thông tin trạng thái được đóng gói trong đối tượng đích Các đối tượng là các “công dân” hạng nhất trong RMI: tham chiếu tới đối tượng có thể được truyền dưới dạng tham số; Có thể được trả về dưới dạng kết quả của phương thức; Giải quyết vấn đề dữ liệu con trỏ của RPC Nhưng RMI và đối tượng phân tán là mô hình được sử dụng rộng rãi hiện nay