Tải bản đầy đủ (.pdf) (9 trang)

Báo cáo nghiên cứu khoa học: " ỨNG DỤNG THÔNG BÁO TRUY VẤN VÀ XỬ LÝ KHÔNG ĐỒNG BỘ ĐỂ XÂY DỰNG TRANG .ASPX" docx

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (445.99 KB, 9 trang )

TẠP CHÍ KHOA HỌC VÀ CÔNG NGHỆ, ĐẠI HỌC ĐÀ NẴNG - SỐ 5(40).2010

296
ỨNG DỤNG THÔNG BÁO TRUY VẤN VÀ XỬ LÝ KHÔNG ĐỒNG BỘ
ĐỂ XÂY DỰNG TRANG .ASPX
USING QUERY NOTIFICATION AND ASYNCHRONOUS PROCESSING
FOR BUILDING .ASPX WEB PAGES

Nguyễn Trần Quốc Vinh
Trường Đại học Kinh tế, Đại học Đà Nẵng

TÓM TẮT
Thông thường, máy chủ web phải thường xuyên truy vấn đến hệ quản trị cơ sở dữ
liệu, kể cả khi không có sự thay đổi dữ liệu nào. Ngoài ra, hầu hết các trang web được xây
dựng dựa trên kỹ thuật xử lý đồng bộ, trình duyệt phải thường xuyên chủ động gửi yêu cầu
đến máy chủ web để truy vấn nội dung mới. Tương ứng, máy chủ web phải thường xuyên xử

lý các yêu cầu và trả lời trình duyệt ngay lập tức. Những hạn chế đó làm giảm mạnh khả
năng phản hồi của máy chủ web và thậm chí hệ quản trị cơ sở dữ liệu. Bài viết giới thiệu về
kỹ thuật thông báo truy vấn trong SQL Server và kỹ thuật xử lý không đồng bộ các yêu cầu
của ASP.NET. Trên cơ sở đó, bài viết đề nghị cách thức ứng d
ụng có cải tiến các kỹ thuật đó
để xây dựng các trang web cập nhật dữ liệu theo thời gian thực và đáp ứng số lượng lớn yêu
cầu đồng thời.
ABSTRACT
It is a commonplace that a web server frequently queries the database management
system even though there are no data change at that time. Additionally, most of the web pages
are built on the synchronous handler technique so the web browsers must periodically send
requests to the web server for new contents. Correspondingly, the web server must process
those requests and answer the browsers immediately. These disadvantages reduce responsive
abilities of the web server and even the database management system. This paper presents a


query notification technique in the SQL Server and techniques for the request asynchronous
processing in ASP.NET programming. In addition, an approach to the improved applications of
those techniques to the building of the ASP.NET web pages with real-time data refreshment to
meet the requirement of great numbers of concurrent requests is also offered.
1. Đặt vấn đề
Thông thường, khi xuất hiện một yêu cầu (request, YC) từ trình duyệt, máy chủ
web (MCW) sẽ truy vấn dữ liệu từ hệ quản trị cơ sở dữ liệu (CSDL). Từ kết quả truy
vấn dữ liệu, MCW sẽ chuẩn bị kết quả và trả lời trình duyệt. Kết quả đó có thể chứa
toàn bộ nội dung kết quả truy vấn, cũng có thể chỉ chứa những khác biệt giữa hai lần
truy vấn cuối cùng. Nếu nó chỉ chứa những khác biệt, MCW phải thực hiện việc so sánh
các kết quả của hai lần truy vấn khác nhau. Trong mọi trường hợp, số lần hệ quản trị
CSDL đều phải thực thi truy vấn tỉ lệ thuận với số lần MCW nhận được YC từ trình
duyệt. Nếu không có sự thay đổi dữ
liệu nào giữa hai lần truy vấn cuối cùng, việc thực
thi truy vấn của hệ quản trị CSDL và việc so sánh các kết quả truy vấn là vô nghĩa, thậm
TẠP CHÍ KHOA HỌC VÀ CÔNG NGHỆ, ĐẠI HỌC ĐÀ NẴNG - SỐ 5(40).2010

