SlideShare uma empresa Scribd logo
1 de 22
Baixar para ler offline
TRƢỜNG ĐẠI HỌC HÀNG HẢI VIỆT NAM
                 KHOA CÔNG NGHỆ THÔNG TIN
                              -----***-----




                      BÁO CÁO BÀI TẬP LỚN
           HỌC PHẦN “HỆ QUẢN TRỊ CƠ SỞ DỮ LIỆU”


Đề tài :
                TÌM HIỂU DỊCH VỤ SERVICE BROKER
                      TRONG MS SQL SERVER 2005




           Người hướng dẫn:        Lê Thế Anh
           Sinh viên thực hiện:    Đỗ Văn Hà (NT)
                                   Hoàng Tiến Dũng
                                   Vũ Hồng Phúc
                                   Đỗ Xuân Hoàng
                                   Nguyễn Tiến Dũng


                     Hải phòng, tháng 4 năm 2012
MỤC LỤC
   Giới thiệu Service Broker ........................................................................... 2

Phần 1.      SERVICE BROKER LÀM ĐƢỢC CÁI GÌ? ............................ 2

 1.1    Conversations ....................................................................................... 3

 1.2    Thứ tự và phối hợp thông điệp. ............................................................ 4

   1.2.1     Tích hợp giữa hàng đợi và cơ sở dữ liệu........................................ 4

   1.2.2     Quan hệ giữa hàng đợi và thông điệp ............................................ 5

 1.3    Kỹ thuật không đồng bộ tác vụ ............................................................ 5

 1.4    Hỗ trợ ứng dụng độc lập ....................................................................... 6

 1.5    Thành phần của Service Broker ........................................................... 6

   1.5.1     Thành phần đối thoại...................................................................... 6

   1.5.2     Phần định nghĩa dịch vụ ................................................................. 6

   1.5.3     Phần mạng và bảo mật ................................................................... 7

Phần 2.      LỢI ÍCH CỦA SERVICE BROKER ......................................... 7

 2.1    Tương tác cơ sở dữ liệu ........................................................................ 7

 2.2    Thứ tự và phối hợp của thông điệp....................................................... 8

 2.3    Tính độc lập và uyển chuyển trong xử lý ............................................. 9

 2.4    Khóa thông điệp liên quan.................................................................... 9

 2.5    Tự động kích hoạt................................................................................. 9

Phần 3.      SỬ DỤNG SERVICE BROKER TRONG ỨNG DỤNG........ 10

Phần 4.      KẾT LUẬN ................................................................................. 21

Phần 5.      TÀI LIỆU THAM KHẢO ......................................................... 21




                                                                                                            1
Service Broker là dịch vụ mạnh được giới thiệu trong SQL Server
2005, mục đích của nó giúp cho người lập trình cơ sở dữ liệu xây dựng ứng
dụng bảo mật, độ tin cậy cao và có tính uyển chuyển.

      Nếu lần đầu tiên bạn nghe thấy nhóm từ này không liên quan gì đến thị
trường chứng khoán( Stock Market), mà Service Broker cung cấp kỹ thuật
hàng đợi và trao đổi thông điệp trong cơ sở dữ liệu SQL Server 2005.
      Service Broker được sử dụng cho ứng dụng trong Instance của cơ sở
dữ liệu và cả những ứng dụng phân tán trên nhiều Instance.
Các vấn đề chính sẽ được đề cập:
               Service Broker làm được cái gì?
               Lợi ích của Service Broker.
               Sử dụng Service Broker trong ứng dụng.


Phần 1.       SERVICE BROKER LÀM ĐƢỢC CÁI GÌ?

      Như giới thiệu ở trên, Service Broker sẽ cung cấp chức năng trao đổi
thông điệp giữa hai Instance của SQL Server, nó còn giúp cho người lập trình
tạo ứng dụng độc lập và có thể tự quản lý các thành phần của chúng được gọi
là dịch vụ.
      Những ứng dụng sử dụng dịch vụ này sẽ sử dụng thông điệp để trao đổi
các Instance của SQL Server với nhau bằng cách dùng nghi thức truyền
thông TCP/IP.
      Tóm lại, Service Broker giúp cho người lập trình xây dựng ứng dụng
bất đồng bộ( Asynchronous) và được cài đặt một cách độc lập nhưng cùng
thực thi một các vụ là để trao đổi tin nhắn. Sau đây là các bước mà Service
Broker thực hiện trao đổi thông điệp giữa hai Instance của SQL Server.




                                                                              2
1.1 Conversations

      Server Broker được thiết kế để thực hiện các chức năng cơ bản về việc
gửi và nhận thông điệp. Mỗi định dạng trao đổi thông điệp đều được xác thực
và nhất quán trong kênh giao tiếp. Ngoài ta, mỗi thông điệp và quá trình trao
đổi theo một kiểu chỉ định do Service Broker bắt buộc để giúp cho người lập
trình có thể tạo nên ứng dụng có độ tin cậy cao.
      Những phát biểu Transact-SQL được giới thiệu trong phiên bản SQL
2005 cho phép ứng dụng gửi và nhận thông điệp đáng tin cậy. Ứng dụng dùng
để gửi thông điệp đến các dịch vụ được đặt tên ứng với tập các tác vụ liên
quan, trong khi đó ứng dụng dùng để nhận thông điệp từ hàng đợi được trình
bày bởi bảng dữ liệu.
      Những thông điệp của cùng một tác vụ thì chúng có cùng một giao tiếp.
Trong một phần giao tiếp, Service Broker bảo đảm ứng dụng nhận thông
điệp chính xác một lần theo thứ tự mà chúng được gửi.
      Chú ý: Cách tốt nhất để hiểu rõ về Service Broker là xem như dịch vụ
gửi và nhận thư của bưu điện( Post Office), điều này có nghĩa là khi liên lạc
với đồng nghiệp ở xa, bạn có thể giao tiếp với họ bằng cách gửi thư thông qua
dịch vụ thư tín của bưu điện, thư của bạn sẽ gửi đến người nhần( bằng các
phương tiện vận chuyển khác nhau) theo qui trình và thứ tự phân phát mà
nhân viên bưu điện đã sắp xếp, đồng nghiệp của bạn có thể nhận được thư rồi
đọc chúng và có thể viết thư để phúc đáp cho đến khi tác vụ liên quan được
giải quyết.
      Với cơ chế này, thư sẽ được phân phát theo cơ chế không đồng bộ vì sự
gửi hay phúc đáp của đồng nghiệp có thể dừng lại trong thời gian do bạn hay
đồng nghiệp đang làm công việc khác với hình minh họa:




                                                                                3
Hình 1: Qui trình gửi và nhận thư.


      Trong đó, Post Office là bưu điện, Mail truck là xe vận chuyển thư và
biểu tượng Mail ứng với hộp thư( Mail Box)
      Với dịch vụ gửi thư bằng bưu điện như trên thì những lá thư được ví
như những thông điệp và dịch vụ Service Broker là địa chỉ để thư được người
đưa thư chuyển đến. Tương tự như vậy, hàng đợi( Queue) chính là hộp thư
nơi nắm giữ lá thư một khi chúng được gửi đến đúng địa chỉ người nhận.
      Như vậy, chương trình sử dụng Service Broker nắm giữ cuộc trao đổi
với các chương trình khác thì được xem như phân phát thư.

1.2 Thứ tự và phối hợp thông điệp.

      Như cách giải thích ở trên, bạn sẽ không cần biết khi nào thì đồng
nghiệp của bạn sẽ đọc thư hay viết thư để phản hồi; tương tự như vậy, ứng
dụng mà bạn sử dụng trong Service Broker cũng không cần biết dịch vụ nhận
xử lý thông điệp có sẵn sàng hay chưa.
      Do đó, Service Broker kiểm soát hàng đợi, kỹ thuật lập trình cơ sở dữ
liệu thông thường với hai đặc điểm như sau:

1.2.1 Tích hợp giữa hàng đợi và cơ sở dữ liệu

      Tích hợp hàng đợi nghĩa là việc bảo trì và quản trị cơ sở dữ liệu chuẩn
hóa phải bao gồm dịch vụ Service Broker. Đặc biệt người quản trị cơ sở dữ
liệu không có lộ trình nào ứng vời tác vụ để bảo trì dịch vụ Service Broker, vì
nó đã được bao gồ m trong cơ sở dữ liệu.


                                                                                4
1.2.2 Quan hệ giữa hàng đợi và thông điệp

      Bộ khung của dịch vụ Service Broker cung cấp giao tiếp bằng phát
