1. Trang chủ
  2. » Luận Văn - Báo Cáo

NGHIÊN cứu về các CHUẨN VIDEO COFERENCE xây DỰNG ỨNG DỤNG lớp học TRỰC TUYẾN

104 103 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 104
Dung lượng 6,89 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

1.4 Nội dung thực hiện Xây dựng ứng dụng trên nền web sử dụng web server node.js, cơ sở dữ liệu mongo, ngôn ngữ kịch bản phía server là JavaScript.. Chạy ứng dụng Hello World Tạo file he

Trang 1

CHƯƠNG 1: TỔNG QUAN

1.1 Giới thiệu

Lớp học trực tuyến là một hình thức đào tạo ảo, không tập trung mang lại nhiều lợi ích cho cả học viên và giảng viên Bao gồm tiết kiệm chi phí đi lại, về thời gian và cả không gian Các học viên ở xa, không có điều kiện đến trường lớp vẫn có thể tham gia vào lớp học

Là ứng dụng web cung cấp cho người dùng có thể học tập , trao đổi với giáo viên tại bất

kỳ nơi đâu ( chỉ cần có máy tính và webcam kết nối Internet) Mọi người có thể trao đổi (nói chuyện), chat hoặc vẽ trên nền whiteboard

Hầu hết các ứng dụng video conference đều có nhược điểm đó là khả năng đáp ứng (chịu tải) của server và băng thông đều có giới hạn do ứng dụng đòi hỏi được truyền trong thời gian thực Nhóm đã giải quyết các vấn đề bằng cách xây dựng hệ thống tích hợp

(NodeJS+WebSocket+OpenTok) với nhau nhằm tạo ra ứng dụng có khả năng đáp ứng 20 người tương tác với nhau trong cơ sở hạ tầng mạng Internet bình thường

1.2 Mục tiêu đề tài

Chúng em chọn đề tài xây dựng lớp học trực tuyến với mong muốn xây dựng một ứng dụng lớp học trực tuyến trên nền web, các trang thiết bị yêu cầu gồm có máy vi tính có kết nối mạng internet, webcam, headphone, microphone và một web browser để truy cập

web

1.3 Phạm vi đề tài

Vấn đề khó khăn gặp phải khi xây dựng một ứng dụng lớp học trực tuyến là hạ tầng mạng Tốc độ truyền tải dữ liệu chậm làm chất lượng hình ảnh, âm thanh không được tốt Chúng em hướng đến giải pháp công nghệ với mong muốn có thể tăng được số lượng người tham gia vào lớp học Chúng em đang hướng đến con số 10 học viên trong một lớp học

Trang 2

1.4 Nội dung thực hiện

Xây dựng ứng dụng trên nền web sử dụng web server node.js, cơ sở dữ liệu mongo, ngôn ngữ kịch bản phía server là JavaScript Bên cạnh đó còn sử dụng framework Express, một

số API được hỗ trợ bởi Node.js Giao diện web sử dụng EJS template, HTML, CSS, Jquery và JavaScript

Ứng dụng tập trung vào giải quyết vấn đề chịu tải của máy chủ và máy khách khi tham gia vào lớp Ứng dụng web lớp học trực tuyến sẽ cung cấp các chức năng cơ bản của một lớp học Bao gồm đăng ký tài khoản mới, đăng nhập, đăng xuất, tạo lớp học mới, đăng ký lớp học, quản lý lớp học, quản lý học viên và tham gia vào lớp học

1.5 Tổng quan về các công trình nghiên cứu của các tác giả trong và ngoài

nước về Video Conferencing

Hội thảo truyền hình (video conferencing) là một dịch vụ cho phép nhiều người Hội thảo

từ xa, với sự xuất hiện của hình ảnh và âm thanh từ một người đến những người còn lại

Sự xuất hiện của mạng tốc độ cao, cùng với sự ra đời của các thuật toán nén video hiệu quả, đã thúc đẩy sự phát triển của dịch vụ này trên môi trường mạng Nhiều tiêu chuẩn đã được công bố, chẳng hạn tiêu chuẩn ITU H.320 liên quan đến việc Hội thảo truyền hình trên mạng ISDN, tiêu chẩn ITU H.323 liên quan đến Hội thảo truyền hình trên mạng IP, tiêu chuẩn ITU H.324 liên quan đến Hội thảo truyền hình trên mạng điện thoại, giao thức SIP (Session Initiation Protocol) liên quan đến việc quản lý các phiên truyền thông, Nhiều giải pháp ứng dụng cung cấp dịch vụ Hội thảo truyền hình đã được giới thiệu: AIM Express của AOL cho phép nhắn tin trực tuyến và Hội thảo truyền hình, Ekiga là giải pháp phần mềm tự do, mã nguồn mở cung cấp dịch vụ Hội thảo truyền hình trên GNOME, Skype là mạng truyền thông cho phép truyền thoại và hình miễn phí trên Internet, sử dụng kỹ thuật peer-to-peer để giải quyết các hạn chế do tường lửa (firewall)

và NAT,

Nhiều công trình nghiên cứu về lĩnh vực hội thảo truyền hình đã được thực hiện tại Việt nam trong những năm qua, các nghiên cứu chủ yếu tập trung nghiên cứu công nghệ Hội thảo truyền hình và xây dựng ứng dụng triển khai thí điểm tại một mạng riêng Chưa có một công trình nào nghiên cứu về việc khai thác công nghệ hội thảo truyền hình mã nguồn mở, áp dụng vào mạng IP cao tốc

Đề tài NCKH – TPHCM năm 2004: Phần mềm hội thảo đa điểm dựa trên giao thức IP Multicast – Lê Phước Lộc, Võ Đình Hiếu, Đỗ Văn Long, Trần Văn Lăng

Trang 3

Đánh giá chất lượng truyền hình qua mạng bằng phương pháp khách quan – Lê Phước Lộc

Đề tài cấp cơ sở năm 2003 – Viện Công nghệ Thông tin: Xây dựng và thử nghiệm công nghệ hội nghị, hội thảo từ xa qua mạng

Đề tài cấp cơ sở năm 2003 – Viện Công nghệ Thông tin: Nghiên cứu triển khai công nghệ Video- Conferencing đa điểm và thử nghiệm trên hạ tầng mạng của VAREnet – Dương Đức Hoàn

Trang 4

CHƯƠNG 2: KHẢO SÁT CÁC PHẦN MỀM VIDEO CONFERENCE HIỆN NAY

2.1 Phần mềm nguồn mở Ekiga

2.1.1 Giới thiệu:

Ekiga (tên gọi trước đây là GnomeMeeting) là ứng dụng mã nguồn mở, cung cấp các dịch

vụ VoIP và Hội thảo truyền hình trên GNOME Ekiga sử dụng cả giao thức H.323 lẫn SIP Nó cho phép nhiều bộ codec dành cho audio/video, và có thể làm việc cộng tác với các phần mềm theo đúng giao thức SIP khác, cũng như với Microsoft NetMeeting

Ekiga tương thích với nhiều thiết bị phần cứng (chẳng hạn Swiss Voice, SISCO, SNOM,

IP Phones) và phần mềm có hỗ trợ SIP hoặc H.323 (chẳng hạn Windows Messenger, Net Meeting, SJPhone, Eyebeam, X-Lite, …) Tuy nhiên Ekiga lại không tương thích với Skype do sự khác biệt về giao thức (Skype sử dụng một giao thức riêng, closed

protocols)

Để thiết lập hệ thống Ekiga, cần có:

Firewall và NAT router/gateway được cấu hình đúng

Microphone hoặc headset

Webcam (không bắt buộc, Ekiga chủ yếu sử dụng như một ứng dụng VoIP) Hiện nay, Ekiga được thiết kế để chạy trên GNOME, hoặc KDE desktop

Ekiga là phần mềm mã nguồn mở, miễn phí theo đúng các yêu cầu của GNU/GPL

Trang 5