297
chí, có thể nói là tiêu cực đối với cả hệ quản trị CSDL và MCW. Kỹ thuật thông báo
truy vấn (query notification) của SQL Server có thể giúp giải quyết vấn đề này.
Với các trang web nói chung và các trang web ASPX (ASP.NET) nói riêng được
xây dựng theo cách thông thường, trình duyệt phải thường xuyên gửi YC đến MCW
một cách tuần hoàn để có được nội dung mới nhất của một trang hoặc một phần trang
web, kể cả khi không có bất kỳ sự thay đổi dữ liệu nào giữa hai lần YC. Máy chủ web
phải thường xuyên tiếp nhận, xử lý các YC đó và trả lại kết quả chứa nội dung có thể
hoàn toàn trùng lặp với nội dung hiện tại của trang web. Thường các trang web này
được lập trình dựa trên cách thức xử lý đồng bộ các YC dẫn đến khả năng xử lý đồng
thời các YC của MCW giới hạn trong số chỉ đến hàng chục. Ngay cả khi các YC được
xử lý dựa trên kỹ thuật không đồng bộ – một kỹ thuật hầu như không được lập trình
viên chú ý đến, sự mở rộng về giới hạn số lượng YC được xử lý đồng thời cũng chưa

phải thực sự lớn vì gặp phải giới hạn về số lượng tiến trình.
Bài viết giới thiệu về kỹ thuật thông báo truy vấn trong hệ quản trị CSDL SQL
Server, kỹ thuật xử lý không đồng bộ các YC trong lập trình ASP.NET và đề nghị cách
thức ứng dụng có cải tiến các kỹ thuật đó để xây dựng các trang web cập nhật dữ liệu
theo thời gian thực, “chủ động” từ phía MCW ngay khi có thay đổi trong CSDL và đáp
ứng đồng thời số lượng lớn, có thể lên đến hàng ngàn YC.
2. Các kỹ thuật cơ bản
2.1 Cập nhật đồng bộ theo yêu cầu của trình duyệt
2.1.1 Làm tươi toàn bộ trang web
Trong các trình duyệt web, để làm tươi một trang web, thông thường người dùng
sẽ bấm phím F5 để chọn lệnh Refresh. Khi đó, trình duyệt sẽ gửi YC đến MCW để
được nhận nội dung mới nhất của toàn bộ trang web. Ngoài ra, lập trình viên có thể cài
đặt để trình duyệt tự động làm tươi toàn bộ trang web thông qua các bộ đếm thời gian.
Khi nhận được YC làm tươi toàn bộ trang web, MCW sẽ thực hiện việc xử lý
cho toàn bộ trang web và trả lại kết quả này cho trình duyệt. MCW phải thực hiện nhiều
xử lý, thường là không cần thiết vì những phần nội dung mới này không khác so với nội
dung cũ tương ứng, trong khi vẫn yêu cầu tài nguyên hệ thống của máy chủ và cả băng
thông mạng cũng có thể bị ảnh hưởng. Để giải quyết vấn đề này, người ta đưa vào sử
dụng công nghệ AJAX (Asynchronous JavaScript and XML) [1– 4]. Công nghệ này cho
phép trình duyệt chỉ làm tươi những phần nhỏ, chứ không nhất thiết phải làm tươi toàn
bộ trang web.
2.1.2 Ajax UpdatePanel trong Visual Studio
Một trong những môi trường lập trình web, có thể nói và phổ biến nhất là
Microsoft Visual Studio có tích hợp AJAX. Cụ thể, từ phiên bản 2008 trở đi, có tích
hợp nhóm công cụ gọi là AJAX Extensions, trong đó có công cụ UpdatePanel. Trang
web có thể được chia thành nhiều phần nhỏ. Mỗi phần nhỏ đó có thể là một Update
Panel. Update Panel cho phép làm tươi chỉ phần trang web nằm trên nó theo kịch bản:
TẠP CHÍ KHOA HỌC VÀ CÔNG NGHỆ, ĐẠI HỌC ĐÀ NẴNG - SỐ 5(40).2010

298