biểu SQL đơn giản cho phép gửi và nhận cùng với việc kết hợp với quá trình
phân phối và xử lý thông điệp. Service Broker đảm bảo chương trình khi
nhận mỗi thông điệp trong cuộc đối thoại chỉ đúng một lần theo thứ tự chúng
được gửi chứ không phải là thứ tự trong hàng đợi.
      Ngoài ra, Service Broker bảo đảm hai bộ đọc ứng với hai hàng đợi
không thể đồng thời xử lý thông điệp trong cùng một cuộc đối thoại hay nhóm
đối thoại.
      Khi chương trình khởi tạo một cuộc đối thoại cho mỗi tác vụ để giữ
thông điệp đến dịch vụ nhận. Thông điệp chứa đựng dữ liệu được yêu cầu
thực thi theo từng bước trong một tác vụ như nhận thông điệp, xử lý thông
điệp và phản hồi trở lại cho dịch vụ khởi tạo nó. Cuộc đối thoại thật sự kết
thúc phải tuân thủ quy tắc do người lập trình đưa ra.

1.3 Kỹ thuật không đồng bộ tác vụ

      Trong kiến trúc của Service Broker, thông điệp được gửi đi giữa các
ứng dụng được cài đặt tính chuyển tắc và bất đồng bộ. Bởi vì, thông điệp bị
lỗi thì toàn bộ hành động trong Service Broker sẽ phục hồi bao gồm cả hành
động gửi và nhận thông điệp.
      Khi thông điệp gửi đi với cơ chế không đồng bộ, Database Engine sẽ
kiểm soát quá trình phân phối trong khi ứng dụng vẫn tiếp tục thực thi các tác
vụ khác.
      Kỹ thuật không đồng bộ sẽ giúp cho người lập trình tạo ra các ứng
dụng có sử dụng hàng đợi. Hàng đợi cho phép cơ sở dữ liệu giữ nguyên trách
nhiệm của người sử dụng hiện hành trong khi làm việc với các tài nguyên
khác. Service Broker đưa ra hàng đợi như một phần tổng thể của Database
Engine.

                                                                               5
Kỹ thuật hàng đợi cho phép ứng dụng thực thi công việc trên nhiều tác
vụ khác nhau, khái niệm này được mở rộng trên nhiều Instance của SQL
Server hay SQL Server trên nhiều Server.

1.4 Hỗ trợ ứng dụng độc lập

      Service Broker hỗ trợ ứng dụng độc lập cho phép gửi và nhận thông
điệp độc lập với nhau, mặc dù những ứng dụng này có chung cơ chế trao đổi
thông điệp và sử dụng kiến trúc tương tác giữa các dịch vụ với nhau.
      Những ứng dụng này chỉ cần chạy trong cùng một Instance của SQL
Server và không nhất thiết cùng một thời điểm, đồng thời chúng không phụ
thuộc vào vị trí vật lý.

1.5 Thành phần của Service Broker

Service Broker có 3 thành phần: Đối thoại, định nghĩa dịch vụ, bảo mật và
mạng.

1.5.1 Thành phần đối thoại

      Bao gồm đối thoại đơn và nhóm, dạng thông điệp. Ứng dụng trao đổi
thông điệp được xem như một phần của đối thoại. Mỗi cuộc đối thoại thuộc
trong nhóm đối thoại; nhóm đối thoại có thể chứa nhiều cuộc đối thoại.
      Đối thoại trong Service Broker là cuộc trao đổi thông điệp chính xác
giữa hai người tham gia.

1.5.2 Phần định nghĩa dịch vụ

      Phần này là kiến trúc cơ bản của các cuộc đối thoại được sử dụng trong
ứng dụng. Chúng bao gồm loại thông điệp dùng cho đối thoại, cơ sở dữ liệu
dùng cho ứng dụng.




                                                                              6
1.5.3 Phần mạng và bảo mật

      Phần mạng và bảo mật là hai thành phần cấu thành cơ hạ tần cho quá
trình trao đổi thông điệp bên ngoài Instance của SQL Server, để hỗ trợ cho
người quản trị có quyền quản lý sự thay đổi của môi trường, cấu hình thành
phần độc lập của ứng dụng.
      Tóm lại, phần định nghĩa dịch vụ, mạng và bảo mật là thành phần siêu
dữ liệu trong Instance của SQL Server, trong khi đó đối thoại đơn hay nhóm
và thông điệp là phần dữ liệu của cơ sở dữ liệu chứa đựng nó.


Phần 2.      LỢI ÍCH CỦA SERVICE BROKER

      Service Broker cung cấp nhiều lợi ích cho ứng dụng cơ sở dữ liệu bao
gồm: Tương tác cơ sở dữ liệu, thứ tự và phối hợp của thông điệp, tính độc lập
và xử lý công việc uyển chuyển, khóa thông điệp và kích hoạt tự động.

2.1 Tƣơng tác cơ sở dữ liệu

      Tương tác cơ sở dữ liệu nâng cao khả năng thực thi và giúp việc quản
trị trở nên đơn giản.
      Tương tác với SQL Server cho phép thực hiện tác vụ của một thông
điệp cần sự phối hợp của các chuyển tác khác từ bên ngoài. Một ứng dụng
nhận một hay nhiều thông điệp rồi xử lý và gửi chúng trong cơ sở dữ liệu.
      Nếu tác vụ này thất bại thì tất cả các tác vụ khác trong cùng một
chuyển tác sẽ bị phục hồi trở lại trạng thái ban đầu.
      Đối với chức năng quản trị cũng được đơn giản hơn do dữ liệu và thông
điệp chứa trong cơ sở dữ liệu một cách có hệ thống.
      Chú ý: Với hệ thống trao đổi thông điệp truyền thống, thông điệp được
lưu trong cơ sở dữ liệu có thể trở nên không đồng nhất. Chẳng hạn, khi một
thành phần được phục hồi từ bản sao( backup) thì các thành phần khác cũng
được phục hồi từ chúng trong cùng một thời điểm; trong trường hợp ngược lại
                                                                              7
thì thông tin của thông điệp sẽ không trùng khớp với thông tin trong cơ sở dữ
liệu; bởi vì Service Broker nắm giữ thông điệp và dữ liệu trong cùng cơ sở dữ
liệu sẽ không đồng bộ.
        Môi trường phát triển thông thường cũng là một lợi ích của tương tác
cơ sở dữ liệu. Phần thông điệp của cơ sở dữ liệu này và phần dữ liệu của ứng
dụng khác có thể sử dụng chung ngôn ngữ và công cụ của SQL Server trong
ứng dụng Service Broker, người phát triển ứng dụng có thể sử dụng kỹ thuật
lập trình cho ứng dụng trao đổi thông điệp bằng thủ tục nội tại.
        Ngoài ra, các ứng dụng nằm ngoài cơ sở dữ liệu có thể phát triển bằng
giao tiếp cơ sở dữ liệu như ADO.NET

2.2 Thứ tự và phối hợp của thông điệp

        Trong hệ thống thông điệp truyền thống, ứng dụng có trách nhiệm sắp
xếp và phối hợp các thông điệp có thứ tự. Ví dụ, ứng dụng ABC gửi thông
điệp thứ 1, 2 rồi thứ 3; ứng dụng XYZ nhận thông điệp thứ 1 và 3, nhưng lỗi
phát sinh cho thông điệp thứ 2. Do đó, ứng dụng ABC sẽ gửi lại thông điệp
thứ 2, như vậy thì thông điệp thứ 2 sẽ nhận theo thứ tự là sau thông điệp thứ 1
và 3.
        Trước đây, người lập trình có thể cho phép chờ cho đến khi nhận thông
điệp thứ 2 sau khi nhạn được thông điệp thứ 1 bằng cách lưu thông điệp thứ 3
vào bộ nhớ cache( tương tự như cách xử lý đồng bộ).,
        Tuy nhiên, vấn đề cũng có thể xảy ra nếu ứng dụng XYZ nhận thông
điệp thứ 2 nhưng phản hồi lại cho ứng dụng ABC với lý do thất lạc thông
điệp, ứng dụng ABC tiếp tục gửi lại thông điệp thứ 2 và ứng dụng XYZ sẽ
nhận thông điệp thứ 2 hai lần. Như vậy, chương trình sẽ loại bỏ khi thấy trùng
lặp hay xử lý ghi đè. Đứng trên góc độ lập trình, cả hai giải pháp đều khó cài
đặt.




                                                                                 8