MPEG-2 (SVCD, DVD), MPEG-4, MPA, WMV, WMA, ASF, MP3, QuickTime

(version 2 and lower) Các dạng file khác và các dạng file nén được hỗ trợ cần cài đặt kèm theo các codec tương ứng, như Ogg, , DivX, XVid, VP6, Apple mp4, AC3, h.264 Unreal Media Server không chuyển mã hoặc giải mã khi đang truyền; các file được

truyền như nguyên dạng; chương trình player có khả năng chơi lại các file này miễn là các codec thích hợp được cài đặt trên máy tính của nguời xem

Các nguồn video “sống” mà server có thể làm việc bao gồm: máy quay kỹ thuật số có hỗ trợ USB/Firewire, Máy quay trong mạng IP, microphones, cạc thu tín hiệu TV, các nguồn hình analog (từ máy quay analog hoặc từ TV) được kết nối với 1 cạc đồ họa, các cạc bắt hình (video capture) hoặc các thiết bị phần cứng có hỗ trợ giao diện DirectShow

Các codec được dùng cho nén video trực tiếp: Microsoft MPEG-4 V2, WMV Codecs dùng cho nén audio trực tiếp: Fraunhofer MPEG Layer-3 (MP3), GSM 6.10 and WMA

Có hai chế độ chuyển giao hình: Near-Real-Time and Buffered Các ứng dụng hội thảo đòi hỏi phải có độ trễ thấp, có thể sử dụng chế độ Near-Real-Time với độ trễ từ 0.2 đến 2 giây, trong đó kích cỡ vùng đệm rất nhỏ (cực tiểu) Khi độ trễ thấp không còn quan trọng,

có thể dùng chế độ vùng đệm (Buffered), cho phép các server hạn chế sự xuống cấp hình

do sự chập chờn, tắc nghẽn mạng

Ứng với từng loại tốc độ đường truyền như truyền qua Modem, DSL, T1, T2, …, Unreal Media Server cung cấp sẵn các profile, cho phép lựa chọn bộ thông số (codecs/bitrates) phù hợp

Có thể ghi lại các nội dung video “sống” theo lịch đã lập sẵn, hoặc theo sự phát hiện có tín hiệu, hoàn toàn độc lập với luồng hình truyền đến

Media Server sử dụng các giao thức vận chuyển như TCP, HTTP(S) Unicast; RTP

Multicast để truyền hình đến players

Media Server cũng cung cấp truyền hình với MMS/HTTP, cho khả năng làm việc cộng tác nhiều loại chương trình players có hỗ trợ trên Windows, MAC và Linux

Trang 6

Unreal Streaming Media Player chạy trên máy Windows PC và các thiết bị cầm tay chạy trên Windows Mobile 5 Player có thể nhúng vào các trang Web như một ActiveX

control sử dụng với các trình duyệt IE, hoặc Mozilla plugin for Gecko sử dụng các trình duyệt như FireFox và Netscape

Các trình players có hỗ trợ giao thức MMS như Windows Media Players, cũng có thể trình diễn các nội dung nhận được từ Unreal Server

Các nội dung đến không được lưu trong các đĩa cứng của máy tính và người sử dụng không được phép lưu lại các nội dung, do đó tác quyền được bảo vệ đầy đủ

Cơ chế uỷ quyền và hạn chế truy cập cho phép truy cập đến các nguồn tài nguyên dữ liệu

ở Server Chức năng ghi nhật ký người sử dụng cung cấp phương tiện để giám sát các hoạt động của người dùng

SDK cho phép khả năng tự động hóa và tùy chỉnh các hành vi của Server

2.2.2 Nhận xét

Bộ phần mềm của Unreal gồm các ứng dụng Unreal Media Server, Unreal Live Server và các Player, codecs, … cho phép tổ chức, khai thác việc truyền video/audio ở nhiều hình thức (“sống”, dạng thu lại) cho các client Nếu tại một client, ta đặt các thiết bị camera để ghi hình/âm, và phát lại cho các client khác, ta có thể tạo ra một ứng dụng hội thảo trực tuyến

2.3 OpenMeetings

2.3.1 Giới thiệu