Trình duyệt gửi YC làm tươi phần trang web nằm trên UpdatePanel đến MCW. Khi
nhận được YC này, MCW thực hiện xử lý phần trang web tương ứng và gửi phần web
này đến trình duyệt web.
Phụ thuộc vào các chế độ khác nhau, việc gửi YC làm tươi phần trang web thuộc
một UpdatePanel đến MCW có thể được thực hiện khi xảy ra sự kiện gọi lệnh làm tươi
từ chính nó, hoặc một thành phần khác của trang web, hoặc một UpdatePanel khác chứa
nó được lệnh làm tươi, hoặc điều kiện cho việc làm tươi xuất hiện.
2.1.3 Ajax chỉ cập nhật dữ liệu
Rõ ràng, cách tiếp cận kiểu UpdatePanel giúp tăng đáng kể tốc độ duyệt web, cụ
thể là làm giảm đáng kể việc xử lý cũng như vẽ lại trang web của trình duyệt, làm giảm
đáng kể việc xử lý và sử dụng nguồn của MCW, cũng như làm giảm đáng kể khối lượng
thông tin được truyền tải qua mạng khi người dùng duyệt web. Tuy nhiên, cách tiếp cận
này vẫn có thể được cải thiện. Thay vì gửi đến MCW YC làm tươi một phần trang web,
cụ thể là phần thuộc về một UpdatePanel, trình duyệt chỉ gửi YC làm tươi những dữ liệu
liên quan đến phần trang web đó. Khi nhận được dữ liệu mới, thường là các tập được định
dạng theo chuẩn XML hoặc JSON, các JavaScript sẽ phân tích và cập nhật lên phần trang
web cần cập nhật. Việc vẽ lại giao diện trang web được thực hiện trên trình duyệt. Cách
tiếp cận này được minh hoạ như là một kỹ thuật thể hiện dữ liệu theo thời gian thực [2].
Thông thường, việc cập nhật được tiến hành một cách tự động và tuần hoàn theo
một chu kỳ nào đó. Ví dụ, quan sát và phân tích một số trang web thể hiện thông tin
giao dịch chứng khoán, không khó để thấy rằng, kể cả khi không có thay đổi dữ liệu
nào, có thể trình duyệt vẫn gửi YC cập nhật đến MCW một cách tuần hoàn; MCW vẫn
phải tiếp nhận các YC, xử lý và gửi lại kết quả xử lý các YC cho trình duyệt. Trình
duyệt vẫn nhận các tập dữ liệu từ MCW một cách tuần hoàn. Như trên hình 1, các tập
dữ liệu funcPrice.aspx, funcOTC_DNSC.aspx và funcPUTAD_EXEC.aspx được MCW
gửi đến trình duyệt cứ sau mỗi 5s. Với lý luận thông tin giao dịch chứng khoán thay đổi
thường xuyên với tần suất cao trong khoảng thời gian có thể xảy ra giao dịch thực tế
trong ngày theo quy định, một số các trang web thể hiện thông tin giao dịch chứng
khoán khác chỉ “bật” tính năng tự động gửi YC làm tươi dữ liệu một cách tuần hoàn vào
những khoảng thời gian xảy ra giao dịch thực tế là hợp lý. Tuy nhiên, trong những

khoảng thời gian đó, cho dù không xảy ra một sự thay đổi dữ liệu nào, trình duyệt vẫn
tự động gửi YC cập nhật, nhận và xử lý các tập dữ liệu “cũ” từ MCW. Như thế, đặc biệt
trong trường hợp các trang web thể hiện dữ liệu thay đổi với tần suất không cao, nguồn
của hệ thống nói chung bị hao phí, có thể là một khoản rất lớn, mà không mang lại lợi
ích nào cả.
2.2 Kỹ thuật xử lý không đồng bộ
Cách thức xử lý các YC như đã đề cập trên đây của MCW được gọi là xử lý
đồng bộ dùng giao diện IHttpHandler của thư viện ASP.NET [5]. IIS 6 giới hạn số
lượng các tiến trình, còn IIS 7 giới hạn số lượng các YC đồng thời. Mỗi tiến trình xử lý
TẠP CHÍ KHOA HỌC VÀ CÔNG NGHỆ, ĐẠI HỌC ĐÀ NẴNG - SỐ 5(40).2010