Phối hợp thông điệp cũng khó khăn khi trong kiểm soát, một ứng dụng
có thể đệ trình hàng trăm đến hàng ngàn yêu cầu đến dịch vụ. Việc xử lý yêu
cầu đòi hỏi phải mang tính song song và trả về kết quả với thời gian sớm nhất.
      Tất các giới hạn vừa trình bày ở trên đều được giải quyết bởi Serviec
Broker từ việc kiểm soát thứ tự của thông điệp, phân phát duy nhất một lần và
tự động nhận dạng đối thoại. Một khi cuộc đối thoại được thiết lập giữa hai
điểm cuối của dịch vụ, ứng dụng sẽ nhận thông điệp chỉ một lần theo thứ tự
mà chúng được gửi.

2.3 Tính độc lập và uyển chuyển trong xử lý

      Service Broker cung cấp cách xử lý độc lập giữa ứng dụng khởi tạo và
ứng dụng đích. Một ứng dụng có thể gửi thông điệp vào hàng đợi và tiếp tục
việc xử lý, phản hồi dựa vào Service Broker để bảo đảm thông điệp sẽ đến
được ứng dụng đích.
      Với cơ chế uyển chuyển, ứng dụng dùng để khởi tạo sẽ gửi nhiều thông
điệp và dịch vụ trong ứng dụng nhận sẽ xử lý song song phụ thuộc vào khối
lượng công việc đang nắm giữ.

2.4 Khóa thông điệp liên quan

      Khóa thông điệp liên quan cho phép nhiều ứng dụng xử lý thông điệp
từ hàng đợi không cần chỉ định tính đồng bộ.

2.5 Tự động kích hoạt

      Tự động kích hoạt cho phép ứng dụng điều chỉnh dung lượng của thông
điệp đến hàng đợi. Service Broker cung cấp tính năng cho phép chương trình
chạy trong và ngoài cơ sở dữ liệu có thể kích hoạt. Tuy nhiên, Service Broker
không yêu cầu ứng dụng sử dụng kích hoạt này.



                                                                              9
Phần 3.       SỬ DỤNG SERVICE BROKER TRONG ỨNG DỤNG

      Service Broker là dịch vụ rất mạnh cho phép bạn cài đặt chúng trong
những ứng dụng có cơ chế xử lý không đồng bộ hay phân tán trên nhiều máy,
chẳng hạn như: Trigger không đồng bộ, xử lý truy vấn có xác thực, đọc dữ
liệu có xác thực, xử lý trên phía trình chủ đối với ứng dụng phân tán, hợp nhất
dữ liệu cho trình khách và xử lý lô với qui mô lớn.
      Mặc dù có nhiều ứng dụng có thể sử dụng dịch vụ Service Broker của
SQL Server 2005, chúng ta chỉ tìm hiểu ứng dụng cơ bản dùng để gửi và nhận
thông điệp.
      Chú ý: Bạn có thể tìm thấy cách tạo hàng đợi, loại thông điệp, giao ước
đối thoại và dịch vụ nhận và gửi thông điệp trong tập tin ServiceBroker.sql.
      Để làm điều này, trước tiên bạn kiểm tra cơ sở dữ liệu AccuntSystem
đã cho phép cài đặt dịch vụ Service Broker hay chưa, nếu chưa thì sử dụng
phát biểu SET với tùy chọn ENABLE_BROKER như ví dụ sau:


Ví dụ 1: Khai báo kích hoạt dịch vụ Service Broker
              IF NOT EXISTS
                   (SELECT *FROM sys.databases
                   WHERE name = 'AccountSystem'
                   AND is_broker_enabled = 1)
                   BEGIN
                          ALTER DATABASE AccountSystem
                          SET ENABLE_BROKER;
                   END;
                   GO
      Để tạo hai dịch vụ Service Broker cho ứng dụng, bạn phải tạo hàng
đợi cho dịch vụ khởi tạo với cú pháp như sau:



                                                                               10
Ví dụ 2: Khai báo hàng đợi cho dịch vụ khởi tạo


             CREATE QUEUE QueueForInitiator;
             GO


       Chú ý: Để kiểm tra hàng đợi có tên QueueForInitiator đã tồn tại hay
chưa trong cơ sở dữ liệu AccountSystem, bạn có thể sử dụng phát biểu như
sau:


Ví dụ 3: Khai báo kiểm tra hàng đợi QueueForInitiator


             IF OBJECT_ID('[dbo].[QueueForInitiator]')
             IS NOT NULL
             AND
             EXISTS(SELECT*
                  FROM sys.objects WHERE object_id =
                  OBJECT_ID('[dbo].[ QueueForInitiator]')
                  AND type = 'SQ')
             BEGIN
                  DROP QUEUE [dbo].[ QueueForTarget];
             END;
                  GO
       Tương tự như vậy, bạn tiếp tục tạo hàng đợi cho dịch vụ đích với cú
pháp sau:


Ví dụ 4: Khai báo hàng đợi cho dịch vụ đích


             CREATE QUEUE QueueForTarget;
             GO
       Tương tự như trên, để kiểm tra hàng đợi có tên QueueForTarget đã có
tồn tại hay chưa trong sơ sở dữ liệu AccountSystem, bạn có thể sử dụng phát
biểu như sau:


                                                                             11
Ví dụ 5: Khai báo kiểm tra hàng đợi QueueForTarget
            IF OBJECT_ID('[dbo].[QueueForTarget]') IS
            NOT NULL
            AND
                   EXISTS(SELECT*
                   FROM sys.objects WHERE object_id =
                   OBJECT_ID('[dbo].[ QueueForTarget]')
                   AND type = 'SQ')
            BEGIN
                   DROP QUEUE [dbo].[ QueueForTarget];
            END;
            GO
      Sau khi thực thi phát biểu CREATE QUEUE trong hai ví dụ trên, bạn có
thể tìm thấy hai đối tượng hàng đợi xuất hiện trong ngăn Service Broker |
Queue của cơ sở dữ liệu AccountSystem như hình 2:




                              Hình 2: Hàng đợi


                                                                            12
Chú ý: Hai hàng đợi vừa được tạo là nơi lưu trữ thông điệp.
      Tiếp theo, bạn khai báo để tạo loại thông điệp dùng cho ứng dụng này
với cú pháp như sau:


Ví dụ 6: Khai báo loại thông điệp
            CREATE MESSAGE TYPE HelloWorldMessage
                    VALIDATION = WELL_FORMED_XML;
            GO


      Chú ý: Bạn có thể sử dụng phát biểu như ví dụ kế tiếp sau đây để kiểm
tra loại thông điệp có tên HelloWorldMessage đã tồn tại trong cơ sở dữ liệu
hay chưa.


Ví dụ 7: Khai báo kiểm tra loại thông điệp HelloWorldMessage
            IF EXISTS (SELECT *
                    FROM sys.service_message_types
                    WHERE name= 'HelloWorldMessage')
            BEGIN
                    DROP MESSAGE TYPE HelloWorldMessage;
            END;
            GO


      Sau khi thực thi phát biểu trong ví dụ trên, bạn có thể tìm thấy loại
thông điệp tạo ra nó có tên HelloWorldMessage nằm trong ngăn Message
Types như hình 3:




                                                                              13
Hình 3: Loại thông điệp
      Tương tự như trên, bạn tiếp tục khai báo để tạo ra giao ước có tên
ContractForHelloWorld cho phép bất kỳ ứng dụng nào tham gia vào cuộc
đối thoại có thể gửi được loại thông điệp này.
Ví dụ 8: Khai báo tạo ràng buộc
             CREATE CONTRACT ContractForHelloWorld
             (HelloWorldMessage SENT                 BY INITIATOR);
             GO


      Chú ý: Bạn có thể sử dụng phát biểu như trong ví dụ sau đây để kiểm
tra giao ước này đã tồn tại trong cơ sở dữ liệu AccountSystem hay chưa.
Ví dụ 9: Khai báo kiểm tra giao ước ContractForHelloWorld
             IF EXISTS (SELECT *
                    FROM sys.service_contracts
                    WHERE name = 'ContractForHelloWorld')
             BEGIN
                    DROP CONTRACT ContractForHelloWorld;
             END;
             GO



                                                                            14
Bạn có thể tìm thấy ContractForHelloWorld trong ngăn Contracts như
hình 4:




                Hình 4: Giao ước sử dụng cho loại thông điệp.
      Kế đến, bạn cài đặt hai dịch vụ Service Broker ứng với dịch vụ khởi