OpenMeetings là phần mềm nguồn mở do Sebastian Wagner khởi xướng, xây dựng trên OpenLaszlo và Red 5 – một Media server mã nguồn mở Dự án OpenMeetings được đặt Google Code (http://code.google.com/p/openmeetings/)

Trang 7

 Hỗ trợ bảng trắng (white-board) với các khả năng vẽ hình, viết và soạn thảo, dragNDrop, Thay đổi kích thước, kéo thả Ảnh từ thư viện, sự dụng các ký hiệu (symbol)

o Vẽ trong khi hội thảo

o Lưu lại các nội dung vẽ trên bảng và nạp lại vào lần sau, có thể soạn thảo

và ghi lại

o Import các tài liệu có phần mở rộng (.tga, xcf, wpg, txt, ico, ttf, pcd, pcds, ps, psd, tiff, bmp, svg, dpx, exr, jpg, jpeg, gif, png, ppt, odp, odt, sxw, wpd, doc, rtf, txt, ods, sxc, xls, sxi, pdf)

o Mời họp

o Cung cấp hệ thống điều phối cuộc họp

o Cung cấp hệ thống quản lý người dùng, tổ chức

o Cung cấp các module backup và ngôn ngữ

 Cho phép các phòng họp riêng và công cộng

2.3.3 Nhận xét

OpenMeetings là ứng dụng cho phép hội thoại truyền hình trên mạng, cho phép nhiều người (lên tới 16), sử dụng giao diện Web Ứng dụng này không phụ thuộc vào việc cài đặt các trình client Chỉ cần có trình duyệt Web với các thiết bị video/audio/speaker là đủ Bên cạnh khả năng hội thảo truyền hình, OpenMeetings còn cho phép gửi các màn hình đến các thành viên, truyền file, … đến các thành viên Tính năng này rất thích hợp cho các hoạt động hướng dẫn, dạy học trên mạng

2.4 OpenH323

OpenH323 là dự án nguồn mở, hỗ trợ đầy đủ các tính năng của chồng giao thức H323, viết bằng ngôn ngữ C++ Các sản phẩm của dự án này đã được tích hợp vào nhiều phần mềm nguồn mở và phần mềm thương mại khác

Trang 8

Các phần mềm đã được công bố trong dự án OpenH323:

 Pwlib: thư viện lớp được viết bằng C++ Các chương trình dựa trên PWLib

có thể chạy trên Microsoft Windows và Unix/Linux Thư viện này chứa đựng cả các lớp “cơ sở” (strings, arrays, lists) lẫn các chức năng mức cao hơn (networking, multi-threading)

 OpenH323: Thư viện dành cho phát triển ứng dụng H.323 Nó sử dụng Pwlib nhằm tránh sự phụ thuộc vào môi trường nền Thư viện này cũng có

bộ phân tích cú pháp ASN1 của riêng nó, có khả năng sinh ra các lớp làm nhiệm vụ mã hóa và giải mã các thông điệp (protocol message) dùng trong H.323

Ngoài ra:

 Opengk: Bản cài đặt nguồn mở của H.323 Gatekeeper Bản cài đặt này cho phép các hầu hết các chức năng cơ bản của H.323 Gatekeeper, như đăng ký (registration), admission và access control, chuyển đổi tên thành địa chỉ, giám sát và điều khiển băng thông Ngoài ra, Opengk còn cung cấp các tính

năng cao cấp như định tuyến cuộc gọi (route calls); hỗ trợ H.323v2 alias

types (party number, URL, transport id và email address); hỗ trợ gateway prefixes; Ghi nhật ký việc Registration và cuộc gọi- Lưu giữ các gatekeeper láng giềng; quản lý thời gian đăng ký (registration time to live)

openMCU: Bản cài đặt nguồn mở của H.323 MCU Bản cài đặt này cho phép nhiều người tham gia cùng một phiên hội nghị truyền hình khi sử dụng các chương trình theo giao thức H.323 (VD OhPhone, GnomeMeeting, MS NetMeeting, …) Trong bản nguồn

mở này, OpenMCU cho phép tối đa 4 người cùng kết nối đến

2.5 Talkez

Talkez là phần mềm miễn phí hỗ trợ điện thoại Internet, Video conferencing với cả H.323 và SIP (http://sourceforge.net/projects/talkez#download) Hiện nay, Talkez không còn là phần mềm nguồn mở, chỉ là phần mềm miễn phí

Điểm đặc biệt là phần mềm Talkez (ver 1.8.1.5) vừa có thể sử dụng như phần mềm client, vừa có thể sử dụng như một MCU

2.6 Sdr, Vic và Rat

Đây là bộ phần mềm nguồn mở, khởi đầu được phát triển do sự hợp tác của nhóm Nghiên

cứu mạng thuộc Phòng thí nghiệm quốc gia Lawrence Berkeley với trường Đại học

Trang 9

Berkeley, California (http://www-nrg.ee.lbl.gov/) Các sản phẩm lúc này chủ yếu được phát triển để chạy trên các hệ điều hành họ Unix Sau đó, các sản phẩm này đã được một nhóm nghiên cứu ở khoa Khoa học máy tính, University College London (viết tắt UCL) , phát triển tiếp (http://www-mice.cs.ucl.ac.uk/multimedia/software/), với nhiều bổ sung về codec, và môi trường Windows

Một điểm quan trọng là bộ phần mềm này chạy trên mạng IP, sử dụng địa chỉ Multicast

Trang 10

CHƯƠNG 3: XÂY DỰNG ỨNG DỤNG LỚP HỌC TRỰC TUYẾN

3.1 Tổng quan về Node.js

3.1.1 Giới thiệu Node.js

Node.js là một nền tảng mới được phát triển bởi Ryan Dahl, cho phép các nhà phát triển JavaScript có thể xây dựng những máy chủ có hiệu suất thực thi cao bằng cách tận dụng

bộ máy JavaScript V8 của Google, xử lý bất đồng bộ I/O

Mục tiêu của Node.js là cung cấp 1 cách dễ dàng để xây dựng các ứng dụng mạng có khả năng mở rộng cao Trong mỗi ứng dụng đó, nhiều kết nối từ máy khách có thể được kiểm

soát một cách đồng thời Node.js sẽ trao đổi với hệ điều hành ( thông qua epoll, kqueue, /dev/poll/, hay select) rằng nó cần được biết bất cứ khi nào có 1 kết nối được tạo ra, sau

đó nó đi vào trạng thái “sleep” Nếu có một kết nối mới, một “callback” sẽ được thực thi Mỗi kết nối chỉ là một “small heap allocation”

Kết nối mạng dựa trên tiến trình thì tương đối không hiệu quả và khó sử dụng Node.js thể hiện hiệu quả bộ nhớ với khả năng chịu tải cao hơn những hệ thống mà phân bổ “2mb thread stack” cho mỗi kết nối Hơn thế nữa, người sử dụng Node.js không phải bận tâm đến vấn đề “dead-lock” các tiến trình xử lý Bởi vì hầu hết các chức năng của Node.js sẽ không trực tiếp thực hiện I/O Nhờ đó, những lập trình viên thiếu kinh nghiệm có thể phát triển hệ thống nhanh chóng

Trong các hệ thống thông thường luôn có một khối lệnh gọi bắt đầu vòng lặp sự kiện Điển hình như một hệ thống định nghĩa hành vi ứng xử thông qua lời gọi “callback” khi bắt đầu một đoạn mã kịch bản và khi kết thúc khởi động một server như là

“EventMachine::run()”.Node.js có mô hình xử lý sự kiện hơi khác một chút Trong Node.js sẽ không có lời gọi vòng lặp sự kiện khi bắt đầu Node.js đơn giản đi vào vòng lặp sự kiện sau khi thực thi các mã kịch bản được đưa vào Node.js thoát ra khỏi vòng lặp

sự kiện khi không có “callback” nào để thực thi-Vòng lặp sự kiện ẩn đối với người sử dụng

HTTP là lớp giao thức đầu tiên trong Node.js Thư viện HTTP được phát triển dựa trên những kinh nghiệm của tác giả trong việc phát triển và làm việc với web server Chẳng hạn như việc truyền tải dữ liệu thông qua hầu hết các nền tảng web là điều không thể Node.js cố gắng sửa chữa những vấn đề này trong việc phân tích cú pháp HTTP và API, cùng với cơ sở hạ tầng hoàn toàn theo hướng sự kiện của mình, Node.js tạo nên một nền tảng tốt cho các thư viện hay nền tảng web

3.1.2 Node.js trong lĩnh vực công nghiệp

LinkedIn sử dụng Node.js để xây dựng ứng dụng tốt hơn, nhanh hơn: LinkedIn tung ra

ứng dụng di động Gorgeously của mình Ứng dụng này nhanh hơn từ 2 đến 10 lần ở phía máy khách so với trước đây Về phía máy chủ, sử dụng ít hơn nguồn tài nguyên nhờ chuyển đổi từ Ruby on Rails sang Node.js

Trang 11

Ebay chọn Javascript và node.js để xây dựng ql.io: Javascript và node.js cho phép lặp

nhanh hơn Có thể điều chỉnh máy trạm Ubuntu để xử lý hơn 120.000 kết nối hoạt động mỗi tiến trình xử lý node.js Với mỗi kết nối tiêu dùng 2K về bộ nhớ, tăng khả năng xử lý nhiều kết nối nhiều hơn

Microsoft đã làm việc với Joyent và cộng đồng Node để đưa Node.js vào trong Windows

Hiện tại chúng ta gặp một vài khó khăn để có thể vận hành Node.js trên Windows, và trong khi đó “Azure team” đã làm việc trên IISNode cho phép Node.js có thể lưu trữ trong IIS

Yahoo! đã âm thầm làm việc trong vài tháng trên một công nghệ mới đầy thú vị và họ

nghĩ rằng sẽ có nhiều ảnh hưởng sâu sắc đến cộng đồng các nhà phát triển web Họ gọi

nó là “Cocktails” Và “Cocktails” đó là sự kết hợp của HTML5, Node.js, CSS3 và Javascript Họ đã cho ra đời Yahoo!‟s Mojito và Yahoo! Manhattan

3.1.3 Cài đặt Node.js trên Window

B1 Install Cygwin (tải phiên bản Cygwin tại địa chỉ: http://www.cygwin.com/ )

B2 Chạy ứng dụng Cygwin

B3 Chọn Next trên ứng dụng

B4 Chọn mục “Install from Internet” và bấm Next

Hình 3.1: bước 4 – cài đặt node.js

Trang 12

B5 Chọn thư mục cái đặt và bấm Next

Hình 3.2: bước 5 – cài đặt node.js

B6 Chọn mục “Direct Connection” và bấm Next

Hình 3.3: bước 6 – cài đặt node.js

Trang 13

B7 Chọn địa chỉ site download và bấm Next

Hình 3.4: bước 7 – cài đặt node.js

B8 Chọn các gói thư viện cài đặt hỗ trợ cho quá trình cài đặt Server NodeJs:

 devel → gcc4-g++ [Builds v0.4.2 and earlier use gcc-g++]

B9 Mở Cygwin command với Start > Cygwin > Cygwin Bash Shell

B10 Chạy lệnh để download và cài đặt NodeJs

$ git clone git://github.com/ry/node.git

$ cd node

$ /configure

$ make

$ make install

Trang 14

Chạy ứng dụng Hello World

Tạo file hello_node.js có nội dung code :

var http = require('http');

http.createServer(function (req, res) {

res.writeHead(200, {'Content-Type': 'text/plain'});

3.1.4 Kỹ thuật event callbacks trong Node.js

Vòng lặp sự kiện là một “software pattern” tạo điều kiện thuận lợi để “non-blocking I/O” (truyền nhận dữ liệu trên mạng, đọc ghi file, các tiến trình xử lý giao tiếp với nhau) Đoạn code mẫu sau có thể gây ra “blocking I/O”

var post = db.query(„select * from posts where id=1‟);

// đoạn code xử lý dưới đây sẽ không được thực thi cho đến khi nào thao tác truy vấn cơ sở dữ liệu hoàn tất

doSomethingWithPost(post);

doSomethingElse();

Điều gì xảy ra với đoạn code trên? Trong khi truy vấn dữ liệu từ cơ sở dữ liệu được thực thi, thì toàn bộ tiến trình xử lý sẽ đi vào trạng thái “waiting” để chờ đợi Thao tác lấy dữ liệu có thể tốn một khoảng thời gian, và vẫn phải “rendering” cho tất cả các tiến trình xử

lý đang ở trạng thái “waiting” ở trên

Node.js sử dụng kỹ thuật “event callbacks” để “non-blocking I/O” Mỗi “event callback”

là một phương thức sẽ được triệu gọi khi có một điều gì đó có ý nghĩa xảy ra( chặng hạn như kết quả truy vấn cơ sở dữ liệu đã sẵn sàng để sử dụng) Đoạn code trên sẽ được viết lại thành:

callback = function(post){

doSomethingWithPost(post); // đoạn mã này sẽ được thực thi khi phương thức db.query trả về kết quả

}

Trang 15

db.query(„select * from posts where id=1‟, callback);

doSomethingElse(); // đoạn mã này sẽ được thực thi độc lập đối với lời gọi db.query

Trong khi db.query() được thực thi, tiến trình xử lý được tự do để tiếp tục chạy đoạn mã doSomethingElse(), kể cả việc phục vụ cho một yêu cầu của máy khách mới khác

3.1.5 Node sử dụng Javascript thay vì C hay Lua

Khởi đầu project, Ryan Dahl, tác giả của Node.js sử dụng ngôn ngữ C, nhưng việc duy trì, lưu vết ngữ cảnh giữa các lời gọi “callback” quá phức tạp và không thể tối giản code

Vì thế Ryan Dahl đã chuyển sang sử dụng Lua Nhưng Lua cũng không phải là một ý tưởng hay, vì các thư viện của Lua có thể gây ra “blocking I/O” Sau đó, ông nghĩ đến Javascript Javascript có “colsures” và “first-class functions” Javascript thật sự thích hợp

và đủ để lập trình sự kiện vào ra dữ liệu

Closures là những phương thức kế thừa những biến trong môi trường chứa chúng Khi một phương thức được thực thi “callback”, nó sẽ tự động ghi nhớ ngữ cảnh mà nó đã được khai báo, cùng với những biến dữ liệu được khai báo trong ngữ cảnh và bất kỳ ngữ cảnh cha nào Tính năng mạnh mẽ này là thành phần cốt lõi trong sự thành công của Node

Trong lập trình web, nếu muốn lắng nghe một sự kiện nhấn button, chúng ta có thể code như sau:

document.getElementById(„yourButton‟).onclick = function(){};

Hoặc sử dụng JQuery như sau:

$(„yourButtonID‟).click(function(){});

Trong cả hai ví dụ trên, chúng ta đã gán và truyền một phương thức như là một đối số và

có thể được thực thi sau này Phương thức điều khiển sự kiện “click” có thể truy cập các biến dữ liệu được khai báo trong phạm vi tính từ nơi phương thức được khai báo, kể cả những biến dữ liệu được khai báo trong ngữ cảnh cha của nó

First-class functions: Những phương thức trong Javascript là những first-class object Như thế, mỗi một phương thức là một đối tượng, có thể thiết lập, thay đổi thuộc tính, truyền vào đối số, kể cả trả chúng về như là kết quả của một lời gọi hàm

Ví dụ 1: chúng ta định nghĩa 1 phương thức và lưu trữ nó trong một phương thức khác

var schedule = function(timeout, callbackfunction){

return{

start: function(){

Trang 16

setTimeount(callbackfunction, timeount);

} }

2 biến “timeout” và “count” chỉ có thể truy xuất ở phạm vi bên trong “function”

Triệu gọi phương thức “schedule”, truyền vào đối số đầu tiên là “timeout” và đối số thứ hai là phương thức mới “doStuff”

Ví dụ 2: Trong Javascript, chúng ta cũng có thể thiết lập và truy cập thuộc tính của một phương thức

var myFunction = function(){}

Sử dụng phương thức “require” để thêm vào một module:

var module = require(„module_name‟);

Phương thức “require” sẽ nạp module đã được cài đặt bởi “npm”

3.1.7 Bốn thành phần chính trong API của Node

Processes: Node cho phép chúng ta phân tích một tiến trình xử lý ( chẳng hạn như các biến dữ liệu môi trường…) và quản lý những tiến trình xử lý bên ngoài

Trang 17

File System: Node cũng cung cấp các API cấp thấp để làm việc với file dữ liệu, dựa trên chuẩn POSIX Gồm 2 module chính sau

fs: Làm việc với File: tạo mới, xóa, nạp, ghi và đọc file

path: nối file, kiểm tra file hợp lệ hay là một thư mục

Networking: gồm 5 module chính sau:

 net: Tạo TCP server và TCP client

 dgram: Truyền nhận gói dữ liệu UDP

 http: Tạo HTTP server hay HTTP client

 tls (ssl): Sử dụng OpenSSL để cung cấp Transport Layer Security và/hay Secure Socket Layer

 https: Hiện thực http dựa trên TLS/SSL

 dns

Utilities: Gồm 2 module chính là console và util

Console: Node cung cấp 1 đối tượng toàn cục là “console”, được dùng để xuất chuỗi console có thể xuất chuỗi ra stdout (log), stderr (warn) và in lưu vết (trace)

Util: cung cấp một số phương thức thường dùng để thao tác dữ liệu

Buffers: Bản thân Javascript làm việc thiếu hiệu quả với kiểu dữ liệu dạng nhị phân Vì thế Node đã hiện thực “buffer”, chuẩn để Node truyền dữ liệu Bất cứ khi nào cũng có thể truyền “buffer” vào mỗi Node API đòi hỏi dữ liệu để truyền đi Và khi nhận dữ liệu từ một lời gọi “callback”, chúng ta cũng sẽ nhận một “buffer”

Có thể tạo ra “buffer” với các chuẩn mã hóa như là : utf8, ascii, base64 “Buffer” cung cấp nhiều phương thức làm việc hiệu quả như :

buffer.slice: dùng để cắt buffer thành những buffer nhỏ hơn

Buffer.copy: dùng để sao chép 1 phần dữ liệu của buffer vào một buffer khác

3.1.8 Event Emitter

Trong Node, rất nhiều đối tượng có thể làm bay ra một sự kiện Chẳng hạn, một TCP server có thể làm bay ra một sự kiện “connect” mỗi khi có một trình khách kết nối Hay

là một “file stream request” có thể làm bay ra một sự kiện “data”…

addListener : Chúng ta có thể lắng nghe các sự kiện bằng cách gọi phương thức

“addListener” của đối tượng, và truyền vào một phương thức dạng “callback” Chẳng hạn, một “file ReadStream” có thể làm bay ra sự kiện “data” mỗi khi đọc được dữ liệu hợp lệ Chúng ta cũng có thể sử dụng “on” thay thế cho “addListener”

Trang 18

var fs = require(„fs‟); // get fs module

var readStream = fs.createReadStream(„/etc/password‟);

Tạo Event Emitter:

var EventEmitter = require(„events‟).EventEmitter,

Trang 19

3.1.9 HTTP Server

Sử dụng module http, chúng ta dễ dàng tạo ra được một HTTP server

var http = require(„http‟);

var server = http.createServer();

server.on(„request‟, function(req, res){

res.write(„hello World!‟);

res.end();

});

Server.listen(4000);

Đối tượng http.ServerRequest : khi máy khách gửi một yêu cầu lên server, một sự kiện

“request” được tung ra, lời gọi “callback” được thực thi Trong lời gọi đó đối số thứ nhất

là đối tượng http.ServerRequest

 req.url : chuỗi URL của yêu cầu gửi lên từ máy khách

 req.method : chứa HTTP method được sử dụng trong lời yêu cầu được gửi từ máy khách Method đó có thể là “GET”, “POST”, “DELETE” …

 req.headers : chứa các thông tin HTTP header trong lời yêu cầu được gửi từ máy khách

3.1.10 Đối tƣợng http.ServerResponse

Đối tượng này là đối số thứ được truyền vào lời gọi “callback” khi có một sự kiện

“request” được tung ra Chúng ta sử dụng đối tượng http.ServerResponse để trả lời máy khách dựa trên những thông tin có trong đối tượng http.ServerRequest

HTTP Client: Bản thân module “http” được thiết kế để vận hành như một máy server Nhưng chính module “http” cũng có thể triệu gọi các dịch vụ từ bên ngoài và hoạt động như một chất keo giữa các dịch vụ Chúng ta có thể dễ dàng sử dụng nó để chạy một đoạn

mã kịch bản ở máy khách

3.1.11 Node server điều khiển các request, post từ client :

Khi sử dụng nodejs serer, lập trình viên phải tự điều khiển các request/ post từ phía client Chúng ta phải đăng ký với nodejs server sẽ xử lý những request/post nào từ phía client Trường hợp không đăng ký với nodejs server thì request/post đó sẽ không được xử lý, và được xem là request/post đó yêu cầu một tài nguyên không tồn tại trên mạng

Trang 20

GVHD: PGS.TS Vũ Thanh Nguyên SVTH: Đoàn Hữu Hạnh & Nguyễn Đắc Thắng

Nhờ đặc điểm này của nodejs server mà lập trình viên có thể tự do và dễ dàng quyết định cách thức xử lý với mỗi request/post Đồng thời cũng dễ dàng để thực hiện kỹ thuật

rewrite-url nhằm tạo ra những đường link thân thiện, dễ nhớ và dễ sử dụng đối với người

sử dụng

Đoạn mã ví dụ cách đăng ký xử lý request/post với nodejs server (sử dụng Express

framework)

/* Import module “express”*/

var express = require('express');

/* Tạo obj Server*/

var app = express.createServer();

/* Import userController và indexController*/

var indexCtrl = require('./controllers/index');

var userCtrl = require('./controllers/user');

Trang 21

Hình 3.5 – tổng quan mô hình MVC

Mô hình MVC trong node.js cũng tương tự như các framework khác, cũng gồm có 3 thành phần chính là Controller, Model và View Khi máy chủ node nhận được Request từ phía máy khách, Request đó sẽ được chuyển qua cho Controller xử lý Controller sẽ quyết định View nào sẽ được gọi để sản sinh trang HTML dựa trên yêu cầu từ máy

khách Nếu View cần thêm dữ liệu cho việc sản sinh HTML, Controller có thể triệu gọi Model để lấy dữ liệu từ cơ sở dữ liệu để View sử dụng

3.2.2 Các thành phần của mô hình MVC

3.2.2.1 Handle Request

Việc điều khiển các Request từ phía máy khách do node.js server đảm nhận Trong phạm

vi đồ án, chúng em sử dụng module “express” – một framework dành cho node.js – với vai trò là server Đoạn mã sau tạo ra một server, định nghĩa cách hành xử khi nhận được Request liên quan đến user (mỗi một Request có thể là „GET‟ hoặc là „POST‟)

// khởi tạo server và controller

var express = require(„express‟);

var app = express.createServer();

var userController = require(„./controllers/user‟);

// định nghĩa các hành xử

app.get(„/user/register‟, userController.register); // user request trang đăng ký

Trang 22

app.post(„/user/register‟, userController.save);// user submit form đăng ký

app.listen(11990); // khởi chạy server lắng nghe ở port 11990

Như vậy ta đã tạo ra và khởi chạy một server để lắng nghe các yêu cầu từ phía máy

khách

3.2.2.2 Controller

Mỗi khi nhận được Request, server sẽ triệu gọi Controller tương ứng, có khả năng đáp ứng yêu cầu từ máy khách Nhiệm vụ còn lại của server là gửi trả về kết quả cho máy khách khi cần thiết Những việc khác sẽ do Controller đảm nhận

Đoạn mã sau khai báo cách hành xử khi máy khách yêu cầu trang đăng ký

exports.register = function(req, res){

res.render('views/register', {layout: false, user:{ noError:true}});

}

Trong tình huống này, người dùng chỉ yêu cầu một trang web tĩnh, không có yêu cầu lấy

dữ liệu từ cơ sở dữ liệu Do đó, Controller sẽ quyết định chọn ngay View để sản sinh HTML là „views/register‟

Đoạn mã sau khai báo cách hành xử khi người dùng submit form để lưu thông tin đăng

var userModel = require(' /models/user');

exports.save = function(req, res){

var profile = { // tạo đối tượng đóng gói thông tin

username:req.body.profile.username, password:req.body.profile.password, realname:req.body.profile.realname, email:req.body.profile.email,

};

var data = new Array();

data[0] = profile; // lưu gói thông tin vào mảng userModel.register(data, registerCalback);// chuyển mảng dữ liệu và phương thức “callback” xuống tầng Model

}

Trang 23

function registerCalback(data){

if(data[0]){ // thao tác lưu dữ liệu thành công

m_response.render('template/register', {layout:false,

user:{noError:true, link:link}});

}else{ //thao tác lưu dữ liệu thất bại

m_response.render('views/register', {layout: false, user:{

noError:false}});

} }

Lời yêu cầu này đòi hỏi phải lưu dữ liệu xuống cơ sở dữ liệu Do đó, Controller sẽ xử dụng đến Model là “models/user” Model này đảm nhận các tác vụ thao tác với cơ sở dữ liệu có liên quan đến user

Bên cạnh đó, ta còn khai báo một function là “registerCallback” bởi vì thao tác đọc dữ liệu từ cơ sở dữ liệu sẽ được thực thi bất đồng bộ với việc View tạo trang HTML trả về cho User Function này được truyền đến tận lớp DBProvider, nơi sẽ trực tiếp thực thi các câu lệnh truy vấn Và function này chỉ được triệu gọi ngay sau khi thao tác truy vấn dữ liệu kết thúc

Function “registerCallback” sẽ quyết định View nào sẽ được gọi sản sinh HTML tùy vào

dữ liệu chứa trong đối số được truyền vào

3.2.2.3 Model

Khi muốn sản sinh một trang HTML động, Controller phải triệu gọi một Model tương ứng để lấy dữ liệu từ cơ sở dữ liệu Chẳng hạn, thao tác lưu thông tin đăng ký tài khoản của một user thì cần đến Model tương ứng là “models/user”

var _dbProvider = require(' /utils/dbProvider');

exports.register = function(args, callback){

var profile = args[0]; // lấy về đối tượng đóng gói dữ liệu var query = { // tạo câu truy vấn

username:profile.username, password:profile.password, realname:profile.realname, email:profile.email,

Trang 24

avatar:_config.getDefaultAvatar(), };

var data = new Array();

data[0] = "insert"; // khai báo câu truy vấn là “insert”

data[1] = query; // lưu câu truy vấn vào mảng _dbProvider.execQuery(data, callback); // chuyển mảng dữ liệu và lời gọi “callback” xuống dưới lớp “dbProvider”

DbProvider là lớp trực tiếp thao tác với cơ sở dữ liệu, bao gồm các thao tác “select”,

“insert”, “update” và “delete” Thông tin cần thiết để “dbProvider” có thể thực thi thao tác truy vấn dữ liệu bao gồm một mảng dữ liệu chứa thông tin loại câu truy vấn (CRUD), nội dung câu truy vấn và lời gọi “callback” sau khi truy vấn dữ liệu là gì

Controller

Trong phạm vi ứng dụng đồ án, chúng em sử dụng “EJS template” để sản sinh ra các tài liệu HTML dựa trên khối dữ liệu nhận được

response.render('views/register', {layout: false, user:data});

Đoạn mã trên yêu cầu sản sinh trang HTML từ „views/register.ejs‟ với gói dữ liệu là

„data‟ Register.ejs vốn là một file html có trộn lẫn các mã lệnh của JavaScript để sản sinh ra dữ liệu động Các mã lệnh đó được bao bọc bởi thẻ „<%‟ và thẻ „%>‟

3.3 Node.js và đồ án lớp học trực tuyến

3.3.1 Module Express

Node.js chỉ có 2 module phổ biến là “Connect” và “Express”

Trang 25

 Connect : cung cấp nhiều chức năng như về “static file server”, “route

management”, “cookie parser”, “form-encoded”, “JSON-encoded body parser” và

“Logging”

 Express : được xây dựng dựa trên “Connect”, thêm vào nhiều chức năng hơn về

“routing”, “view rendering”, “validate request bodies and query params”, ”flexible authentication configuration” và một vài chức năng khác

3.3.2 Tạo server với module Express

Chúng ta chỉ cần tạo ra một thể hiện của express.HTTPServer, đơn giản triệu gọi phương thức createServer()

var app = require(„express‟).createServer();

app.listen(int_port);

Express hỗ trợ linh động môi trường chạy ứng, như là “production” hay “development” Chúng ta có thể sử dụng phương thức “configure()” để thiết lập những cấu hình cần thiết cho môi trường thực thi Với phương thức “configure()” không truyền vào tham số tên của môi trường thực thi thì nó sẽ được gọi chạy trước các cấu hình môi trường khác

3.3.3 Rewrite URL với Express

Chúng ta có thể dễ dàng rewrite url với Express để tạo ra một đường link ngắn gọn, thân thiện và gợi nhớ Chẳng hạn, để vào trang đăng ký tài khoản mới với URL được viết lại

là “/user/register”, chúng ta có thể làm như sau:

app.get('/user/register', userCtrl.register);

Trang 26

/*userCtrl.register là một phương thức, sẽ được triệu gọi thực thi khi có máy khách gửi yêu cầu đăng ký tài khoản mới.*/

View rendering with EJS template

Express hỗ trợ các “template engine” phổ biến như là : “Haml”, “Jade”, “EJS”,

“CoffeKup” và “jQuery Templates” Trong đồ án, chúng em sử dụng “template engine EJS” để view các trang web

3.3.4 Template EJS

EJS là viết tắt của “Embedded JavaScript” EJS kết hợp thành phần dữ liệu với template

để sản sinh ra trang HTML EJS tương thích với hệ thống “xem” của Express, sử dụng bộ nhớ tĩnh trung gian, không lưu trữ các mã điều khiển, mặc định ở chế độ “Escapes HTML” hạn chế mã độc hại, hỗ trợ thẻ tùy chỉnh (lập trình viên có thể tự định nghĩa tên

và chức năng cho thẻ “tag” của mình), hỗ trợ bộ lộc cho các mẫu thiết kế thân thiện, đặc biệt là EJS được hỗ trợ ở phía máy khách

Ví dụ viết mã EJS giữa 2 tag <% EJS code %>, trộn lẫn HTML

Trang 27

</li>

<% } %>

</ul>

Gọi template, truyền dữ liệu để render

var html = new EJS({url: 'fileName.ejs'}).render(data);

3.3.5 Sử dụng SESSION trong Express

Session có thể được thêm vào bằng cách sử dụng session của module “Connect” Bên cạnh đó, để sử dụng được session, chúng ta cũng cần phải có “cookieParser” để phân tích

và tính toán dữ liệu trong “cookie” gửi lên từ máy khách

Mặc định, session sử dụng cùng gói bộ nhớ lưu trữ với module “Connect” Vì thế việc triển khai session vẫn còn nhiều Chẳng hạn “connect-redis” hỗ trợ vùng lưu trữ session

“Redis”, được sử dụng như trong ví dụ dưới đây

var RedisStore = require(„connect-redis‟)(express);

app.use(express.bodyParser());

app.use(express.cookieParser());

app.use(express.session({ secret: "keyboard cat", store: new RedisStore }));

Chúng ta cần phải có redis-server chạy cùng với node-server thì mới có thể sử dụng Session Vì bản thân node-server không lưu trữ thành phần dữ liệu của Session Thành phần dữ liệu này sẽ do redis-server lưu trữ và quản lý Có một nguyên tắc phải tuân theo

là redis-server phải được chạy trước khi node-server được chạy Redis-server là một gói phần mềm thực thi không cần cài đặt, có thể chạy được trên môi trường Windows

Trang 28

“Key”- khóa của dữ liệu được lưu có thể được mã hóa với thuật toán MD5 Dữ liệu dùng

để mã hóa có thể là một khoảng thời gian hiện tại, lúc chúng ta thực thi mã hóa dữ liệu Điều này đảm bảo không tạo ra khóa trùng nhau (nếu thời gian hệ thống của server đảm bảo luôn chạy đúng) Trong khi đó, “value” - phần nội dung của dữ liệu có thể được tổ chức ở dạng JSON Nhờ đó, nội dung có thể được tổ chức một cách linh động

Redis-server cho phép chúng ta thiết lập thời gian tồn tại của một cặp “key-value” trong

hệ thống Sau khoảng thời gian đó, chúng sẽ được xóa khỏi bộ nhớ một cách tự động Redis-server thích hợp cho việc lưu trữ và xử lý mẫu dữ liệu đơn giản, tương tối linh động như là bản ghi, phiếu bầu, tin nhắn…Redis-server cung cấp một tập từ vựng nguyên thủy rất hữu ích, nhiều lệnh làm việc trên một số cấu trúc dữ liệu Hầu hết các kiểu cấu trúc dữ liệu này đều quen thuộc với các lập trình viên, như là bảng băm, danh sách, cặp

“key-value” Bên cạnh đó Redis-server còn hỗ trợ một kiểu cấu trúc dữ liệu mới gọi là tập hợp (“set”)

Redis được chú ý vì chính nó đã vượt xa vai trò truyền thống của một kho lưu trữ dữ liệu, bằng cách cung cấp các kênh (“channels”) Kênh là một cơ chế cung cấp dữ liệu, cung cấp xuất bản, chức năng đăng ký, hữu ích cho các ứng dụng chat và chơi game

Hình 3.6: Các kênh của redis-server

Trang 29

Một tập các cặp “name-value” Trong rất nhiều ngôn ngữ, điều này được nhận thấy ở một đối tượng, một bản ghi, một cấu trúc, một từ điển, một bảng Hash…

Một danh sách các giá trị được sắp xếp theo thứ tự nào đó Trong hầu hết các ngôn ngữ thì điều này được nhận thấy ở mảng, vector, danh sách và tuần tự

3.4 MongoDB

3.4.1 Giới thiệu

MongoDB là một kho lưu trữ dữ liệu đầy sức mạnh, rất linh động và có khả năng mở rộng cao MongoDB là sự kết hợp của nhiều tính năng rất hữu dụng có trong cơ sở dữ liệu quan hệ, như là “Secondary Indexes”, “Range Queries” và “Sorting” Bản thân MongoDB cũng có hàng tấn chức năng hữu dụng như là hỗ trợ sẵn cho “MapReduce-style aggregation” và “Geospatial Indexes”

MongoDB sẽ không thể trở thành một công nghệ tuyệt vời nếu như chúng ta không thể làm việc với nó Và đã có rất nhiều công sức được bỏ ra nhằm làm cho MongoDB trở nên

dễ dàng khi mới bắt đầu, và cảm thấy hài lòng khi đã sử dụng MongoDB có mô hình dữ liệu thân thiện với các lập trình viên, tùy chọn cấu hình cho Administrator, ngôn ngữ APIs rất tự nhiên được thể hiện bởi các “Drivers” và “Database shell” MongoDB cho phép chúng ta tập trung vào chuyên môn viết mã chương trình của mình mà không cần bận tâm, lo lắng đến vấn đề lưu trữ dữ liệu

MongoDB là một cơ sở dữ liệu hướng tài liệu (“document-oriented database”), không phải là một cơ sở dữ liệu quan hệ MongoDB không xây dựng theo mô hình quan hệ nhằm mục đích là làm cho nó có thể dễ dàng được mở rộng

Ý tưởng cơ bản của MongoDB là thay thế khái niệm của “row” trong cơ sở dữ liệu quan

hệ bằng một hình mẫu linh động hơn đó là “document” Bằng cách cho phép nhúng tài liệu và mảng, cách tiếp cận hướng tài liệu làm cho MongoDB có khả năng làm cho một mối quan hệ kế thừa phức tạp được đại diện chỉ với một bảng ghi đơn giản Điều này phù hợp với cách suy nghĩ của của các lập trình viên sử dụng ngôn ngữ lập trình hướng đối tượng hiện đại về dữ liệu của họ

MongoDB không có lược đồ cố định, cấu trúc của tài liệu cũng không được định nghĩa trước và cũng không nhất thiết phải cố định

Dễ dàng mở rộng với MongoDB

Vì khối lượng dữ liệu cần lưu trữ sẽ mỗi ngày một nhiều hơn, các lập trình viên phải đối mặt với vấn đề khó khăn là làm sao mở rộng cơ sở dữ liệu của họ? Chúng ta có thể sử dụng một máy vi tính lớn hơn với khả năng lưu trữ cao hơn Phương án này gặp phải một vài khó khăn về vấn đề chi phí sẽ mắc hơn, và không phải ở nơi nào chúng ta cũng có thể tìm đặt mua những chiếc máy tính như thế Hoặc là chúng ta sẽ phải sử dụng nhiều máy hơn để chia sẻ lưu trữ dữ liệu Phương án này sẽ khả thi hơn khi chúng ta có thể thêm được nhiều không gian lưu trữ dữ liệu, đồng thời cũng tăng tốc độ thực thi Và đây là

Trang 30

phương án mà các ứng dụng web lớn lựa chọn để giải quyết bài toán lưu trữ và tốc độ thực thi

3.4.2 Một số chức năng nổi bật của MongoDB

 Indexing: MongoDB hỗ trợ “generic secondary indexes”, cho phép truy vấn nhanh hàng loạt, cũng như khả năng lập chỉ mục ”Unique”, “Compound” hay

“Geospatial”

 Stored JavaScript : là một sự thay thế của “stored procedures”, lập trình viên có thể lưu trữ và sử dụng “JavaScript function ” và “JavaScript values” ở phía máy chủ

 Aggregation: MongoDb hỗ trợ “MapReduce” và các công cụ tổng hợp khác

 Fixed-size collections: các tập có kích thướt cố định, có ích cho một số loại dữ liệu như là “logs”

Và một số tính năng phổ biến của cơ sở dữ liệu quan hệ không có trong MongoDB, như

là “joins” và “transactions” Đây là những quyết định về mặt kiến trúc nhằm mục đích làm cho MongoDB có khả năng mở rộng Bởi vì 2 tính năng trên sẽ không thể đáp ứng được yêu cầu tạo ra một hệ thống phân phối hiệu quả

 Incredible Performance: là mục đích chính của MongoDB và đã định hình nhiều quyết định về thiết kế MongoDB sử dụng giao thức “binary wire”, là chế độ chính

để giao tiếp với các máy chủ Trái ngược với giao thức “HTTP/REST” tốn nhiều chi phí MongoDB sử dụng bộ nhớ ánh xạ các tập tin trong công cụ lưu trữ mặc định và đẩy trách nhiệm quản lý bộ nhớ cho hệ điều hành Nó cũng có tính năng tối ưu hóa truy vấn năng động bằng cách “remembers” cách để thực thi một câu truy vấn nhanh nhất Nói một cách ngắn gọn, hầu hết mọi mặt của MongoDB đều được thiết kế để duy trì hiệu suất thực thi cao

Bản thân MongoDB cũng cố gắng giữ lại nhiều tính năng có trong cơ sở dữ liệu quan

hệ Chính nó cũng không muốn làm tất cả những gì mà cơ sở dữ liệu quan hệ đã làm

 Simple Administration: Triết lý quản trị của MongoDB là máy chủ phải xử lý càng nhiều cấu hình tự động càng tốt, cho phép (nhưng không yêu cầu) người dùng tinh chỉnh các thiết lập cấu hình của họ nếu thấy cần thiết

3.4.3 Một số khái niệm tương đồng giữa MongoDB và MySQL

Bảng 3.1- Mối liên hệ giữa MySQL và Mongo

Trang 31

Table Collection

Trong Mongo có khái niệm database giống như MySQL Nhưng Mongo không đòi hỏi phải tạo database trước khi tạo kết nối giống như MySQL Khi chúng ta thực hiện thao tác kết nối database, nếu database chưa được tạo thì nó sẽ được tạo ra ngay thời điểm đó Tương ứng với khái niệm Table trong MySQL là Collection Nó chứa các “tài liệu” thay

vì các dòng như trong Table Collection trong Mongo không cần định nghĩa trước cấu trúc, và cấu trúc của nó linh động, không cố định, có thể hình dung Collection như một bảng băm Số lượng field của mỗi dòng dữ liệu không cố định, thứ tự field cũng linh động, có thể lưu bất kỳ kiểu dữ liệu nào Bản thân Collection cũng không cần khởi tạo trước Khi chúng ta thực hiện một thao tác chèn một tài liệu vào Collection, mà nó chưa được tạo, thì MongoDB sẽ tạo ra Collection rồi sau đó chèn tài liệu vào Mỗi một Database có thể có nhiều Collection, nhưng thực tế tất cả tài liệu có thể được lưu trong cùng một Collection Nghĩa là thay vì lưu trữ dữ liệu trong nhiều Table khác nhau khi dùng MySql, thì chúng ta có thể thay thế các Table đó bằng một Collection

Trong MongoDb, khi chúng ta chèn thêm một tài liệu vào trong Collection, luôn luôn có sẵn một field với dữ liệu được tự động sản sinh ra gọi là “_id”, field dữ liệu này đóng vai trò như là “Primary Key” của Table trong MySQL MongoDB không có các khái niệm về ràng buộc khóa ngoại, cũng như Join các Table

3.4.4 Một vài câu truy vấn trong MongoDB

Bảng 3.2- Truy vấn trong MySQL và Mongo

Trang 32

create (a Number, b Number) db.createCollection(“mycoll”)

insert into users values(4,7) db.users.insert({a:4, b:7})

select a, b from users db.users.find({},{a:1, b:1})

select * from users db.users.find({})

select * from users where age=12 db.users.find({age:12})

select a, b from users where age=12 db.users.find({age:12},{a:1, b:1})

select * from users where age=12 order

by name

db.users.find({age:12}).sort({name:1})

select * from users where age > 12 db.users.find({age:{$gt:12}})

select * from users where age != 12 db.users.find({age:{$ne:12}})

select * from users where name like

“%PhuongNam%”

db.users.find({name:/PhuongNam/})

select * from users where like “Nam%” db.users.find({name:/^Name/})

select * from users where age > 12 and

age < 40

db.users.find({age:{$gt:12, $le:40}})

select * from users order by name desc db.users.find({}).sort({name:-1})

select * from users where age=12 and

name=‟nam‟ db.users.find({age:12, name:‟nam‟})

select * from users limit 10 skip 20 db.users.find({}).limit(10).skip(20)

select * from users where age=12 or

name=‟nam‟

db.users.find({$or:[{age:12}, {name:‟nam‟}]})

select * from users limit 1 db.users.findOne()

select stu_id from student s, class c var obj = db.class.findOne({teach_id:12})

Trang 33

where s.stu_id=c.stu_id and

c.teach_id=12

var stu_id = db.student.findOne({stu_id:obj})

select distinct name from users db.users.distinct(name)

select count(*) from users where age>20 db.users.find({age:{$gt:20}}).count()

update users set name=‟nam‟ where

stu_id=12

db.users.update({stu_id:12}, {$set:{name:‟name‟}})

update users set age=age+2 where

stu_id=12

db.users.update({stu_id:12},{$inc:{age:2}})

delete from users where stu_id=12 db.users.remove({stu_id:12})

3.4.5 Sử dụng MongoDB trong Node.js

Trong đồ án môn học, chúng em đã sử dụng module “mongodb” do node.js cung cấp để

có thể thao tác với cơ sở dữ liệu “MongoDB” Đoạn mã sau dùng để tạo kết nối đến cơ sở

dữ liệu “MongoDB”

var mongo = require(„mongodb‟); // load module “mongodb”

var DB = mongo.Db, Server = mongo.Server; // tạo ra các Object

var db = new DB(“DB_NAME”, new Server(“HOST_NAME”, PORT, {}), {native_parse:false} ); // tạo đối tượng kết nối đến cơ sở dữ liệu

db.open(); // mở kết nối

Sau khi đã mở kết nối thành công, chúng ta có thể thực hiện các câu lệnh truy vấn dữ liệu Câu truy vấn sử dụng trong module “mongo”viết tách rồi mệnh đề “select, insert, update, delete” với mệnh đề “where”

Select tài liệu trong Collection:

db.open(function(err, db) { // mở kết nối db

db.collection(“Collection_Name”, function(err, collection){// mở collection “studentTable”

collection.find(“Where_Query”,”Select_Query”, function (err, cursor){ // thực thi câu lệnh select name where age=20

cursor.toArray(function(err, items){ // lưu kết quả câu truy vấn vào array

Trang 34

// xử lý dữ liệu trong mảng “items”

} }

} }

Insert một tài liệu vào Collection

Trang 35

} }

}

3.3.6 Lưu ý các thao tác dữ liệu với node.js

Node.js luôn thực thi bất đồng bộ các thao tác vào ra dữ liệu Vì thế thao tác truy vấn dữ liệu với MongoDB cũng được thực thi bất đồng bộ Điều này khác với các cách làm truyền thống khi sử dụng các ngôn ngữ lập trình như C#, Java, PHP Giả sử trong một ứng dụng Java thao tác với cơ sở dữ liệu MySQL như sau:

Cả 4 thao tác trên được thực hiện trong 1 thread nên nếu không có lỗi ở một bước trung gian nào thì dữ liệu sẽ được hiển thị thành công

Nhưng nếu áp dụng cho Node.js thì sẽ không thể hiển thị dữ liệu dù không có lỗi ở các bước trung gian Vì trong Node.js thì 2 thao tác đầu tiên gồm “mở kết nối DB” và “thực thi câu Query” sẽ được thực thi trong thread1, 2 thao tác sau gồm “xử lý” và “hiển thị” kết quả lại được thực thi trong thread2 Do đó, trong khi thực thi truy vấn dữ liệu chưa hoàn tất thì thao tác xử lý và hiển thị dữ liệu đã được thực thi Vì vậy chuỗi 4 thao tác trên thực hiện trong node.js sẽ không thành công

Để thực thi các câu truy vấn dữ liệu cũng như các thao tác vào ra dữ liệu trong node.js thì chúng ta phải áp dụng kỹ thuật “callback”

Đoạn mã callback có thể được viết như sau

// phương thức sẽ được triệu gọi “callback”sau khi truy vấn dữ liệu hoàn tất

Xử lý dữ liệu truy vấn

Hiển thị dữ liệu truy vấn

Mở kết nối

DB

Thực thi câu Query

Chờ đợi dữ liệu…

Nhận được dữ liệu, triệu gọi callback

Callback Xử lý dữ

liệu

Hiển thị dữ liệu

Trang 36

GVHD: PGS.TS Vũ Thanh Nguyên SVTH: Đoàn Hữu Hạnh & Nguyễn Đắc Thắng

cursor.toArray(function(err, items){

callbackFunction(items);// callback }

} }

}

// gọi login

login(loginCallback);

3.4 OpenTok

3.4.1 Giới thiệu OpenTok

OpenTok API là một API miễn phí , linh hoạt dựa trên nền tảng đám mây (Cloud API ),

do đó nó dễ dàng để thêm video chat cho ứng dụng mà chúng ta không cần phải lo lắng

về cơ sở hạ tầng bên dưới Chúng ta xây dựng ứng dụng với thư viện JavaScript và ActionScript mà OpenTok API cung cấp

OpenTok API cung cấp cho nhà phát triển :

Trang 37

Các trường hợp xây dựng ứng dụng dựa vào OpenTok :

Hình 3.9: Một số ví dụ ứng dụng xây dựng với OpenTok

3.4.2 Hiệu suất hiện tại (Current Capacity):

Tok có thể thể hỗ trợ với mức giới hạn của một Session:

Trang 38

 1 người publish có thể subscribe đến 2500 người (điều này có nghĩa là một người truyền stream video/audio đến Session thì 2500 người có khả năng nhận stream video đó)

 3 người publish có thể subscribe đến 800 người

 Nó có khả năng đáp ứng 50 người tham gia, truyền video và chat đồng thời với nhau ( video conference)

Hình 3.10 – Hiệu suất của tok

3.4.3 Khởi tạo và kết nối đến một Session

3.4.3.1 Khởi tạo session object

Trước hết ta cần khởi tạo session object với mã Javascript :

Hình 3.11 – khởi tạo session

User A gọi phương thức khởi tạo session TB.initSession()

3.4.3.2 Kết nối đến Session

Trang 39

Hình 3.12 – kết nối session

User A kết nối đến Session bằng phương thức Session.connect()

Một khi kết nối đến Session thành công trên đám mây , thì session sẽ gửi một sự kiện sessionConnected trở lại trình duyệt của user

Hiện tại chỉ có user A kết nối đến Session nên mảng connection chỉ có connectionID:123

và hiện tại cũng chưa có stream nào được publish nên mảng stream rỗng

Trường hợp User B kết nối Session :

Hình 3.13 – hai user kết nối

User B kết nối đến Session bằng phương thức Session.connect() Lúc này mảng

connections sẽ có thêm connectionID:456 của User B Mảng stream lúc này vẫn rỗng

3.4.3.3 Publish đến Session

Để publish một stream , User B sử dụng phương thức Session.publish

Khi User B publish một stream thì User A sẽ được thông báo rằng User B đã publish một stream

Phương thức Session.publish() bắt đầu publish một stream audio/video đến Session

Trang 40

Hình 3.14 - Publish

Session sẽ gửi một sự kiện streamCreated đến tất cả các connection kết nối đến Session Lúc này mảng stream sẽ được them một streamed:abc5432 mà User B publish và ở trình duyệt A sẽ thấy được stream video/audio của User B

Lưu ý rằng ở User B cũng được thông báo stream mà chính nó publish đến Session Nhưng ở User B có thể nhận biết stream đó là của mình publish thông qua việc so sánh streamID và hầu hết tất cả trường hợp nó sẽ bỏ qua sự kiện mà chính nó publish

3.4.3.4 Subscribe to a stream

Khi User A nhận được stream audio/video mà User B publish thì lúc này User B chưa nhận được stream audio/video của User A nên để UserB nhận được thì User A sẽ phải subscribe đến Session

Để Subscribe một stream dùng phương thức Session.subscribe()

Ngày đăng: 23/12/2018, 06:13

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w