299
Hình 1. Trang thể hiện thông tin
giao dịch chứng khoán
một YC. Đối với mỗi MCW, chỉ một số lượng giới hạn
tiến trình có thể được thực thi đồng thời. Mỗi trình xử lý
đồng bộ sẽ kéo theo một quá trình xử lý bên ngoài – tiến
trình xử lý tạo ra kết quả để trả lại cho trình duyệt. Nếu
quá nhiều người dùng YC các trình xử lý HTTP đồng
bộ, ASP.NET và có thể cả hệ điều hành sẽ nhanh chóng
vượt giới hạn về số lượng tiến trình, bởi vì có quá nhiều
tiến trình bị khoá và chờ đợi kết quả thực thi các quá trình xử lý bên ngoài.
Nếu chỉ xử lý đồng bộ các YC, số lượng truy cập đồng thời đến trang web sẽ
được giới hạn trong số lượng YC tối đa có thể tiếp nhận cũng như số lượng tiến trình có
thể xử lý đồng thời tối đa đã được cấu hình cho MCW. Các con số này thường chỉ lên
đến hàng chục.
Một cách tiếp cận khác, đó là dùng các trình xử lý HTTP không đồng bộ
(Asynchronous HTTP Handler) bằng cách triển khai giao diện IHTTPAsynHandler của
thư viện ASP.NET [5–8]. Các trình xử lý không đồng bộ phải được đăng ký trong tệp
cấu hình của MCW giống như các trình xử lý đồng bộ. Trong xử lý không đồng bộ, khi

xuất hiện một YC, một tiến trình T – AsyncHandler xử lý nó sẽ bắt đầu bằng việc gọi
phương thức BeginProcessRequest. Ở bước này, tiến trình T sẽ tạo ra một đối tượng
AsyncRequestState chứa thông tin về YC và sẽ khởi chạy một tiến trình khác T’ thực
hiện một công việc kéo dài về mặt thời gian và không phụ thuộc vào ThreadPool. Tiến
trình T’ này được chuyển giao cho ASP.NET xử lý. Còn T, nó sẽ trả lại ngay lập tức về
ThreadPool với trạng thái “Pending” và ThreadPool được giải phóng. T ở trong trạng
thái đó cho đến khi nhận được một callback – tín hiệu kết thúc quá trình xử lý từ tiến
trình xử lý bên ngoài T’ và YC kết thúc. Khi đó, trả lời cho YC được giữ trong bộ nhớ
và chờ đợi cho đến khi tiến trình kết thúc. Điều này ngăn không cho phép khoá tiến
trình và nâng cao năng suất của hệ thống [5]. Rõ ràng, số lượng YC được xử lý đồng
thời lúc này có thể lớn hơn số lượng các tiến trình. IIS thường xuyên kiểm tra số lượng
YC đang được xử lý, nếu vượt quá giới hạn, nó sẽ đưa YC vào hàng đợi. Hàng đợi này
thường được cấu hình để có thể tiếp nhận số lượng YC tối đa tuỳ thuộc vào khả năng xử
lý của MCW. Khi số YC vượt quá giới hạn, IIS sẽ đưa ra thông báo lỗi HTTP 503:
MCW quá bận. Nếu số lượng YC đang xử lý chưa vượt giới hạn, IIS sẽ tiếp nhận YC
tiếp theo.
Ở pha thứ hai, việc gọi EndRequest đánh dấu sự kết thúc của YC. Khi đó, kết
quả xử lý YC sẽ được chuẩn bị và gửi đến trình duyệt. Nội dung trả lời có thể được
chuẩn bị trong suốt khoảng thời gian từ khi gọi BeginProcessRequest cho đến khi
EndProcessRequest được gọi.
Cách thức xử lý YC như ở pha thứ nhất gây cảm giác bất lợi, vì rằng YC của
người dùng không được thực hiện nhanh chóng hơn. Trang web, theo đó là trình duyệt
và người dùng cuối, vẫn phải chờ kết quả xử lý từ tiến trình trên máy chủ kết thúc. Như
vậy, đối với mỗi người dùng cuối cụ thể thì không có bất cứ lợi ích rõ ràng nào. Tuy
TẠP CHÍ KHOA HỌC VÀ CÔNG NGHỆ, ĐẠI HỌC ĐÀ NẴNG - SỐ 5(40).2010