tạo có tên InitiatorService như ví dụ:
Ví dụ 10: Khai báo tạo dịch vụ InitiatorService
             CREATE SERVICE InitiatorService
                    ON QUEUE [dbo].[QueueForInitiator];
             GO
Chú ý: Để kiểm tra dịch vụ Service Broker có tên InitiatorService đã tồn tại
hay chưa ta sử dụng phát biểu như ví dụ sau:


Ví dụ 11: Khai báo kiểm tra dịch vụ InitiatorService
             IF EXISTS (SELECT *
                    FROM sys.services
                    WHERE name = 'InitiatorService')
             BEGIN
                    DROP SERVICE InitiatorService;
             END;
             GO

                                                                            15
Do dịch vụ đích dùng cho đối thoại giao ước, nên bạn tạo dịch vụ có
tên TargetService có chỉ định giao ước ContractForHelloWorld bằng cách
khai báo như ví dụ:


Ví dụ 12: Khai báo tạo dịch vụ TargetService
            CREATE SERVICE TargetService
                   ON QUEUE [dbo].[QueueForTarget]
                   (ContractForHelloWorld);
            GO


      Chú ý: Để kiểm tra dịch vụ Server Broker có tên TargetService đã tồn
tại hay chưa bạn sử dụng phát biểu ví dụ:
Ví dụ 13: Khai báo kiểm tra dịch vụ TargetService


            IF EXISTS (SELECT *
                   FROM sys.services
                   WHERE name = 'TargetService')
            BEGIN
                   DROP SERVICE TargetService;
            END;
            GO


      Sau khi tạo dịch vụ khởi tạo và đích thành công, bạn có thể tìm thấy
dịch vụ này xuất hiện trong ngăn Service Broker | Service.
      Để gửi thông điệp, bạn cần khai báo đoạn phát biểu SQL để bắt đầu
chuyển tác cho cuộc đối thoại rồi gửi thông điệp đến dịch vụ có tên
TargetService như ví dụ:




                                                                             16
Hình 5: Dịch vụ khởi tạo và đích.


Ví dụ 14: Khai báo gửi thông điệp
--        Bắt đầu chuyển tác
BEGIN TRANSACTION


     -- Khai báo biến XML
     DECLARE @message XML;
     -- Gán giá trị cho biến XML
     SET @message = N'<message>Hello World!</message>';
     -- Khai báo biến kiểm soát đối thoại
     DECLARE @conversationHandler UNIQUEIDENTIFIER;
     --         Khai báo bắt đầu đối thoại
     BEGIN DIALOG CONVERSATION @conversationHandler
     -- Khai báo chỉ định đối thoại từ InitiatorService
     FROM SERVICE InitiatorService
     -- Khai báo chỉ định đối thoại đến TargetService
     TO SERVICE 'TargetService'

                                                             17
--          Khai báo chỉ định giao ước đối thoại
  ON CONTRACT ContractForHelloWorld
  WITH ENCRYPTION = OFF;
  --          Khai báo gửi thông điệp
  SEND ON CONVERSATION @conversationHandler
        MESSAGE TYPE HelloWorldMessage(@message);
        END CONVERSATION @conversationHandler;
COMMIT TRANSACTION;
GO


        Để kiểm tra thông điệp đang nằm trong hàng đợi, bạn khai báo phát
biểu SELECT như ví dụ sau:


Ví dụ 15: Khai báo đọc thông điệp trong hàng đợi
              SELECT service_name, service_contract_name,
              Message_type_name, message_body
              FROM [dbo].[QueueForTarget]
              GO


Kết quả trình bày( như hình 6) khi thực hiện phát biểu SELECT trong ví dụ
trên.




                      Hình 6: Thông điệp trong hàng đợi.


        Để đọc thông điệp gửi đến TargerService từ InitiatorService, bạn khai
báo phát biểu SQL với cấu trúc như sau:


                                                                            18
Ví dụ 16: Khai báo nhận thông điệp
WHILE( 1 = 1)
BEGIN
-- Khai báo biến
      DECLARE
            @conversation_handler UNIQUEIDENTIFIER,
            @conversation_group_id UNIQUEIDENTIFIER,
            @message_body XML,
            @message_type_name NVARCHAR(128);
      BEGIN TRANSACTION


      -- Sử dụng phát biểu WAITFOR
      WAITFOR(
            GET CONVERSATION
                   GROUP @conversation_group_id
                   FROM [dbo].[QueueForTarget]),
            TIMEOUT 500;
            IF @conversation_group_id IS NULL
            BEGIN
                   ROLLBACK TRANSACTION;
                   BREAK;
            END;
            WHILE 1 = 1
            BEGIN
      -- Sử dụng phát biểu RECEIVE ðể nhận thông ðiệp
                   RECEIVE
                        TOP(1)
      @conversation_handler = conversation_handle,
      @message_type_name = message_type_name,


                                                        19
@message_body =
                              CASE
                                     WHEN validation = 'X'
                                     THEN CAST(message_body AS XML)
                                     ELSE CAST(N'<none/>' AS XML)
              END
              FROM [dbo].[QueueForTarget]
              WHERE conversation_group_id =
                              @conversation_group_id;
              IF @@ROWCOUNT = 0 OR @@ERROR <> 0
                      BREAK;
                      SELECT
                              'Conversation Group Id' =
                                     @conversation_group_id,
                              'Conversation Handler' =
                                     @conversation_handler,
                              'Message Type Name' =
                                     @message_type_name,
                              'Message Body' =
                                     @message_body;
                      IF @message_type_name =
       'http://schemas.microsoft.com/SQL/SeviceBroker/EndDialog'
                                     OR @message_type_name =
       'http://schemas.microsoft.com/SQL/SeviceBroker/Error'
                      BEGIN
       END CONVERSATION @conversation_handler;
                      END;
              END;
       COMMIT TRANSACTION;
END;

                                                                      20
Khi thực thi phát biểu trong ví dụ trên, kết quả nhận được trình bày như
hình 7:




                          Hình 7: Nhận thông điệp


      Như vậy, khi bạn truy vấn dữ liệu trong bảng QueueForTarget, lập tức
thông điệp trong hàng đợi QueueForTarget biến mất, bạn có thể kiểm tra lại
bắng cách thực thi phát biểu như trong Ví dụ 13.


Phần 4.     KẾT LUẬN

       Từ bối cảnh lập trình, các thành phần cơ sở hạ tầng được tạo ra. Sau đó, để bắt
đầu ứng dụng service một cuộc trò chuyện được bắt đầu, các thông điệp ở định dạng
XML được gửi như các loại tin nhắn cụ thể cho một danh sách cụ thể, sau đó các thông
điệp được tiếp nhận và xử lí. Tại bất kì thời điểm nào ứng dụng service broker có thể
nhận được đọc và viết cùng một hàng đợi cũng như có nhiều ứng dụng service broker
cư trú trong cùng một cơ sở dữ liệu.


Phần 5.     TÀI LIỆU THAM KHẢO
     Donahoo, Speegle, SQL – Practical Guide for Developers, Morgan Kaufmann
     Robin Dewson, Beginning SQL Server 2005 for Developers, Apress
     Brian Knight, Professional SQL Server 2005 Administration, Wrox
     SQL Server 2005 – Lập trình nâng cao, NXB Lao Động – Xã Hội




                                                                            21

Mais conteúdo relacionado

Semelhante a Bao cao btl f11(1)

Tìm hiểu web service
Tìm hiểu web serviceTìm hiểu web service
Tìm hiểu web service
Thieu Mao
 
Báo cáo kĩ thuật phần mềm và ứng dụng
Báo cáo kĩ thuật phần mềm và ứng dụngBáo cáo kĩ thuật phần mềm và ứng dụng
Báo cáo kĩ thuật phần mềm và ứng dụng
Vượng Đặng
 
Hệ PhâN TáN
Hệ PhâN TáNHệ PhâN TáN
Hệ PhâN TáN
it
 
bctntlvn (50).pdf
bctntlvn (50).pdfbctntlvn (50).pdf
bctntlvn (50).pdf
Luanvan84
 
Lab 4 active directory domain services
Lab 4 active directory domain services Lab 4 active directory domain services
Lab 4 active directory domain services
Pham Viet Dung
 
Lab 4 active directory domain services
Lab 4 active directory domain services Lab 4 active directory domain services
Lab 4 active directory domain services
tinhban269
 
Baocao Tong Hop
Baocao Tong HopBaocao Tong Hop
Baocao Tong Hop
foolman209
 
Exchangeserver
ExchangeserverExchangeserver
Exchangeserver
phanleson
 

