Trong nhiều trường hợp, hai hay nhiều dữ liệu được cập nhật, cần chắc chắn rằng những dữ liệu khác cũng được cập nhật. Một ví dụ là nếu một tài khoản chuyển
tài khoản nhận cũng phải được tăng lên với số tiền tương ứng. Các chương trình thực thi nhiệm vụ này cần phải đảm bảo rằng: khi một thao tác (cộng hoặc trừ tiền tài khoản) phải được hủy bỏ nếu thao tác kia không thành công. Sử dụng hàng đợi thông điệp cho phép người thiết kế trì hoãn các thao tác cho tới khi sẵn sàng để thực thi cả hai thao tác cùng một lúc
Giữ tính ổn định của hệ thống khi có chuyển đổi
Trong thực tế, một hệ thống bất kỳ luôn cần thay đổi để thỏa mãn yêu cầu mới hoặc phù hợp với nghiệp vụ mới. Trong trường hợp này, một yêu cầu khó được đặt ra là duy trì tính ổn định của hệ thống trong quá trình thay đổi. Với hàng đợi thông điệp, chúng ta có thể sử dụng một số giải pháp sau đây để thực hiện yêu cầu đó:
Giả sử trong ví dụ về hai mươi câu hỏi ở trên, chúng ta có một chương trình để trả lời hai mươi câu hỏi đó, trong khi chúng ta không có mã nguồn của chương trình đó. Chương trình thứ mười hai thay đổi, và chúng ta cải tiến đoạn mã trả lời câu hỏi đó.
20 câu hưi
Hư thưng đang
tưn tưi
Trư lưi câu hưi
bư thay đưi
1 - 11 13 - 20
12
Hình 7: Thay đổi chƣơng trình
Chúng ta sẽ viết một chương trình mới chỉ trả lời câu hỏi thứ mười hai, sau đó thay đổi chương trình tạo ra câu hỏi, chuyển việc truyền câu hỏi thứ mười hai về cho chương trình mới, sử dụng hàng đợi. Chúng ta có thể lặp lại kỹ thuật này cho tới khi toàn bộ câu hỏi được chuyển về chương trình mới.
Để thay đổi hoặc mở rộng chức năng cho một chương trình, chúng ta có thể viết một chương trình sử dụng hàng đợi thông điệp cùng tồn tại với chương trình đang có. Chương trình mới và cũ có thể cần được liên kết, nhưng không cần tạo thêm sự thay đổi nào.
Chúng ta có thể chọn ra một số điểm của hệ thống cần thay thế, thành phần giao tiếp tiến trình của hệ thống sử dụng hàng đợi thông điệp. Cách tiếp cận này có thể dẫn tới sự thay đổi về logic của hệ thống, vì
các chương trình của hệ thống có khả năng chạy độc lập với các chương trình khác trong hệ thống.
Chúng ta có thể thiết kế và xây dựng lại hệ thống hoàn toàn mới sử dụng hàng đợi thông điệp
2.1.6 Dễ dàng di chuyển và sử dụng lại mã chƣơng trình
Vì việc sử dụng hàng đợi thông điệp là sử dụng một giao thức giao tiếp độc lập, và có giao diện thống nhất trong mọi môi trường, các chương trình có thể dễ dàng di chuyển giữa các nút trong mạng, hoặc nhân bản tại các nút này, dễ dàng hơn với các chương trình sử dụng các phương thức giao tiếp khác
2.1.7 Khi nào sử dụng hàng đợi thông điệp
Ở trên, chúng ta đã chỉ ra rất nhiều lý do để sử dụng hàng đợi thông điệp trong kiến trúc khách – chủ. Trong phần này, chúng ta sẽ đưa ra một số trường hợp cụ thể mà nếu sử dụng hàng đợi thông điệp sẽ có rất nhiều lợi thế:
Lưu những dữ liệu không quan trọng trong hàng đợi khi hệ quản trị cơ sở dữ liệu bận phục vụ những ứng dụng khác hoặc xử lý những thông tin khác. Dữ liệu trong hàng đợi sẽ được lấy ra và xử lý khi cơ sở dữ liệu sẵn sàng. Ý tưởng này có thể được áp dụng khi hệ thống xử lý các yêu cầu thời gian thực ngay lập tức và lưu trữ các yêu cầu khác vào hàng đợi và xử lý sau đó.
Trường hợp yêu cầu một kết nối tới hệ quản trị cơ sở dữ liệu, tuy nhiên vì một vài lý do mà kết nối có thể không liên tục ở một vài thời điểm. Trong trường hợp này, chúng ta có hai cách để sử dụng hàng đợi thông điệp cho ứng dụng. Thứ nhất, chúng ta thiết lập cho ứng dụng truy cập vào cơ sở dữ liệu một cách thông thường, và khi kết nối vào cơ sở dữ liệu bị lỗi, các yêu cầu sẽ được đưa vào một hàng đợi. Hệ thống sẽ khởi động việc kiểm tra tính sẵn sàng của cơ sở dữ liệu. Khi cơ sở dữ liệu đã sẵn sàng, hàng đợi sẽ chuyển các yêu cầu tới cơ sở dữ liệu. Khi đó, hệ thống khôi phục lại trạng thái hoạt động bình thường và hệ thống có thể ngắt thành phần hàng đợi (và khởi động lại khi có lỗi kết nối sau đó). Cách thứ hai có thể là hệ thống sẽ chuyển toàn bộ yêu cầu từ ứng dụng
máy khách vào hàng đợi, việc chuyển yêu cầu tới ứng dụng máy chủ sẽ do hàng đợi thực hiện.
2.1.8 Lợi ích của hàng đợi thông điệp so với cơ sở dữ liệu
Khi sử dụng hệ quản trị cơ sở dữ liệu quan hệ, nó sẽ là các hệ thống đồng bộ hóa, trong khi sử dụng hàng đợi thông điệp, các ứng dụng là không đồng bộ hóa. Điều đó cũng có nghĩa truy cập vào hàng đợi thường sẽ nhanh hơn truy cập vào bảng của cơ sở dữ liệu quan hệ. Lý do là vì với các ứng dụng đồng bộ hóa, ứng dụng khách sẽ phải đợi đến khi máy chủ phản hồi, trong khi với các truy cập không đồng bộ hóa, sau khi truyền thông điệp tới máy chủ, ứng dụng khách sẽ tiếp tục xử lý mà không cần chờ đợi. Ngay khi máy chủ xử lý xong thông điệp đó, nó sẽ gửi kết quả cho máy khách.
Khi sử dụng hệ quản trị cơ sở dữ liệu, chúng ta sẽ phải tuân theo các chuẩn dữ liệu của hệ quản trị (mặc dù thông thường, các kiểu dữ liệu được hỗ trợ là tương đối phổ biến và đầy đủ). Tuy nhiên, nếu muốn thêm dữ liệu vào bảng mà kiểu dữ liệu này không được hỗ trợ là tương đối khó khăn. Trong khi nếu sử dụng hàng đợi thông điệp thì các yêu cầu về chuẩn dữ liệu là tương đối dễ dàng hơn.
2.3 Vòng đời của một thông điệp
Từ ý tưởng chung về một hàng đợi thông điệp, thực tế có rất nhiều cách cài đặt một hàng đợi thông điệp trên nhiều nền tảng công nghệ với thêm nhiều tính năng khác. Có rất nhiều hàng đợi thông điệp được phát triển bởi cách hãng danh tiếng như Microsoft Message Queuing, IBM Message Queue … Tuy nhiên, chúng ta sẽ xem xét một vòng đời đơn giản của một thông điệp trong mô hình hàng đợi.
Ban đầu, máy khách sẽ tạo ra một thông điệp. Tiến trình gửi sẽ đóng gói nội dung cần gửi thành một thông điệp, có thể lưu thêm một số thuộc tính như tên thông điệp, quyền truy cập thông điệp …, đồng thời gán thêm một số thông tin như địa chỉ, sau đó gửi cho thành phần chủ của hàng đợi thông điệp
Khi thông điệp đã được truyền tới thành phần chủ của hàng đợi thông điệp trên máy chủ, thành phần này sẽ định tuyến thông điệp này tới một tập hợp các hàng đợi trên máy chủ. Nếu máy chủ không thể định tuyến được một thông điệp, nó có thể sẽ xóa ngay thông điệp hoặc phản hồi lại cho chương trình khách. Thông thường, ứng dụng khách của hệ thống sẽ quyết định từ trước xem trong trường hợp này, thành
phần chủ của hàng đợi thông điệp sẽ xóa ngay hay phản hồi lại cho máy khách (ví dụ bằng cách thiết lập giá trị cho một thuộc tính nào đó của thông điệp)
Tùy theo mỗi cách cài đặt, một thông điệp có thể tồn tại ở một hoặc nhiều hàng đợi (máy chủ có thể quản lý bằng cách copy thông điệp hoặc sử dụng tham chiếu …) Dù có thể tồn tại trên nhiều hàng đợi nhưng thông điệp đó vẫn là hoàn toàn đồng nhất. Khi một thông điệp ở trong hàng đợi, hàng đợi sẽ cố gắng chuyển nó tới ứng dụng xử lý thông điệp đó. Nếu không được, hàng đợi sẽ lưu trữ thông điệp đó (trên bộ nhớ hoặc ổ đĩa) và đợi cho đến khi ứng dụng dùng để xử lý thông điệp là sẵn sàng. Sau đó, nó sẽ loại bỏ thông điệp đó (ra khỏi bộ nhớ, ổ đĩa). Việc loại bỏ này có thể được thực hiện ngay lập tức hoặc sau khi tiến trình xử lý thông điệp thông báo nó đã xử lý thành công thông điệp đó.
2.4 Quá trình kết nối
Hàng đợi thông điệp là một giao thức để truyền tin giữa ứng dụng khách và ứng dụng chủ. Quá trình kết nối từ chương trình khách tới chương trình chủ của hệ thống hàng đợi thông điệp như sau:
Khởi đầu, chương trình khách mở một kết nối TCP/IP tới chương trình chủ. Đồng thời nó cũng gửi thông tin về phương thức tới chương trình chủ. Chương trình chủ phản hồi lại thông tin về phiên bản giao thức của nó và một số thông tin khác như danh sách các cơ chế bảo mật mà nó hỗ trợ. Nhận được các thông tin này, chương trình khách sẽ lựa chọn một cơ chế bảo mật phù hợp với nó và thông báo cho chương trình chủ. Chương trình chủ khởi động tiến trình xác thực và gửi lại cho chương trình khách một yêu cầu (bảo mật). Sau đó, chương trình khách phản hồi cho chương trình chủ thông tin bảo mật. Ví dụ, khi sử dụng cơ chế bảo mật đơn giản, thông tin phản hồi sẽ là tên đăng nhập và mật khẩu. Sau khi kiểm tra tính chính xác của các thông tin bảo mật trên, chương trình chủ gửi tới chương trình khách một số thông số, ví dụ thông tin dung lượng lớn cao nhất của khung thông điệp. Chương trình khách có thể chấp nhận các thông số về dung lượng này hoặc giảm chúng xuống nếu thấy thông số này lớn hơn mức mong muốn của nó. Sau đó, chương trình khách mở kết nối tới chương trình chủ. Chương trình chủ chấp nhận kết nối đó.
Khi một phía (khách hoặc chủ) không muốn tiếp tục quá trình trao đổi thông điệp nữa, nó sẽ đóng kết nối. Nhận biết được tín hiệu này, phía còn lại cũng sẽ kết thúc kết nối. Cả khách và chủ đóng kết nối. Quá trình giao tiếp khách – chủ được kết thúc.
2.5 Các thuộc tính của một hàng đợi thông điệp
Trong phần này, chúng ta sẽ xem xét một số thuộc tính quan trọng của hàng đợi thông điệp, bao gồm:
2.5.1 Tên
Nếu tên không được định nghĩa từ ứng dụng khách, máy chủ sẽ tạo ra một tên và gán cho nó. Thông thường, nếu hàng đợi được tạo ra với thuộc tính được chia sẻ, nó sẽ được đặt tên trước. Nếu không được định nghĩa trước, việc đặt tên sẽ do máy chủ quyết định.
2.5.2 Tính duy nhất
Là thuộc tính xác định tính chất kết nối khách – chủ của hàng đợi thông điệp. Nếu thuộc tính được thiết lập, hàng đợi sẽ chỉ thuộc về kết nối hiện thời, và sẽ bị xóa khi kết nối bị đóng.
2.5.3 Tính duy trì
Nếu thuộc tính được thiết lập, hàng đợi vẫn tồn tại và được kích hoạt khi máy chủ khởi động lại. Nếu không thiết lập thuộc tính này, hàng đợi đó sẽ bị mất đi khi máy chủ khởi động lại
2.5.4 Tự động xóa
Sau khi khởi tạo và sử dụng hàng đợi, chúng ta cần xóa nó đi khi không còn ứng dụng nào sử dụng hàng đợi đó nữa. Chúng ta có thể sử dụng chính các ứng dụng để xóa hàng đợi đó đi sau khi nó kết thúc quá trình làm việc với hàng đợi đó. Tuy nhiên, điều này khó khả thi vì ứng dụng sẽ không biết chính xác là còn ứng dụng nào sử dụng hàng đợi đó nữa không để xóa nó. Vì vậy, hệ thống cung cấp một cơ chế để sau khi dịch vụ cuối cùng sử dụng một hàng đợi, máy chủ sẽ xóa hàng đợi đó.
2.5.5 Một số thuộc tính khác
Dung lượng lớn nhất của hàng đợi. Thuộc tính này chỉ ra dung lượng (về mặt vật lý) lớn nhất của hàng đợi thông điệp. Trong một số hệ thống hàng đợi thông điệp hiện nay, không có thông số dung lượng lớn nhất của hàng đợi thông điệp. Điều này có nghĩa là số lượng thông điệp được gửi lên hàng đợi trên máy chủ là không bị hạn chế. Các hệ thống hàng đợi thông điệp sẽ phải có giải pháp để lưu trữ thông điệp trên máy chủ sao cho phù hợp với nền tảng hệ điều hành mà hàng đợi thông điệp đó được triển khai.
Hệ thống sẽ xử lý thế nào nếu một thông điệp được gửi tới một hàng đợi đã lưu trữ thông điệp tới giới hạn dung lượng lớn nhất của nó. (nếu giá trị này được định nghĩa). Thông điệp đó sẽ được gửi lại cho tiến trình gửi, sẽ bị xóa đi, sẽ được lưu vào một thiết bị lưu trữ đặc biệt của hệ thống hay sẽ được gửi vào một hàng đợi đặc biệt nào đó.
Thông điệp có mang thuộc tính bền vững hay không?
2.6 Các yêu cầu của một hàng đợi thông điệp 2.6.1 Yêu cầu chức năng 2.6.1 Yêu cầu chức năng
2.6.1.1 Mô hình thông điệp
Đối với yêu cầu cho một kiến trúc thông điệp, một hàng đợi thông điệp cần phải có nhưng khả năng cơ bản sau:
Trước hết, hàng đợi thông điệp phải có khả năng lưu trữ và truyền thông điệp với nhiều tiến trình cùng ghi thông điệp cho một tiến trình xử lý. Hơn nữa, nó phải có khả năng phân tán quá trình truyền thông điệp với nhiều tiến trình gửi và nhiều tiến trình nhận. Đồng thời, hàng đợi thông điệp có chức năng lưu trữ thông điệp vào hàng đợi khi tiến trình chủ chưa kịp xử lý dữ liệu. Một yêu cầu nữa đối với một hàng đợi thông điệp là khả năng hỗ trợ quá trình truyền tệp tin.
2.6.1.2 Lưu trữ và truyền thông điệp
Lưu trữ và truyền là một hệ thống giao tiếp mà thông điệp được tiếp nhận, lưu trữ và truyền đi bằng một hàng đợi. Khi một chương trình chuẩn bị thông điệp và
chuyển tới một ứng dụng khác, nó sẽ đặt thông điệp vào hàng đợi. Thông điệp đó sẽ được hàng đợi nhận và chuyển tới ứng dụng đích.
Các đặc tính của một mô hình lưu trữ và truyền thông điệp bao gồm:
Thông điệp được gán địa chỉ để truyền tới một ứng dụng cụ thể.
Thông điệp không bị xóa đi, cho tới khi nó được truyền đầy đủ, nguyên vẹn tới ứng dụng đích.
Thông điệp chỉ được truyền đến ứng dụng đích một lần, không lặp lại việc truyền trừ khi có lỗi trong quá trình truyền tin.
Thông điệp được truyền đi có thứ tự.
Việc truyền tin có đồng bộ hóa hay không được quyết định bởi người gửi. Nếu người gửi muốn truyền tin có đồng bộ hóa, người gửi sẽ thông báo cho hệ thống hàng đợi thông điệp để đợi cho đến khi nhận được thông điệp phản hồi.
Thông điệp cũng có thể không thể truyền được đến ứng dụng đích. Trong trường hợp đó, thông điệp sẽ được chuyển vào một hàng đợi đặc biệt của hệ thống hàng đợi thông điệp hoặc sẽ được truyền ngược lại cho ứng dụng gửi thông điệp.
Thông điệp có thể bị hoãn lại. Khi đó, kích cỡ của hàng đợi sẽ tăng lên và tùy thuộc vào từng trường hợp cụ thể mà hệ thống có thể cảnh báo khi kích cỡ đến một mức độ nào đó.
Với các ứng dụng thông thường, chúng ta có thể thiết lập thời gian mong muốn (chẳng hạn vài giây) để hoàn tất quá trình truyền thông điệp. Nếu chúng ta không thiết lập thành phần này, hệ thống sẽ thực thi quá trình truyền thông điệp mà không bị rằng buộc bởi yếu tố thời gian.
2.6.1.3Định tuyến theo nội dung thông điệp
Với phương pháp định tuyến theo nội dung thông điệp, ứng dụng nào sẽ nhận được thông điệp không phụ thuộc vào ứng dụng gửi mà phụ thuộc vào chính nội dung thông điệp đó. Hệ thông sẽ tạo ra một tập các quy tắc, từ đó tính toán xem thông điệp sẽ được gửi tới ứng dụng nào.
Việc tính toán cho quá trình định tuyến sẽ mất một thời gian nhất định, vì vậy mà phương pháp này thường chỉ được áp dụng với một số hệ thống phức tạp và