300
nhiên, đối với tất cả thì có lợi, kết quả xử lý sẽ nhanh hơn đối với tất cả, vì sẽ giảm đáng
kể khả năng ThreadPool của MCW bị quá tải về tiến trình dẫn đến làm chậm hệ thống,
thậm chí bị treo.

Sau khi nhận được trả lời, trình duyệt lặp lại gửi YC đến MCW. Như vậy, có thể
kết quả thực thi truy vấn không hề thay đổi giữa các lần gửi YC khác nhau của trình
duyệt. Nhưng MCW vẫn phải tiếp nhận YC và xử lý.
Cũng dễ thấy trong xử lý không đồng bộ, tiến trình xử lý bên ngoài T’ vẫn phải
luôn luôn nằm trong trạng thái hoạt động và chờ đợi sự kiện thay đổi dữ liệu. Khi số
lượng tiến trình này đủ lớn, có khả năng chúng vẫn sẽ ảnh hưởng tiêu cực đến công việc
của MCW.
2.3 Thông báo truy vấn trong SQL Server
Tính năng thông báo truy vấn được đưa vào SQL Server 2005 cùng với
ADO.NET 2.0 [9] cho phép ứng dụng yêu cầu một thông báo từ SQL Server khi kết quả
thực thi một truy vấn thay đổi. Với kỹ thuật này, ứng dụng chỉ truy vấn dữ liệu khi nào
có thay đổi trong CSDL dẫn đến thông báo về việc thay đổi so với kết quả truy vấn lần
kế trước mà ứng dụng đã nhận được. Chẳng hạn, một trang web thể hiện bảng đơn giá
các mặt hàng được lưu trong bộ nhớ của MCW. Khi đơn giá hoặc danh sách mặt hàng
thay đổi trong CSDL, trình xử lý sự kiện trong ứng dụng sẽ nhận sự kiện thông báo và
xoá bộ nhớ. Sau đó, khi người dùng yêu cầu trang web, MCW sẽ truy vấn bảng giá hiện
thời và tái thực hiện đăng ký thông báo. Nếu đơn giá chưa thay đổi trong CSDL, MCW
sẽ không nhận được thông báo và vẫn sử dụng bảng giá trong bộ nhớ để trả lời các YC
của người dùng. Như vậy, thay vì viết mã nguồn để thực thi tuần hoàn một truy vấn để
đảm bảo kết quả là hiện tại, lập trình viên có thể thiết kế các ứng dụng tự động được
thông báo khi kết quả thực thi truy vấn đã bị lỗi thời.
Hệ quản trị CSDL dùng các “thuê bao” thông báo để theo dõi các YC
thông báo truy vấn. Khi xuất hiện một l
ệnh thực thi bởi đối tượng SqlCommand
bao gồm truy vấn kèm với đối tượng thông báo truy vấn, hoặc
SqlDependency hoặc SqlNotificationRequest, CSDL sẽ đăng ký YC giống như là một
“thuê bao thông báo” và sau đó thực thi truy vấn. Hệ quản trị CSDL dùng Service
Broker để chuyển tải các thông điệp thông báo. Vì thế, Service Broker cần phải được
kích hoạt cho CSDL để có thể sử dụng dịch vụ thông báo truy vấn. Ngoài ra, để một tài
khoản có thể đăng ký và nhận các thông báo truy vấ

n, cần phải cung cấp quyền
SUBSCRIBE QUERY NOTIFICATIONS cho tài khoản đó [9].
Mỗi thuê bao thông báo truy vấn có một vòng đời tối đa riêng biệt có thể thiết
lập được. Sau vòng đời tối đa đó, SQL Server xoá bỏ thuê bao và tạo ra một thông điệp
thông báo cho ứng dụng, rằng thông báo không còn được kích hoạt nữa, và SQL Server
không còn theo dõi các thay đổi đối với truy vấn. Mỗi thông điệp nói chung bao gồm
nguyên nhân dẫn đến thông điệp được tạo ra và thông báo bao gồm cả thời điểm thông
báo được sản sinh.
TẠP CHÍ KHOA HỌC VÀ CÔNG NGHỆ, ĐẠI HỌC ĐÀ NẴNG - SỐ 5(40).2010