Semelhante a Bao cao btl f11(1) (20)

Web service
Web serviceWeb service
Web service
 
Giới thiệu WCF
Giới thiệu WCFGiới thiệu WCF
Giới thiệu WCF
 
[Itech] giải pháp, dịch vụ về hệ thống thư điện tử microsoft exchange2016
[Itech] giải pháp, dịch vụ về hệ thống thư điện tử   microsoft exchange2016[Itech] giải pháp, dịch vụ về hệ thống thư điện tử   microsoft exchange2016
[Itech] giải pháp, dịch vụ về hệ thống thư điện tử microsoft exchange2016
 
04 de cuong
04 de cuong04 de cuong
04 de cuong
 
Tìm hiểu web service
Tìm hiểu web serviceTìm hiểu web service
Tìm hiểu web service
 
Thương mại điện tử
Thương  mại điện tửThương  mại điện tử
Thương mại điện tử
 
Báo cáo kĩ thuật phần mềm và ứng dụng
Báo cáo kĩ thuật phần mềm và ứng dụngBáo cáo kĩ thuật phần mềm và ứng dụng
Báo cáo kĩ thuật phần mềm và ứng dụng
 
Triển Khai Mail Exchange 2007 .
Triển Khai Mail Exchange 2007 .Triển Khai Mail Exchange 2007 .
Triển Khai Mail Exchange 2007 .
 
Hệ PhâN TáN
Hệ PhâN TáNHệ PhâN TáN
Hệ PhâN TáN
 
bctntlvn (50).pdf
bctntlvn (50).pdfbctntlvn (50).pdf
bctntlvn (50).pdf
 
Lab 4 active directory domain services
Lab 4 active directory domain services Lab 4 active directory domain services
Lab 4 active directory domain services
 
Lab 4 active directory domain services
Lab 4 active directory domain services Lab 4 active directory domain services
Lab 4 active directory domain services
 
Bao cao web cake php
Bao cao web cake phpBao cao web cake php
Bao cao web cake php
 
SSO with SAML 2.0
SSO with SAML 2.0SSO with SAML 2.0
SSO with SAML 2.0
 
Đề tài: Tìm hiểu mail server dựa trên phần mềm mã nguồn mở Zimbra
Đề tài: Tìm hiểu mail server dựa trên phần mềm mã nguồn mở ZimbraĐề tài: Tìm hiểu mail server dựa trên phần mềm mã nguồn mở Zimbra
Đề tài: Tìm hiểu mail server dựa trên phần mềm mã nguồn mở Zimbra
 
Tailieu.vncty.com giao-trinh-sql-2000
Tailieu.vncty.com   giao-trinh-sql-2000Tailieu.vncty.com   giao-trinh-sql-2000
Tailieu.vncty.com giao-trinh-sql-2000
 
Baocao Tong Hop
Baocao Tong HopBaocao Tong Hop
Baocao Tong Hop
 
Exchangeserver
ExchangeserverExchangeserver
Exchangeserver
 
Hoc sql server 2000
Hoc sql server 2000Hoc sql server 2000
Hoc sql server 2000
 
Dsd05 04-05-jmsa
Dsd05 04-05-jmsaDsd05 04-05-jmsa
Dsd05 04-05-jmsa
 