301
Thông báo truy vấn hoạt động dựa trên công nghệ khung nhìn thực (indexed
view), công nghệ được đưa vào SQL Server một cách đầy đủ từ phiên bản 2005. Thông
báo truy vấn chỉ chấp nhận những truy vấn thoả mãn các điều kiện giống như các điều
kiện đối với các truy vấn để tạo khung nhìn thực [10]. Công nghệ khung nhìn thực
không làm việc theo cách thực thi truy vấn một cách tuần hoàn và so sánh kết quả của
hai lần thực thi cuối cùng để đưa ra kết luận về sự thay đổi – một kỹ thuật quá thô sơ và
không hiệu quả. Công nghệ khung nhìn thực sử dụng nhiều kỹ thuật khác nhau để phân
tích mỗi lệnh thao tác dữ liệu (insert, update, delete) nhằm xác định một thay đổi dữ liệu
nào đó có thể dẫn đến thay đổi kết quả thực thi truy vấn hay không.
Rõ ràng, thông báo truy vấn hữu ích cho cả các ứng dụng lưu trữ dữ liệu trong
bộ nhớ truy cập nhanh (cache) và cả SQL Server. Một khi máy chủ CSDL bị quá tải,
SQL Server có thể sản sinh ra một thông điệp thông báo truy vấn cho mỗi thuê bao.
Như thế có lợi hơn so với việc ứng dụng thực thi truy vấn nhiều lần và so sánh các kết
quả để xác định xem các kết quả của truy vấn có thay đổi hay không.
3. Cập nhật “chủ động” từ phía MCW khi dữ liệu nguồn thay đổi
Trong mục này, tác giả sẽ trình bày về sự cải tiến kỹ thuật xử lý không đồng bộ
các YC, đồng thời ứng dụng kỹ thuật thông báo truy vấn để thực hiện việc cập nhật
“chủ động” từ phía MCW khi có sự thay đổi dữ liệu trong CSDL. Cải tiến kỹ thuật xử
lý không đồng bộ các YC theo công nghệ AJAX trên MCW để trình duyệt trên máy

trạm không cần phải gửi đến máy chủ các YC kiểm tra sự thay đổi của dữ liệu một cách
tuần hoàn với tần suất cao. Trình duyệt chỉ gửi một YC sau mỗi lần nhận kết quả xử lý
YC trước đó từ MCW tương ứng với mỗi thay đổi dữ liệu trong CSDL hoặc sau một
khoảng thời gian dài cho trước nào đó không có sự thay đổi dữ liệu nào.
Việc xử lý một phần trang web diễn ra theo kịch bản gồm hai pha như sau.
Pha th
ứ nhất. Tiếp nhận YC. Như trên hình 2, các javascript sẽ gửi YC AJAX từ
trình duyệt đến MCW để truy vấn những thay đổi dữ liệu tương ứng với một phần hay
toàn bộ trang web. MCW tiếp nhận YC, đăng ký nó vào cuối LIST-QUEUE. LIST-
QUEUE là một đối tượng kiểu danh sách và được khai báo trong trình xử lý không đồng
bộ. IHTTPAsyncHandler thừa kế thuộc tính bool IsReusable từ IHTTPHandler. Nếu
thuộc tính này được thiết lập để trả lại giá trị True, thì một phiên bản của trình xử lý sẽ
TẠP CHÍ KHOA HỌC VÀ CÔNG NGHỆ, ĐẠI HỌC ĐÀ NẴNG - SỐ 5(40).2010

302
được sử dụng lại cho tất cả các YC cùng một loại, thay vì mỗi phiên bản cho mỗi YC
trong trường hợp IsReusable trả lại giá trị False. Nhờ đó, ta có thể đăng ký các YC vào
LIST-QUEUE. Trong trường hợp này, việc lập trình sẽ được đòi hỏi phải khắt khe hơn
để đảm bảo tính ổn định của hệ thống, nhưng nó cho phép MCW “tạm dừng” việc xử lý
một cách vô ích các YC hoặc “tạm dừng” chờ đợi kết quả xử lý YC để tiếp nhận các YC
tiếp theo. Việc “tạm dừng” trên mỗi YC cho phép giảm một đơn vị trong tổng số tiến
trình đang được thực thi.
Pha thứ hai. Trả lời YC. Như trên hình 3, ở pha này có thể xảy ra một trong hai
trường hợp.
a) Một số trình duyệt hỗ trợ các đối tượng XMLHttpRequest bao gồm thuộc tính
timeout [11] hoặc bằng các cách thức khác nhau, lập trình viên có thể quy định khoảng
thời gian tối đa trình duyệt sẽ chờ kết quả xử lý YC từ MCW. MCW phải trả lại kết quả
xử lý YC cho trình duyệt trong khoảng thời gian này, nếu không, trình duyệt sẽ hiểu
như là “MCW không còn hoạt động”. Một tiến trình CheckTimeOut luôn luôn trong
trạng thái hoạt động, kiểm tra phần tử – YC đầu tiên của LIST-QUEUE. Nếu YC này đã

nằm trong LIST-QUEUE vượt quá thời gian đã cho, MCW chuẩn bị kết quả trả lời YC
– RỖNG, sinh ra một tiến trình (Thread_Response) với tham số là đối tượng
AsyncRequestState chứa thông tin về YC và kết quả, đăng ký Thread_Response vào
ThreadPool, xoá YC khỏi LIST-QUEUE và xét YC tiếp theo trong LIST-QUEUE.
Thread_Response sau đó sẽ được ThreadPool kích hoạt và nó sẽ gửi trả lời YC cho trình
duyệt. Nếu YC hiện tại chưa vượt quá thời gian đã cho, tiến trình CheckTimeOut sẽ
TẠP CHÍ KHOA HỌC VÀ CÔNG NGHỆ, ĐẠI HỌC ĐÀ NẴNG - SỐ 5(40).2010

303
không thực hiện hành động nào cả và sau đó kiểm tra lặp lại đối với phần tử đầu tiên
này.
b) Xuất hiện sự kiện thông báo truy vấn từ SQL Server. SQL Server sẽ gửi
một thông báo truy vấn cho MCW thông qua Service Broker. Sự kiện này sẽ sinh ra
một tiến trình với nội hàm là phiên bản của hàm OnChangedEvent. Đầu tiên, tiến
trình này sẽ truy vấn dữ liệu từ CSDL và đăng ký thông báo truy vấn cho lần tiếp
theo.
Sau đó, nếu thông báo truy vấn có nguyên nhân là dữ liệu trong CSDL đã được
thay đổi dẫn đến kết quả thực thi truy vấn thay đổi, tiến trình này sẽ duyệt qua tất cả các
phần tử LIST-QUEUE theo nguyên tắt FIFO. Với mỗi phần tử, nó sẽ chuẩn bị kết quả
thực thi YC chứa các thay đổi dữ liệu. Ngoài ra, tương tự như tiến trình CheckTimeOut
kiểm tra “thời hạn” của YC, nó sinh ra một tiến trình (Thread_Response) với tham số là
đối tượng AsyncRequestState chứa thông tin về YC và kết quả, đăng ký
Thread_Response vào ThreadPool, xoá YC khỏi LIST-QUEUE và xét YC tiếp theo.
Tiến trình này sau đó sẽ được ThreadPool kích hoạt và nó sẽ gửi trả lời YC cho trình
duyệt. Ngược lại, nó sẽ không thực hiện thêm hành động nào khác.
Trong mọi trường hợp, sau khi nhận được kết quả từ MCW, trình duyệt xử lý nó
và ngay sau đó lặp lại việc gửi YC đến MCW.
4. Kết luận
Chúng tôi đã xây dựng một trang web đơn giản, thể hiện một giá trị số cùng với
thông tin “tăng”/“giảm” so với giá trị kế trước và thời điểm xảy ra sự kiện. Để xây dựng