Bao cao btl f11(1)

  • 1. TRƢỜNG ĐẠI HỌC HÀNG HẢI VIỆT NAM KHOA CÔNG NGHỆ THÔNG TIN -----***----- BÁO CÁO BÀI TẬP LỚN HỌC PHẦN “HỆ QUẢN TRỊ CƠ SỞ DỮ LIỆU” Đề tài : TÌM HIỂU DỊCH VỤ SERVICE BROKER TRONG MS SQL SERVER 2005 Người hướng dẫn: Lê Thế Anh Sinh viên thực hiện: Đỗ Văn Hà (NT) Hoàng Tiến Dũng Vũ Hồng Phúc Đỗ Xuân Hoàng Nguyễn Tiến Dũng Hải phòng, tháng 4 năm 2012
  • 2. MỤC LỤC Giới thiệu Service Broker ........................................................................... 2 Phần 1. SERVICE BROKER LÀM ĐƢỢC CÁI GÌ? ............................ 2 1.1 Conversations ....................................................................................... 3 1.2 Thứ tự và phối hợp thông điệp. ............................................................ 4 1.2.1 Tích hợp giữa hàng đợi và cơ sở dữ liệu........................................ 4 1.2.2 Quan hệ giữa hàng đợi và thông điệp ............................................ 5 1.3 Kỹ thuật không đồng bộ tác vụ ............................................................ 5 1.4 Hỗ trợ ứng dụng độc lập ....................................................................... 6 1.5 Thành phần của Service Broker ........................................................... 6 1.5.1 Thành phần đối thoại...................................................................... 6 1.5.2 Phần định nghĩa dịch vụ ................................................................. 6 1.5.3 Phần mạng và bảo mật ................................................................... 7 Phần 2. LỢI ÍCH CỦA SERVICE BROKER ......................................... 7 2.1 Tương tác cơ sở dữ liệu ........................................................................ 7 2.2 Thứ tự và phối hợp của thông điệp....................................................... 8 2.3 Tính độc lập và uyển chuyển trong xử lý ............................................. 9 2.4 Khóa thông điệp liên quan.................................................................... 9 2.5 Tự động kích hoạt................................................................................. 9 Phần 3. SỬ DỤNG SERVICE BROKER TRONG ỨNG DỤNG........ 10 Phần 4. KẾT LUẬN ................................................................................. 21 Phần 5. TÀI LIỆU THAM KHẢO ......................................................... 21 1
  • 3. Service Broker là dịch vụ mạnh được giới thiệu trong SQL Server 2005, mục đích của nó giúp cho người lập trình cơ sở dữ liệu xây dựng ứng dụng bảo mật, độ tin cậy cao và có tính uyển chuyển. Nếu lần đầu tiên bạn nghe thấy nhóm từ này không liên quan gì đến thị trường chứng khoán( Stock Market), mà Service Broker cung cấp kỹ thuật hàng đợi và trao đổi thông điệp trong cơ sở dữ liệu SQL Server 2005. Service Broker được sử dụng cho ứng dụng trong Instance của cơ sở dữ liệu và cả những ứng dụng phân tán trên nhiều Instance. Các vấn đề chính sẽ được đề cập:  Service Broker làm được cái gì?  Lợi ích của Service Broker.  Sử dụng Service Broker trong ứng dụng. Phần 1. SERVICE BROKER LÀM ĐƢỢC CÁI GÌ? Như giới thiệu ở trên, Service Broker sẽ cung cấp chức năng trao đổi thông điệp giữa hai Instance của SQL Server, nó còn giúp cho người lập trình tạo ứng dụng độc lập và có thể tự quản lý các thành phần của chúng được gọi là dịch vụ. Những ứng dụng sử dụng dịch vụ này sẽ sử dụng thông điệp để trao đổi các Instance của SQL Server với nhau bằng cách dùng nghi thức truyền thông TCP/IP. Tóm lại, Service Broker giúp cho người lập trình xây dựng ứng dụng bất đồng bộ( Asynchronous) và được cài đặt một cách độc lập nhưng cùng thực thi một các vụ là để trao đổi tin nhắn. Sau đây là các bước mà Service Broker thực hiện trao đổi thông điệp giữa hai Instance của SQL Server. 2
  • 4. 1.1 Conversations Server Broker được thiết kế để thực hiện các chức năng cơ bản về việc gửi và nhận thông điệp. Mỗi định dạng trao đổi thông điệp đều được xác thực và nhất quán trong kênh giao tiếp. Ngoài ta, mỗi thông điệp và quá trình trao đổi theo một kiểu chỉ định do Service Broker bắt buộc để giúp cho người lập trình có thể tạo nên ứng dụng có độ tin cậy cao. Những phát biểu Transact-SQL được giới thiệu trong phiên bản SQL 2005 cho phép ứng dụng gửi và nhận thông điệp đáng tin cậy. Ứng dụng dùng để gửi thông điệp đến các dịch vụ được đặt tên ứng với tập các tác vụ liên quan, trong khi đó ứng dụng dùng để nhận thông điệp từ hàng đợi được trình bày bởi bảng dữ liệu. Những thông điệp của cùng một tác vụ thì chúng có cùng một giao tiếp. Trong một phần giao tiếp, Service Broker bảo đảm ứng dụng nhận thông điệp chính xác một lần theo thứ tự mà chúng được gửi. Chú ý: Cách tốt nhất để hiểu rõ về Service Broker là xem như dịch vụ gửi và nhận thư của bưu điện( Post Office), điều này có nghĩa là khi liên lạc với đồng nghiệp ở xa, bạn có thể giao tiếp với họ bằng cách gửi thư thông qua dịch vụ thư tín của bưu điện, thư của bạn sẽ gửi đến người nhần( bằng các phương tiện vận chuyển khác nhau) theo qui trình và thứ tự phân phát mà nhân viên bưu điện đã sắp xếp, đồng nghiệp của bạn có thể nhận được thư rồi đọc chúng và có thể viết thư để phúc đáp cho đến khi tác vụ liên quan được giải quyết. Với cơ chế này, thư sẽ được phân phát theo cơ chế không đồng bộ vì sự gửi hay phúc đáp của đồng nghiệp có thể dừng lại trong thời gian do bạn hay đồng nghiệp đang làm công việc khác với hình minh họa: 3
  • 5. Hình 1: Qui trình gửi và nhận thư. Trong đó, Post Office là bưu điện, Mail truck là xe vận chuyển thư và biểu tượng Mail ứng với hộp thư( Mail Box) Với dịch vụ gửi thư bằng bưu điện như trên thì những lá thư được ví như những thông điệp và dịch vụ Service Broker là địa chỉ để thư được người đưa thư chuyển đến. Tương tự như vậy, hàng đợi( Queue) chính là hộp thư nơi nắm giữ lá thư một khi chúng được gửi đến đúng địa chỉ người nhận. Như vậy, chương trình sử dụng Service Broker nắm giữ cuộc trao đổi với các chương trình khác thì được xem như phân phát thư. 1.2 Thứ tự và phối hợp thông điệp. Như cách giải thích ở trên, bạn sẽ không cần biết khi nào thì đồng nghiệp của bạn sẽ đọc thư hay viết thư để phản hồi; tương tự như vậy, ứng dụng mà bạn sử dụng trong Service Broker cũng không cần biết dịch vụ nhận xử lý thông điệp có sẵn sàng hay chưa. Do đó, Service Broker kiểm soát hàng đợi, kỹ thuật lập trình cơ sở dữ liệu thông thường với hai đặc điểm như sau: 1.2.1 Tích hợp giữa hàng đợi và cơ sở dữ liệu Tích hợp hàng đợi nghĩa là việc bảo trì và quản trị cơ sở dữ liệu chuẩn hóa phải bao gồm dịch vụ Service Broker. Đặc biệt người quản trị cơ sở dữ liệu không có lộ trình nào ứng vời tác vụ để bảo trì dịch vụ Service Broker, vì nó đã được bao gồ m trong cơ sở dữ liệu. 4
  • 6. 1.2.2 Quan hệ giữa hàng đợi và thông điệp Bộ khung của dịch vụ Service Broker cung cấp giao tiếp bằng phát biểu SQL đơn giản cho phép gửi và nhận cùng với việc kết hợp với quá trình phân phối và xử lý thông điệp. Service Broker đảm bảo chương trình khi nhận mỗi thông điệp trong cuộc đối thoại chỉ đúng một lần theo thứ tự chúng được gửi chứ không phải là thứ tự trong hàng đợi. Ngoài ra, Service Broker bảo đảm hai bộ đọc ứng với hai hàng đợi không thể đồng thời xử lý thông điệp trong cùng một cuộc đối thoại hay nhóm đối thoại. Khi chương trình khởi tạo một cuộc đối thoại cho mỗi tác vụ để giữ thông điệp đến dịch vụ nhận. Thông điệp chứa đựng dữ liệu được yêu cầu thực thi theo từng bước trong một tác vụ như nhận thông điệp, xử lý thông điệp và phản hồi trở lại cho dịch vụ khởi tạo nó. Cuộc đối thoại thật sự kết thúc phải tuân thủ quy tắc do người lập trình đưa ra. 1.3 Kỹ thuật không đồng bộ tác vụ Trong kiến trúc của Service Broker, thông điệp được gửi đi giữa các ứng dụng được cài đặt tính chuyển tắc và bất đồng bộ. Bởi vì, thông điệp bị lỗi thì toàn bộ hành động trong Service Broker sẽ phục hồi bao gồm cả hành động gửi và nhận thông điệp. Khi thông điệp gửi đi với cơ chế không đồng bộ, Database Engine sẽ kiểm soát quá trình phân phối trong khi ứng dụng vẫn tiếp tục thực thi các tác vụ khác. Kỹ thuật không đồng bộ sẽ giúp cho người lập trình tạo ra các ứng dụng có sử dụng hàng đợi. Hàng đợi cho phép cơ sở dữ liệu giữ nguyên trách nhiệm của người sử dụng hiện hành trong khi làm việc với các tài nguyên khác. Service Broker đưa ra hàng đợi như một phần tổng thể của Database Engine. 5
  • 7. Kỹ thuật hàng đợi cho phép ứng dụng thực thi công việc trên nhiều tác vụ khác nhau, khái niệm này được mở rộng trên nhiều Instance của SQL Server hay SQL Server trên nhiều Server. 1.4 Hỗ trợ ứng dụng độc lập Service Broker hỗ trợ ứng dụng độc lập cho phép gửi và nhận thông điệp độc lập với nhau, mặc dù những ứng dụng này có chung cơ chế trao đổi thông điệp và sử dụng kiến trúc tương tác giữa các dịch vụ với nhau. Những ứng dụng này chỉ cần chạy trong cùng một Instance của SQL Server và không nhất thiết cùng một thời điểm, đồng thời chúng không phụ thuộc vào vị trí vật lý. 1.5 Thành phần của Service Broker Service Broker có 3 thành phần: Đối thoại, định nghĩa dịch vụ, bảo mật và mạng. 1.5.1 Thành phần đối thoại Bao gồm đối thoại đơn và nhóm, dạng thông điệp. Ứng dụng trao đổi thông điệp được xem như một phần của đối thoại. Mỗi cuộc đối thoại thuộc trong nhóm đối thoại; nhóm đối thoại có thể chứa nhiều cuộc đối thoại. Đối thoại trong Service Broker là cuộc trao đổi thông điệp chính xác giữa hai người tham gia. 1.5.2 Phần định nghĩa dịch vụ Phần này là kiến trúc cơ bản của các cuộc đối thoại được sử dụng trong ứng dụng. Chúng bao gồm loại thông điệp dùng cho đối thoại, cơ sở dữ liệu dùng cho ứng dụng. 6
  • 8. 1.5.3 Phần mạng và bảo mật Phần mạng và bảo mật là hai thành phần cấu thành cơ hạ tần cho quá trình trao đổi thông điệp bên ngoài Instance của SQL Server, để hỗ trợ cho người quản trị có quyền quản lý sự thay đổi của môi trường, cấu hình thành phần độc lập của ứng dụng. Tóm lại, phần định nghĩa dịch vụ, mạng và bảo mật là thành phần siêu dữ liệu trong Instance của SQL Server, trong khi đó đối thoại đơn hay nhóm và thông điệp là phần dữ liệu của cơ sở dữ liệu chứa đựng nó. Phần 2. LỢI ÍCH CỦA SERVICE BROKER Service Broker cung cấp nhiều lợi ích cho ứng dụng cơ sở dữ liệu bao gồm: Tương tác cơ sở dữ liệu, thứ tự và phối hợp của thông điệp, tính độc lập và xử lý công việc uyển chuyển, khóa thông điệp và kích hoạt tự động. 2.1 Tƣơng tác cơ sở dữ liệu Tương tác cơ sở dữ liệu nâng cao khả năng thực thi và giúp việc quản trị trở nên đơn giản. Tương tác với SQL Server cho phép thực hiện tác vụ của một thông điệp cần sự phối hợp của các chuyển tác khác từ bên ngoài. Một ứng dụng nhận một hay nhiều thông điệp rồi xử lý và gửi chúng trong cơ sở dữ liệu. Nếu tác vụ này thất bại thì tất cả các tác vụ khác trong cùng một chuyển tác sẽ bị phục hồi trở lại trạng thái ban đầu. Đối với chức năng quản trị cũng được đơn giản hơn do dữ liệu và thông điệp chứa trong cơ sở dữ liệu một cách có hệ thống. Chú ý: Với hệ thống trao đổi thông điệp truyền thống, thông điệp được lưu trong cơ sở dữ liệu có thể trở nên không đồng nhất. Chẳng hạn, khi một thành phần được phục hồi từ bản sao( backup) thì các thành phần khác cũng được phục hồi từ chúng trong cùng một thời điểm; trong trường hợp ngược lại 7
  • 9. thì thông tin của thông điệp sẽ không trùng khớp với thông tin trong cơ sở dữ liệu; bởi vì Service Broker nắm giữ thông điệp và dữ liệu trong cùng cơ sở dữ liệu sẽ không đồng bộ. Môi trường phát triển thông thường cũng là một lợi ích của tương tác cơ sở dữ liệu. Phần thông điệp của cơ sở dữ liệu này và phần dữ liệu của ứng dụng khác có thể sử dụng chung ngôn ngữ và công cụ của SQL Server trong ứng dụng Service Broker, người phát triển ứng dụng có thể sử dụng kỹ thuật lập trình cho ứng dụng trao đổi thông điệp bằng thủ tục nội tại. Ngoài ra, các ứng dụng nằm ngoài cơ sở dữ liệu có thể phát triển bằng giao tiếp cơ sở dữ liệu như ADO.NET 2.2 Thứ tự và phối hợp của thông điệp Trong hệ thống thông điệp truyền thống, ứng dụng có trách nhiệm sắp xếp và phối hợp các thông điệp có thứ tự. Ví dụ, ứng dụng ABC gửi thông điệp thứ 1, 2 rồi thứ 3; ứng dụng XYZ nhận thông điệp thứ 1 và 3, nhưng lỗi phát sinh cho thông điệp thứ 2. Do đó, ứng dụng ABC sẽ gửi lại thông điệp thứ 2, như vậy thì thông điệp thứ 2 sẽ nhận theo thứ tự là sau thông điệp thứ 1 và 3. Trước đây, người lập trình có thể cho phép chờ cho đến khi nhận thông điệp thứ 2 sau khi nhạn được thông điệp thứ 1 bằng cách lưu thông điệp thứ 3 vào bộ nhớ cache( tương tự như cách xử lý đồng bộ)., Tuy nhiên, vấn đề cũng có thể xảy ra nếu ứng dụng XYZ nhận thông điệp thứ 2 nhưng phản hồi lại cho ứng dụng ABC với lý do thất lạc thông điệp, ứng dụng ABC tiếp tục gửi lại thông điệp thứ 2 và ứng dụng XYZ sẽ nhận thông điệp thứ 2 hai lần. Như vậy, chương trình sẽ loại bỏ khi thấy trùng lặp hay xử lý ghi đè. Đứng trên góc độ lập trình, cả hai giải pháp đều khó cài đặt. 8
  • 10. Phối hợp thông điệp cũng khó khăn khi trong kiểm soát, một ứng dụng có thể đệ trình hàng trăm đến hàng ngàn yêu cầu đến dịch vụ. Việc xử lý yêu cầu đòi hỏi phải mang tính song song và trả về kết quả với thời gian sớm nhất. Tất các giới hạn vừa trình bày ở trên đều được giải quyết bởi Serviec Broker từ việc kiểm soát thứ tự của thông điệp, phân phát duy nhất một lần và tự động nhận dạng đối thoại. Một khi cuộc đối thoại được thiết lập giữa hai điểm cuối của dịch vụ, ứng dụng sẽ nhận thông điệp chỉ một lần theo thứ tự mà chúng được gửi. 2.3 Tính độc lập và uyển chuyển trong xử lý Service Broker cung cấp cách xử lý độc lập giữa ứng dụng khởi tạo và ứng dụng đích. Một ứng dụng có thể gửi thông điệp vào hàng đợi và tiếp tục việc xử lý, phản hồi dựa vào Service Broker để bảo đảm thông điệp sẽ đến được ứng dụng đích. Với cơ chế uyển chuyển, ứng dụng dùng để khởi tạo sẽ gửi nhiều thông điệp và dịch vụ trong ứng dụng nhận sẽ xử lý song song phụ thuộc vào khối lượng công việc đang nắm giữ. 2.4 Khóa thông điệp liên quan Khóa thông điệp liên quan cho phép nhiều ứng dụng xử lý thông điệp từ hàng đợi không cần chỉ định tính đồng bộ. 2.5 Tự động kích hoạt Tự động kích hoạt cho phép ứng dụng điều chỉnh dung lượng của thông điệp đến hàng đợi. Service Broker cung cấp tính năng cho phép chương trình chạy trong và ngoài cơ sở dữ liệu có thể kích hoạt. Tuy nhiên, Service Broker không yêu cầu ứng dụng sử dụng kích hoạt này. 9
  • 11. Phần 3. SỬ DỤNG SERVICE BROKER TRONG ỨNG DỤNG Service Broker là dịch vụ rất mạnh cho phép bạn cài đặt chúng trong những ứng dụng có cơ chế xử lý không đồng bộ hay phân tán trên nhiều máy, chẳng hạn như: Trigger không đồng bộ, xử lý truy vấn có xác thực, đọc dữ liệu có xác thực, xử lý trên phía trình chủ đối với ứng dụng phân tán, hợp nhất dữ liệu cho trình khách và xử lý lô với qui mô lớn. Mặc dù có nhiều ứng dụng có thể sử dụng dịch vụ Service Broker của SQL Server 2005, chúng ta chỉ tìm hiểu ứng dụng cơ bản dùng để gửi và nhận thông điệp. Chú ý: Bạn có thể tìm thấy cách tạo hàng đợi, loại thông điệp, giao ước đối thoại và dịch vụ nhận và gửi thông điệp trong tập tin ServiceBroker.sql. Để làm điều này, trước tiên bạn kiểm tra cơ sở dữ liệu AccuntSystem đã cho phép cài đặt dịch vụ Service Broker hay chưa, nếu chưa thì sử dụng phát biểu SET với tùy chọn ENABLE_BROKER như ví dụ sau: Ví dụ 1: Khai báo kích hoạt dịch vụ Service Broker IF NOT EXISTS (SELECT *FROM sys.databases WHERE name = 'AccountSystem' AND is_broker_enabled = 1) BEGIN ALTER DATABASE AccountSystem SET ENABLE_BROKER; END; GO Để tạo hai dịch vụ Service Broker cho ứng dụng, bạn phải tạo hàng đợi cho dịch vụ khởi tạo với cú pháp như sau: 10
  • 12. Ví dụ 2: Khai báo hàng đợi cho dịch vụ khởi tạo CREATE QUEUE QueueForInitiator; GO Chú ý: Để kiểm tra hàng đợi có tên QueueForInitiator đã tồn tại hay chưa trong cơ sở dữ liệu AccountSystem, bạn có thể sử dụng phát biểu như sau: Ví dụ 3: Khai báo kiểm tra hàng đợi QueueForInitiator IF OBJECT_ID('[dbo].[QueueForInitiator]') IS NOT NULL AND EXISTS(SELECT* FROM sys.objects WHERE object_id = OBJECT_ID('[dbo].[ QueueForInitiator]') AND type = 'SQ') BEGIN DROP QUEUE [dbo].[ QueueForTarget]; END; GO Tương tự như vậy, bạn tiếp tục tạo hàng đợi cho dịch vụ đích với cú pháp sau: Ví dụ 4: Khai báo hàng đợi cho dịch vụ đích CREATE QUEUE QueueForTarget; GO Tương tự như trên, để kiểm tra hàng đợi có tên QueueForTarget đã có tồn tại hay chưa trong sơ sở dữ liệu AccountSystem, bạn có thể sử dụng phát biểu như sau: 11
  • 13. Ví dụ 5: Khai báo kiểm tra hàng đợi QueueForTarget IF OBJECT_ID('[dbo].[QueueForTarget]') IS NOT NULL AND EXISTS(SELECT* FROM sys.objects WHERE object_id = OBJECT_ID('[dbo].[ QueueForTarget]') AND type = 'SQ') BEGIN DROP QUEUE [dbo].[ QueueForTarget]; END; GO Sau khi thực thi phát biểu CREATE QUEUE trong hai ví dụ trên, bạn có thể tìm thấy hai đối tượng hàng đợi xuất hiện trong ngăn Service Broker | Queue của cơ sở dữ liệu AccountSystem như hình 2: Hình 2: Hàng đợi 12
  • 14. Chú ý: Hai hàng đợi vừa được tạo là nơi lưu trữ thông điệp. Tiếp theo, bạn khai báo để tạo loại thông điệp dùng cho ứng dụng này với cú pháp như sau: Ví dụ 6: Khai báo loại thông điệp CREATE MESSAGE TYPE HelloWorldMessage VALIDATION = WELL_FORMED_XML; GO Chú ý: Bạn có thể sử dụng phát biểu như ví dụ kế tiếp sau đây để kiểm tra loại thông điệp có tên HelloWorldMessage đã tồn tại trong cơ sở dữ liệu hay chưa. Ví dụ 7: Khai báo kiểm tra loại thông điệp HelloWorldMessage IF EXISTS (SELECT * FROM sys.service_message_types WHERE name= 'HelloWorldMessage') BEGIN DROP MESSAGE TYPE HelloWorldMessage; END; GO Sau khi thực thi phát biểu trong ví dụ trên, bạn có thể tìm thấy loại thông điệp tạo ra nó có tên HelloWorldMessage nằm trong ngăn Message Types như hình 3: 13
  • 15. Hình 3: Loại thông điệp Tương tự như trên, bạn tiếp tục khai báo để tạo ra giao ước có tên ContractForHelloWorld cho phép bất kỳ ứng dụng nào tham gia vào cuộc đối thoại có thể gửi được loại thông điệp này. Ví dụ 8: Khai báo tạo ràng buộc CREATE CONTRACT ContractForHelloWorld (HelloWorldMessage SENT BY INITIATOR); GO Chú ý: Bạn có thể sử dụng phát biểu như trong ví dụ sau đây để kiểm tra giao ước này đã tồn tại trong cơ sở dữ liệu AccountSystem hay chưa. Ví dụ 9: Khai báo kiểm tra giao ước ContractForHelloWorld IF EXISTS (SELECT * FROM sys.service_contracts WHERE name = 'ContractForHelloWorld') BEGIN DROP CONTRACT ContractForHelloWorld; END; GO 14
  • 16. Bạn có thể tìm thấy ContractForHelloWorld trong ngăn Contracts như hình 4: Hình 4: Giao ước sử dụng cho loại thông điệp. Kế đến, bạn cài đặt hai dịch vụ Service Broker ứng với dịch vụ khởi tạo có tên InitiatorService như ví dụ: Ví dụ 10: Khai báo tạo dịch vụ InitiatorService CREATE SERVICE InitiatorService ON QUEUE [dbo].[QueueForInitiator]; GO Chú ý: Để kiểm tra dịch vụ Service Broker có tên InitiatorService đã tồn tại hay chưa ta sử dụng phát biểu như ví dụ sau: Ví dụ 11: Khai báo kiểm tra dịch vụ InitiatorService IF EXISTS (SELECT * FROM sys.services WHERE name = 'InitiatorService') BEGIN DROP SERVICE InitiatorService; END; GO 15
  • 17. Do dịch vụ đích dùng cho đối thoại giao ước, nên bạn tạo dịch vụ có tên TargetService có chỉ định giao ước ContractForHelloWorld bằng cách khai báo như ví dụ: Ví dụ 12: Khai báo tạo dịch vụ TargetService CREATE SERVICE TargetService ON QUEUE [dbo].[QueueForTarget] (ContractForHelloWorld); GO Chú ý: Để kiểm tra dịch vụ Server Broker có tên TargetService đã tồn tại hay chưa bạn sử dụng phát biểu ví dụ: Ví dụ 13: Khai báo kiểm tra dịch vụ TargetService IF EXISTS (SELECT * FROM sys.services WHERE name = 'TargetService') BEGIN DROP SERVICE TargetService; END; GO Sau khi tạo dịch vụ khởi tạo và đích thành công, bạn có thể tìm thấy dịch vụ này xuất hiện trong ngăn Service Broker | Service. Để gửi thông điệp, bạn cần khai báo đoạn phát biểu SQL để bắt đầu chuyển tác cho cuộc đối thoại rồi gửi thông điệp đến dịch vụ có tên TargetService như ví dụ: 16
  • 18. Hình 5: Dịch vụ khởi tạo và đích. Ví dụ 14: Khai báo gửi thông điệp -- Bắt đầu chuyển tác BEGIN TRANSACTION -- Khai báo biến XML DECLARE @message XML; -- Gán giá trị cho biến XML SET @message = N'<message>Hello World!</message>'; -- Khai báo biến kiểm soát đối thoại DECLARE @conversationHandler UNIQUEIDENTIFIER; -- Khai báo bắt đầu đối thoại BEGIN DIALOG CONVERSATION @conversationHandler -- Khai báo chỉ định đối thoại từ InitiatorService FROM SERVICE InitiatorService -- Khai báo chỉ định đối thoại đến TargetService TO SERVICE 'TargetService' 17
  • 19. -- Khai báo chỉ định giao ước đối thoại ON CONTRACT ContractForHelloWorld WITH ENCRYPTION = OFF; -- Khai báo gửi thông điệp SEND ON CONVERSATION @conversationHandler MESSAGE TYPE HelloWorldMessage(@message); END CONVERSATION @conversationHandler; COMMIT TRANSACTION; GO Để kiểm tra thông điệp đang nằm trong hàng đợi, bạn khai báo phát biểu SELECT như ví dụ sau: Ví dụ 15: Khai báo đọc thông điệp trong hàng đợi SELECT service_name, service_contract_name, Message_type_name, message_body FROM [dbo].[QueueForTarget] GO Kết quả trình bày( như hình 6) khi thực hiện phát biểu SELECT trong ví dụ trên. Hình 6: Thông điệp trong hàng đợi. Để đọc thông điệp gửi đến TargerService từ InitiatorService, bạn khai báo phát biểu SQL với cấu trúc như sau: 18
  • 20. Ví dụ 16: Khai báo nhận thông điệp WHILE( 1 = 1) BEGIN -- Khai báo biến DECLARE @conversation_handler UNIQUEIDENTIFIER, @conversation_group_id UNIQUEIDENTIFIER, @message_body XML, @message_type_name NVARCHAR(128); BEGIN TRANSACTION -- Sử dụng phát biểu WAITFOR WAITFOR( GET CONVERSATION GROUP @conversation_group_id FROM [dbo].[QueueForTarget]), TIMEOUT 500; IF @conversation_group_id IS NULL BEGIN ROLLBACK TRANSACTION; BREAK; END; WHILE 1 = 1 BEGIN -- Sử dụng phát biểu RECEIVE ðể nhận thông ðiệp RECEIVE TOP(1) @conversation_handler = conversation_handle, @message_type_name = message_type_name, 19
  • 21. @message_body = CASE WHEN validation = 'X' THEN CAST(message_body AS XML) ELSE CAST(N'<none/>' AS XML) END FROM [dbo].[QueueForTarget] WHERE conversation_group_id = @conversation_group_id; IF @@ROWCOUNT = 0 OR @@ERROR <> 0 BREAK; SELECT 'Conversation Group Id' = @conversation_group_id, 'Conversation Handler' = @conversation_handler, 'Message Type Name' = @message_type_name, 'Message Body' = @message_body; IF @message_type_name = 'http://schemas.microsoft.com/SQL/SeviceBroker/EndDialog' OR @message_type_name = 'http://schemas.microsoft.com/SQL/SeviceBroker/Error' BEGIN END CONVERSATION @conversation_handler; END; END; COMMIT TRANSACTION; END; 20
  • 22. Khi thực thi phát biểu trong ví dụ trên, kết quả nhận được trình bày như hình 7: Hình 7: Nhận thông điệp Như vậy, khi bạn truy vấn dữ liệu trong bảng QueueForTarget, lập tức thông điệp trong hàng đợi QueueForTarget biến mất, bạn có thể kiểm tra lại bắng cách thực thi phát biểu như trong Ví dụ 13. Phần 4. KẾT LUẬN Từ bối cảnh lập trình, các thành phần cơ sở hạ tầng được tạo ra. Sau đó, để bắt đầu ứng dụng service một cuộc trò chuyện được bắt đầu, các thông điệp ở định dạng XML được gửi như các loại tin nhắn cụ thể cho một danh sách cụ thể, sau đó các thông điệp được tiếp nhận và xử lí. Tại bất kì thời điểm nào ứng dụng service broker có thể nhận được đọc và viết cùng một hàng đợi cũng như có nhiều ứng dụng service broker cư trú trong cùng một cơ sở dữ liệu. Phần 5. TÀI LIỆU THAM KHẢO  Donahoo, Speegle, SQL – Practical Guide for Developers, Morgan Kaufmann  Robin Dewson, Beginning SQL Server 2005 for Developers, Apress  Brian Knight, Professional SQL Server 2005 Administration, Wrox  SQL Server 2005 – Lập trình nâng cao, NXB Lao Động – Xã Hội 21