trang web này, chúng tôi đã ứng dụng có cải tiến kỹ thuật thông báo truy vấn của hệ
quản trị CSDL SQL Server và kỹ thuật xử lý không đồng bộ bằng cách triển khai giao
diện IHTTPAsyncHandler từ thư viện ASP.NET. Trang web được cập nhật mỗi khi xuất
hiện s
ự kiện thay đổi dữ liệu sang một giá trị khác trong CSDL chỉ bằng một YC gửi
đến MCW. Khoảng thời gian giữa hai lần cập nhật dữ liệu trong CSDL trong các thử
nghiệm thành công với hệ thống MCW và trình duyệt trên mạng LAN là 1 – 15 phút.
Giả sử trong thực tế dữ liệu chỉ thay đổi sau trung bình 5 phút, tương ứng với 300 giây.
Trong khoảng thời gian đó, nếu cứ 5 giây trình duyệt gửi YC đến MCW một lần, thì số
lượng YC sẽ là 60 thay vì 1.
Thông qua nghiên cứu, chúng tôi nhận thấy:
- Thông thường, các trang web chủ động truy vấn dữ liệu từ hệ quản trị CSDL,
có thể thực hiện so sánh kết quả giữa hai lần truy vấn để xác định xảy ra sự thay đổi dữ
liệu hay không. Kỹ thuật thông báo truy vấn cho phép hệ quản trị CSDL chủ động thông
báo cho MCW mỗi khi xuất hiện thay đổi dữ liệu.
- Thông thường, sử dụng các công c
ụ, bên trong triển khai kỹ thuật xử lý đồng
bộ các YC, để xây dựng các trang web cho phép đơn giản hoá việc lập trình nhưng làm
giảm rõ rệt khả năng đáp ứng của MCW. Kỹ thuật xử lý không đồng bộ các YC cho
phép nâng cao đáng kể khả năng xử lý đồng thời các YC của MCW. Tuy nhiên, trong
TẠP CHÍ KHOA HỌC VÀ CÔNG NGHỆ, ĐẠI HỌC ĐÀ NẴNG - SỐ 5(40).2010

304
quá trình hoạt động của MCW, vẫn tồn tại có thể với số lượng lớn các tiến trình “chờ
đợi” kết quả từ bên ngoài.
Có thể thấy việc kết hợp ứng dụng có cải tiến kỹ thuật thông báo truy vấn và xử
lý không đồng bộ cho phép nâng cao đáng kể năng suất của MCW, cụ thể, nâng cao số
lượng tối đa yêu cầu đồng thời được xử lý, tốc độ xử lý yêu cầu cũng như số lượng tối
đa tiến trình hoạt động đồng thời. Hạn chế của bài viết là chưa kiểm chứng thực tiễn
bằng phương pháp định lượng những sự thay đổi đó, cũng như chưa nghiên cứu một

cách hệ thống khoảng thời gian tối đa cho phép giữa thời điểm tiếp nhận YC trên MCW
và gửi trả lời cho trình duyệt.
Có thể thấy việc ứng dụng có cải tiến kỹ thuật thông báo truy vấn và xử lý
không đồng bộ cho phép xây dựng các trang web cập nhật dữ liệu theo thời gian thực
một cách chủ động từ MCW và có thể đáp ứng số lượng lớn YC đồng thời.

TÀI LIỆU THAM KHẢO
[1] AJAX. 11/10/2009.
[2] Display data updates in real-time with AJAX.
07/25/display-data-updates-in-real-time-with-ajax/. 11/10/2009.
[3] The Most Complete AJAX Framework and JavaScript Libraries List(124+).
/>libraries-list.html. 11/10/2009.
[4] Walkthrough: Creating and Using AJAX-Enabled Web Service.
11/10/2009.
[5] Jörg Krause. Pro ASP.NET Extensibility. Apress. 2009. Chapter 2.
[6] Mads Kristensen. How to use the IHttpAsyncHandler in ASP.NET.
/>ASPNET.aspx. 11/10/2009.
[7] Walkthrough: Creating an Asynchronous HTTP Handler. http://msdn.
microsoft.com/en-us/library/ms227433.aspx. 11/10/2009.
[8] Implementation of Asynchronous Page Processing. asp-
net/implementation-of-asynchronous-page-processing.html. 11/10/2009.
[9] Query Notifications in SQL Server (ADO.NET). en-
us/library/t9x04ed2.aspx. 11/10/2009.
[10] Improving Performance with SQL Server 2005 Indexed Views.
11/10/2009.
[11] HTML and DHTML Reference.
us/library/ms533050(VS.85).aspx. 11/10/2009.



×