Tải bản đầy đủ (.docx) (102 trang)

Thử nghiệm triển khai dịch vụ web hướng thời gian đáp ứng tức thời qua công nghệ nodejs

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 (2.25 MB, 102 trang )

ĐẠI HỌC QUỐC GIA HÀ NỘI
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ

-------o0o-------

VĂN DUY ĐỨC

THỬ NGHIỆM TRIỂN KHAI DỊCH VỤ WEB HƯỚNG
THỜI GIAN ĐÁP ỨNG TỨC THỜI QUA CÔNG NGHỆ
NODEJS

LUẬN VĂN THẠC SĨ CÔNG NGHỆ THÔNG TIN

Hà Nội – 2014

1


ĐẠI HỌC QUỐC GIA HÀ NỘI
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ

-------o0o-------

VĂN DUY ĐỨC

THỬ NGHIỆM TRIỂN KHAI DỊCH VỤ WEB HƯỚNG
THỜI GIAN ĐÁP ỨNG TỨC THỜI QUA CÔNG NGHỆ
NODEJS
Ngành: Công nghệ thông tin
Chuyên ngành: Kỹ thuật phần mềm
Mã số: 60 48 01 03



LUẬN VĂN THẠC SĨ CÔNG NGHỆ THÔNG TIN

NGƯỜI HƯỚNG DẪN KHOA HỌC: GS.TS NGUYỄN THANH THỦY

Hà Nội – 2014

2


LỜI CAM ĐOAN
Tôi xin cam đoan những điều sau:
- Luận văn này là do tôi thực hiện.
- Những kiến thức tham khảo được tôi ghi rõ nguồn gốc và tác giả.
- Tôi xin chịu trách nhiệm về nghiên cứu của mình.
Hà Nội, Ngày 10 tháng 06 năm 2014
Học viên

Văn Duy Đức

3


LỜI CÁM ƠN
Trước tiên tôi xinh gửi lời biết ơn sâu sắc đến gia đình, bố mẹ đã luôn tạo điều kiện
tốt nhất cho tôi trong suốt quá trình học cao học cũng như thực hiện luận văn.
Tôi xin được gửi lời cảm ơn đến tất cả quý thầy cô đã giảng dạy trong chương
trình Cao học Công nghệ thông tin - Trường Đại học công nghệ, những người đã truyền
đạt cho tôi những kiến thức hữu ích về Công nghệ làm cơ sở cho tôi thực hiện tốt luận
văn này.

Tôi xin chân thành cảm ơn GS TS. Nguyễn Thanh Thủy đã tận tình hướng dẫn cho
tôi trong thời gian thực hiện luận văn. Mặc dù trong quá trình thực hiện luận văn có giai
đoạn không được thuận lợi nhưng những gì Thầy đã hướng dẫn, chỉ bảo đã cho tôi nhiều
điều bổ ích trong thời gian thực hiện đề tài.
Tôi cũng xin gửi lời cảm ơn đến tất cả các Thầy Cô đang giảng dạy tại các Khoa
của Trường Đại học Công Nghệ – Đại học Quốc Gia Hà Nội (ĐHQG-HCM) đã tận tình
chỉ bảo, đóng góp ý kiến để Luận văn được hoàn thiện.
Hà Nội, Ngày 10tháng 06 Năm 2014
Học viên

Văn Duy Đức

4


MỞ ĐẦU
Web đóng vai trò quan trọng trong Công nghệ thông tin. Web đóng vai trò kết nối người
dùng. Ứng dụng web được phát triển ban đầu với sự xuất hiện của HTML vào năm 1993,
công bố bởi tổ chức W3C (World wide web consortium). Sau đó nhiều công nghệ web
động mang đến cho người dùng và nhà phát triển trải nghiệm mới.
PHP được phát triển từ năm 1999, là 1 loại Server-side scripting. Tính đến nay đã áp dụng
cho hơn 240 triệu trang web và 2.1 triệu máy chủ web. Hiện giờ đang phát triển đến phiên
bản 5.5.
Ngoài PHP, Microsoft đưa ra ASP (Active server page) và ASP.NET. Java thì đưa ra JSP.
Làm cho cộng đồng phát triển web càng thêm phong phú.
Từ nhu cầu phát triển web, một kỹ thuật mới được người ta phát minh ra là Asynchronous
Javascript and XML (AJAX) được chính thức công bố vào 18/02/2005. Kỹ thuật này cho
phép gửi nhận dữ liệu một cách bất đồng bộ từ Client đến Web-server.
Vào những năm gần đây, với sự bùng nổ của các thiết bị di động – smart phone, máy tính
bảng. Ứng dụng web ngoài việc hỗ trợ Browser trên máy tính còn phát triển trên các trình

duyệt với giao thức WAP.
NodeJS ra đời cũng nằm trong xu thế phát triển chung, NodeJS được thiết kế để xây dựng
các ứng dụng Web hoặc Network nhanh, khả mở, và chạy trên nhiều thiết bị. Nodejs đang
được phát triển và sử dụng rộng rãi. Nodejs đang ở phiên bản v0.10.28 và tính đến thời
điểm này đang có 9969 revision có 524 contributor cho việc phát triển.
Bài luận văn viết ra với mục đích giới thiệu về công nghệ Nodejs. Phương pháp và cách
làm của Nodejs khi áp dụng vào các trang web có phản ứng tức thời. Sự khác biệt đó ra
sao với Ajax khi mà họ sử dụng Request/response thông qua XMLHttpRequest so với
Websocket của Nodejs. Đồng thời giới thiệu về kiến trúc bên trong của Nodejs. Hiệu năng
của Nodejs so với các Application server phổ biến. Ứng dụng 13Instant là ứng dụng demo
công nghệ Nodejs, sử dụng công nghệ Nodejs để phát triển các tính năng đòi hỏi phản
ứng tức thời trên Web như web chat, news feed, instant searching.

5


Bài luận văn chia gồm 54 chương chính vớiý tưởng chủ đạo của từng chương như sau:
• Chương 1. Tổng quan về Web đáp ứng tức thời : Chương này làm rõ, giới thiệu
Web đáp ứng tức thời là gì. Lịch sử, các công nghệ đang sử dụng để thực hiện.
• Chương 2. Nodejs: Chương này giới thiệu về Nodejs, Nodejs là gì, ý nghĩa, tác
dụng. Kiến trúc của Nodejs. Tổ chức Module Nodejs.
• Chương 3. Hiệu năng Nodejs: Chương này so sánh hiệu năng của Nodejs với các
Application server phổ biến.
• Chương 4. Ứng dụng 13Instant: Chương giới thiệu ứng dụng 13Instant. Là ứng
dụng áp dụng Nodejs vào để tạo ra 1 ứng dụng Web phản ứng tức thời gồm News
feed và Web chat.
• Kết luận: Kết luận về công nghệ Nodejs, ưu điểm của Nodejs so với các nền tảng
khác. Về nhỏ gọn, nhanh chóng, và dễ dàng phát triển. Và đánh giá về tương lai
công nghệ Nodejs.


MỤC LỤC

6


DANH MỤC HÌNH VẼ

7


DANH MỤC THUẬT NGỮ
STT

Thuật ngữ

Ý nghĩa

01

WEB

World wide web, là 1 hệ thống các liên kết nối siêu văn
bản (Hyper text document) mà có thể truy cập được từ
Internet.

02

Website

Hoặc được viết là web site, hoặc là site. Là tập các trang

Web có liên quan đến nhau, phục vụ trong

03

WAP

Wireless Application Protocol là một tiêu chuẩn kỹ thuật
cho phép truy cập thông tin qua Mạng di động.

04

Ajax

Asynchronous Javascript and XML: là một tập hợp các kỹ
thuật có liên quan đến nhau trong phát triển Web để tạo ra
ứng dụng Web bất đồng bộ.

05

V8

V8 là 1 engine (công cụ) mã nguồn mở Javascript của
Google. Viết bằng C++ và sử dụng trong Google Chrome.
Trong lập trình máy tính, mẫu Thread pool (hoặc
replicated workers hoặc worker-crew model) là nơi số
lượng thread được tạo ra để thực hiện 1 số lượng các tác
vụ.

06


Thread pool

07

Libeio

Là 1 thư viện đầy đủ tính năng (full-featured) I/O bất đồng
bộ cho ngôn ngữ C.

Scalability

Là khả năng của hệ thống, network hoặc tiến trình
(process) có thể làm chủ sự tăng trưởng của công việc theo
cách hợp lý hoặc là khả năng của nó có thể lớn lên để thỏa
mãn sự tăng trưởng này.

Event loop

Một thuật ngữ trong khoa học máy tính (hoặc tên khác
Message Dispatcher, Message Loop, Message Pump hoặc
Run loop). Là cấu trúc lập trình mà chờ đợi là gửi đi các
sự kiện hoặc thông điệp trong 1 chương trình. Mỗi request
có event handler tương ứng.

Libev

Một Event loop implementation đầy đủ tính năng và hiệu
năng cao mà mô hình theo libevent. Được sử dụng trong
GNU Virtual Private Ethernet, rxvt-unicode, auditd,
Deliantra MORPG.


08

09

10

8


Một thuật ngữ trong lập trình máy tính, callback là 1 đoạn
code được truyền vào như 1 tham số của 1 đoạn code
khác,

11

Callback

12

Heap memory

Một vùng bộ nhớ được cấp phát động.

13

Thread-stack

Memory dạng stack hỗ trợ làm việc trong Thread.


14

Dead-lock

15

16

17

18

19

20

21

Là 1 trạng thái mà 2 công việc cạnh tranh chờ nhau kết
thúc, dẫn đến không công việc nào kết thúc cả.

Event Machine là 1 hệ thống phần mềm được thiết kế để
Ruby Event Machine viết ứng dụng chuyên mở rộng cho Ruby. Nó cung cấp
event-driven I/O mà sử dụng reactor pattern.
Python Twisted

Là một framework event-driven network programming
được viết bởi Python. Nằm dưới sự quản lý của MIT
license.


Apache

HTTP Server phát triển bởi Apache Software Foundation.
Dịch vụ HTTP service an ninh, hiệu quả, và khả mở với
các chuẩn HTTP hiện có. Cross platform trên cả Windows
và Linux.

Nginx

Proxy reverse server mã nguồn mở cho các giao thức
HTTP, HTTPS, SMTP, POP3, và IMAP chạy như là Load
balancer, HTTP cache và cũng là một Webserver.

Context switch

Trong lĩnh vực máy tính, 1 context switch là 1 tiến trình
lưu trữ và phục hồi trạng thái (context) của 1 process hoặc
thread, làm cho việc thực thi có thể được hồi phục tại cùng
điểm lưu trữ tại 1 thời điểm khác.

Execution stack

Trong khoa học máy tính, Excecution stack (còn gọi là
callstack) là 1 cấu trúc ngăn xếp mà lưu trữ thông tin về
các phương thức và chương trình đang chạy.

Non blocking I/O

Còn được gọi là Asynchronous I/O. Là 1 dạng của xử lý
input/ouput mà cho phép các xử lý khác tiếp tục chạy

trước khi mà giao dịch I/O chấm dứt.

22

Network traffic

23

Postgresql

Network traffic hoặc data traffic trong 1 mạng máy tính.
Data được đo bằng Network packets.
Hệ quản trị cơ sở dữ liệu hướng đối tượng-quan hệ. Phát
triển bằng ngôn ngữ C, và giấy phép là PostgresSQL
9


license.
245

Socket.io

Thư viện Javascript cho ứng dụng web thời gian thực. Hỗ
trợ realtime, giao tiếp bi-directional cho web client và
server.

256

Websocket


Là 1 giao thức cung cấp kênh giao tiếp full-duplex qua 1
kết nối TCP. Giao thức được W3C chuẩn hóa.

10


CHƯƠNG 1.TỔNG QUAN VỀ WEB ĐÁP ỨNG TỨC THỜI
Web đáp ứng thời gian tức thời được gọi bằng thuật ngữ Realtime web:
Web thời gian thực (real time web) là một tập hợp các công nghệ (technologies) và
thực tiễn (practices) cho phép người dùng đầu cuối nhận được thông tin ngay sau khi nó
được xuất bản bởi tác giả của nó, chứ không phải là đòi hỏi rằng họ hoặc phần mềm của
họ kiểm tra một nguồn theo định kỳ để cập nhật.
Web thời gian thực (realtime web) về cơ bản là khác với tính toán thời gian thực
(Realtime computing) bởi vì không có biết khi nào, nhận được một phản ứng. Thông tin
được truyền theo cách này thường là tin nhắn ngắn (short message), cập nhật trạng thái
(status update), cảnh báo tin tức (news alert), hoặc liên kết đến tài liệu dài hơn (link to
longer document). Nội dung manh tính "mềm" ở chỗ nó dựa trên ý kiến của người trên
mạng xã hội, thái độ, suy nghĩ, và lợi ích - khác với tin tức chính luận hay sự kiện.
Với Real-time web, thời gian đi vòng tín hiệu server đến client phải <=1s mới
được coi là realtime và không được gây phiền nhiễu cho người dùng trong phiên kết nối
(connection). Về tranh luận giữa mạng xã hội và real-time web, thì real-time web mặc
định là mạng xã hội, còn ngược lại thì không (WEB-r xuất hiện trước Web 2.0).
Ví dụ thành công nhất của web thời gian thực là newsfeed của Facebook và
Twitter. Cách tiếp cận này đang được thực hiện trong mạng xã hội, các trang tìm kiếm và
trang tin tức, trải nghiệm giống như instant messaging. Lợi ích ban đầu là tăng sự tham
gia của người sử dụng ("dòng chảy") và giảm tải máy chủ. Bắt đầu từ tháng 12/2009,
Google giới thiệu tại Bảo tàng lịch sử máy tính tính năng tìm kiếm thời gian thực mới của
họ. [1]
Mô hình mạng thực sự-thời gian thực ra đời vào năm 2000 tại mc2labs.com (aka
Mc2labs RealTime Industries) bởi một nhà nghiên cứu độc lập người Ý.

AJAX
Nhắc đến Web đáp ứng tức thời thì không thể không nhắc tới Ajax (Asynchronous
Javascript and XML). Mô hình xuất hiện đầu những năm 2000, mang lại trải nghiệm mới
cho người dùng về môi trường web.
Ajax không xuất hiện từ hư không, nhưng cái gì cũng có lý do của nó. Nguồn gốc
ra đời: được làm nóng trong 1 thời gian. Sau thời gian dài làm việc trên Web đã khuyến
khích người tạo ra công cụ làm việc mang tên Ajax. Trong kỷ nguyên bong bóng
DHTML, nhà phát triển khắp thế giới giải mã những sức mạnh thú vị của Javascript và
mang lại một mô hình làm việc thú vị cho Web.
11


Đoạn đầu tiên và quan trọng trong câu chuyện về Ajax là XMLHttpRequest (XHR)
API. XHR là Javascript API dùng để truyền dữ liệu giữa Webbrrowser và Webserver. Cho
phép browser dùng HTTP Post (truyền data tới server) hoặc GET request (truy cập data từ
server). API này là core của tương tác Ajax và 1 trong những công nghệ nền tảng của phát
triển web.
Đó cũng là món quà tuyệt vời nhất của MS Internet Explorer team đưa cho
Internet.
Thực tế là XHR lần đầu xuất hiện trong IE5 vào năm 2000. Nguồn gốc viết bởi
Alex Hopmann dưới dạng 1 Microsoft ActiveX Control. XHR được tạo ra để dùng với
Microsoft Outlook Web Access, thiết kế để làm mịn thao tác giữa giao diện nền nâng cao
và Microsoft Exchange Server.
Mặc dầu gói phần mềm này từ Microsoft không hoàn toàn được coi như là sự bắt
đầu có ý đồ. Nhưng XHR hiển nhiên tăng trưởng quá giới hạn của sản phẩm ban đầu. Nó
được implement trong hầu hết trình duyệt chính và được chấp nhận bởi chuẩn W3C.
Bên ngoài implementation của Microsoft, nhiều công ty đã mang đến những đột
phát trong lĩnh vực Ajax. Mặc dầu nhiều công ty thí nghiệm với những công nghệ này.
Nổi bật thì chỉ có 2, 1 bởi vì sự sáng tạo và thường được trích dẫn trong sự phát triển của
Ajax, cái kia là vì nó là 1 người khổng lồ Internet. Đó là:

• Oddpost
Oddpost là 1 web-based email client thu phí mà khởi động vào năm
2002. Nó nâng bật parttern dạng ealmnow. Với design và tương tác, nó gợi
nhớ desktop mail client.
Về bản chất, nó sử dụng khái niệm mà lập trình viên gọi là Data
Packs để truyền những khối dữ liệu nhỏ từ server tới browser. Nó làm cho 1
câu truyện cổ tích. Oddpost bị Yahoo mua lại và làm thành phần cơ bản để
xây dựng lại Yahoo mail.
• Gmail, Google Maps
Sự thay đổi cách mạng bắt đầu 2 năm sau với Gmail, Google Suggest
và Google Maps services. Ba sản phẩm trên đẩy bật kỹ thuật Ajax mạnh mẽ
và nhìn chung thổi lửa vào sự phát triển web trên thế giới. Sự tương tác và
phản ứng nhanh đang chỉ là câu chuyện cổ tích với công chúng. Thì bất ngờ
nổi dậy với các ứng dụng Google.
Không nhiều người biết về việc này, nhưng những điều mà về nó rất
thú vị trong sự phát triển web trên thế giới. Vào thời điểm đó, người ta chỉ
biết về 1 cái gì đó thú vị đang diễn ra trong việc phát triển ứng dụng web.
12


WEB TRAFFIC
Các mô hình sau đây chỉ ra sự gửi/nhận dữ liệu giữa Client/server cho mô hình
web.
Regular http

Hình . Giao tiếp http thông thường

• Client request 1 http page từ server
• Server tính toán nội dung phản hồi
• Server gửi phản hồi cho client

Ajax Polling

Hình . Ajax polling

13


Ajax tạo ra connection tới server cho mỗi request, gửi request (với possible data
như request method GET, POST, PUT, DELETE... tham số trong url), lấy phản hồi từ
server. Sau đó kết nối đóng lại, đó là 1 single request, response cho mỗi lời gọi Ajax. Hỗ
trợ trong hầu hết trình duyệt.
Ajax long polling

Hình . Ajax long poll

Tạo ra connection tới server như AJAX, nhưng thỉnh thoảng connection lại là
keep-alive, trong suốt phiên mở connection có thể nhận dữ liệu từ server. Client phải
reconnect định kỳ sau khi connection được đóng vì timeout. Trong server side, nó được
đối như HTTP request – giống Ajax. Được hỗ trợ trong hầu hết trình duyệt.
Server-sent-Events (SSE)

14


Hình . Server-sent-events

Client mở connection tới server. Server gửi dữ liệu tới client khi mà nó sẵn sang.
SSE làm việc tốt khi mà server cần thiết gửi dữ liệu thường xuyên. Không tốt khi mà
client cần gửi dữ liệu.
Websocket


15


Hình . Websocket

Tạo ra 1 TCP connection tới server, và giữ connection lâu khi nào cần. Server &
client – cả 2 đều có thể đóng kết nối. Giao tiếp 2 chiều, server và client trao đổi dữ liệu
theo 2 chiều vào bất kỳ thời điểm nào. Nó hiệu quả khi mà ứng dụng đòi hỏi thông điệp
liên tục. Websockets có dữ liệu framing bao gồm mặt nạ (masking) cho mỗi thông điệp từ
client tới server. Vì thế dữ liệu được mã hóa 1 cách đơn giản. Hỗ trợ bởi 1 số trình duyệt
danh tiếng.

16


CHƯƠNG 2.NODEJS
"Node.js làm mạnh các ứng dụng web của chúng tôi và cho phép đội phát triển di
chuyển nhanh hơn rất nhiều trong việc đem thiết kế vào cuộc sống. Chúng tôi hạnh
phúc vì sức mạnh của Javascript"
Jeff Harrell
Director of Engineering in Paypal
"Node nắm giữ toàn bộ back-end, cung cấp elastic scalable cluster server để hỗ
trợ web front-end và cung cấp RES API cho partners của chúng tôi. Node hoàn
thiện cho chúng tôi về Javascript, JSON thông qua các platforms stack, Web,
Mobile, Extension và Node, tạo hành lang cho đội phát triển của chúng tôi tối đa
agility và portability."
Guy Korland.
CTO - Shopetti.
“Trong 1 mặt khác, toàn bộ mobile software stack của chúng tôi được xây xựng

bằng Node. Một lý do cho việc khả mở. Lý do thứ hai là Node chỉ ra một hiệu năng
lớn có thể đạt được.”
Kiran Prasad.
Director of Engineering, Mobile – LinkedIN
"Node đem lại cho người dùng Azure trải nghiệm đầu tiên về end-to-end
Javascript cho sự phát triển của 1 thế hệ ứng dụng real-time hoàn toàn mới.”
Claudio Caldato
Principal Program Manager, Microsoft Open Technologies
Đó là nhận xét của các chuyên gia về Nodejs, và còn nhiều đánh giá nữa từ các
công ty như caliper.io, c9.io… Vậy Nodejs là gì khiến họ quan tâm như vậy?

2.1. GIỚI THIỆU VỀ NODEJS
Định nghĩa Nodejs:
Là một nền tảng xây dựng trên Chrome Javascript Runtime để mà dễ dàng xây
dựng ứng dụng nhanh, khả mở về Network. Nodejs sử dụng mô hình hướng sự kiện mà
làm cho nó nhỏ gọn và hiệu quả, là lý tưởng cho ứng dụng real-time tập trung vào dữ liệu
mà chạy trên nhiều thiết bị phân tán.
17


Tác giả của Nodejs là Ryan Dahl, khởi động phát triển Nodejs vào 2009. Tư tưởng
của Nodejs tương tự với Twisted trong Python hay EventMachine cho Ruby.
Công ty Joyent vận hành Nodejs, nơi mà chạy Cloud hosting service cho các ứng
dụng node.
Mô hình tổng quan các thành phần của NodeJS như sau:

Hình . Kiến trúc Nodejs

Các thành phần trong kiến trúc Nodejs bao gồm:
• Node standard library: Tập thư viện chuẩn của Nodejs

• Node bindings (socket, http, …): mô hình làm việc Network
• V8: Javascript engine được phát triển bởi Google – mã nguồn mở.
• Libeio: Là 1 thư viện đầy đủ tính năng (full-featured) I/O bất đồng bộ cho ngôn
ngữ C.
• Libev:Một Event loop implementation đầy đủ tính năng và hiệu năng cao mà
mô hình theo libevent. Được sử dụng trong GNU Virtual Private Ethernet, rxvtunicode, auditd, Deliantra MORPG.
• C-ares: là thư viện viết bằng C cho các truy vấn DNS bất đồng bộ.
• Openssl: Thư viện mã nguồn mở thự thi Secure socket layer.

2.2. TỔNG QUAN VỀ NODEJS
Mục tiêu của Node là cung cấp một cách dễ dàng để xây dựng các chương trình
mạng lưới khả năng mở rộng (scalable network programs).

18


Trong ví dụ về máy chủ web "Hello world" máy chủ web dưới đây, nhiều kết nối
từ trạm (client) có thể được xử lý đồng thời. Node giao tiếp với hệ điều hành (thông qua
epoll, kqueue, /dev/poll, hoặc select) rằng Node sẽ được thông báo khi một kết nối mới
được thực hiện, rồi nằm chờ (sleep). Nếu có kết nối mới, Node thực hiện lời gọi callback.
Mỗi kết nối chỉ chiếm dụng 1 cấp phát bộ nhớ heap nhỏ.
var http = require('http');
http.createServer(function(req, res){
res.writeHead(200,{'Content-Type':'text/plain'});
res.end('Hello World\n');
}).listen(1337,"127.0.0.1");
console.log('Server running at http://127.0.0.1:1337/');

19



Điều này trái ngược với mô hình hoạt động đồng thời phổ biến ngày nay, nơi đề hệ
điều hành hỗ trợ luồng (Thread) được sử dụng. Làm việc mạng dựa trên thread (Threadbased networking) là tương đối không hiệu quả và khó sử dụng. Node sẽ chỉ ra hiệu quả
bộ nhớ tốt hơn nhiều dưới tải trọng cao so với hệ thống mà phân chia Thread-stack2MB
cho mỗi kết nối. Hơn nữa, người sử dụng Node không phải lo về dead-lock trong tiến
trình (process) –vì không có khóa (lock) ở đây. Hầu như không có chức năng nào trong
Node trực tiếp thực hiện trên I/O, vì vậy tiến trình không bao giờ block. Bởi không blocks
đối tượng nào, chúng ta sẽ cần ít lập trình viên chuyên gia hơn để phát triển hệ thống.
Node tương tự như trong thiết kế và chịu ảnh hưởng của hệ thống như Ruby's
Event Machine hay Python Twisted. Node tác động mô hình sự kiện sâu hơn -nó trình bày
các vòng lặp sự kiện như là một ngôn ngữ xây dựng (construct language) thay vì như một
library. Trong các hệ thống khác luôn luôn có một lời gọi chặn (blocking call) để bắt đầu
sự kiện vòng lặp. Thường là một người định nghĩa hành vi thông qua callbacks vào đầu
một kịch bản và cuối cùng bắt đầu một máy chủ thông qua một blocking-call như
EventMachine::run (). Trong Node không có một lời gọi khởi động vòng lặp như vậy.
Node đơn giản là đi vào vòng lặp sự kiện sau khi thực thi input script. Node thoát ra khỏi
vòng lặp sự kiện khi không có thêm callback để thực hiện. Hành vi này cũng giống như
trình duyệt Javascript-vòng lặp sự kiện được ẩn cho người dùng.
HTTP là một giao thức hạng nhất trong Node. Thư viện Node của HTTP đã phát
triển ra từ những kinh nghiệm của các tác giả phát triển và làm việc với các máy chủ web.
Ví dụ, luồng dữ liệu thông qua hầu hết web framework là không thể. Node cố gắng sửa
chữa những vấn đề này trong HTTP Parser và API của nó. Cùng với cơ sở hạ tầng hoàn
toàn evented của Node, nó làm cho một nền tảng (foundation) tốt cho các thư viện web
hoặc các Framework.
Việc chạy vòng lặp sự kiện trên 1 tiến trình, dẫn tới câu hỏi nếu máy tính đa lõi thì
sao? Không phải là tiến trình cần thiết để mở rộng quy mô các chương trình tới các máy
tính đa lõi? Bạn có thể bắt đầu tiến trình mới (new process) thông qua child_process.fork
() các tiến trình khác sẽ đượcsắp xếp chạy song song. Cho trường hợp cân bằng tải kết nối
yêu cầu (incoming connections) qua nhiều quy trình sử dụng module cluster.


2.3. NỀN TẢNG THIẾT KẾ NODEJS
Các tính chất về NodeJS:
• Server side JS
20







Built on Google V8
Evented, non-blocking I/O, tương tự EventMachine hoặc Twisted.
CommonJS module system.
8000 dòng C/C++, 2000 dòng Javascript, 14 người bổ trợ/(cung cấp/quyên góp)

Sự khác nhau về hiệu năng giữa các nền tảng
Apache sử dụng 1 tiến trình (thread) cho mỗi Connection.
NGINX không dùng tiến trình, nó dùng vòng lặp sự kiện (Event loop).
Sự khác nhau nằm ở chỗ:
Context switching không miễn phí
Execution stacks ngốn memory
Nhận xét: Với khối lượng lớn đồng thời (massive concurrency), không thể dùng 1
OS thread cho mỗi connection.
Luồng thực hiện hoặc là block toàn bộ tiến trình hoặc ngụ ý nhiều ngăn xếp thực
hiện.Ví dụ đoạn code sau
var result = db.query("select..");
// use result
Nó block toàn bộ process hoặc ngụ ý multiple execution stacks.Nhưng đoạn code
sau:

db.query("select..", function (result) {
// use result
});

21


Cho phép chương trình trở về vòng lặp sự kiện (event loop) ngay lập tức.
Không yêu cầu machinery. Đó là phương pháp làm thế nào I/O cần thực hiện.
Vậy tại sao mọi người không sử dụng event loops, callbacks và non-blocking I/O.
Vì hai lý do cultural (văn hóa) và infrastructual (nền tảng).
"Văn hóa thiên vị" (Cultural bias)
Hãy so sánh 2 đoạn code sau:
Đoạn code 01:
puts('Enter your name: ') ;
var name = gets();
puts("Name: " + name);
Ta nói về yêu cầu input và không làm gì đến khi input được nhập vào.
Đoạn code 02:
puts('Enter your name: ');
gets(function(name) {
puts('Name: ' + name);
});

22


Thường bị từ chối vì quá phức tạp.
Thiếu nền tảng (Missing Infrastructure)
• POSIX async file I/O không tồn tại.

• Man pages không thông báo nếu 1 function truy cập ổ đĩa
• Không có closure hoặc anonymous function trong C, làm cho việc callback khó khăn
• Thư viện database không hỗ trợ support Async query
• Giải mã DNS bất đồng bộ không phải chuẩn hóa trên hầu hết hệ thống.
Và quá nhiều nền tảng
• Event Machine, Twisted, AnyEvent cung cấp nền tảng Vòng lặp sự kiện (Event loop)
rất tốt.
• Dễ dàng tạo các máy chủ hiệu quả
• Nhưng người dùng khó hiểu làm các nào để kết nối với các thư viện khác.
• Người dùng vẫn đòi hỏi Kiến thức chuyên gia (expert knowledge) về vòng lặp sự kiện
(event loops), non-blocking I/O.
• Văn hóa của Javascript đã hướng tới lập trình hướng sự kiện (evented programming).
Về dự án Node.js:
Để cung cấp một cơ sở hạ tầng (infrastructure) hoàn toàn hướng sự kiện evented,
non-blocking và tính đồng thời cao (concurrency).
Mục tiêu thiết kế của Nodejs
• Không function nào thao tác trực tiếp I/O
• Để nhận thông tin từ ổ đĩa, network, hoặc 1 tiến trình khác nhất thiết cần 1
callback.
• Ở mức thấp:
o Stream mọi thứ, không bắt buộc buffering dữ liệu
o Không remove tính năng tại POSIX layer. Ví dụ hỗ trợ bán-đóng (half-closed)
kết nối TCP
• Có hỗ trợ built-in cho những giao thức quan trọng nhất TCP, DNS, HTTP
• Hỗ trợ nhiều tính năng của HTTP
o Chunked request và response
o Keep alive
o Giữ request cho ứng dụng comet
• API quen thuộc với Javascript client-side và old school UNIX hackers.
• Platform independent

Các thành phần bên trong – internal design
23









V8
libev
libeio
http parser
evcom
udns

2.4. VẤN ĐỀ C10K
Đó là vấn đề về việc các máy chủ web xử lý mười nghìn khách hàng cùng một lúc.
Càng ngày môi trường Web càng là 1 nơi rộng lớn, điều này hoàn toàn bình thường.
Và thị trường máy tính cũng là lớn. Bạn có thể mua một máy 1GHz với 2 GB
RAM và một card Ethernet 1Gbpsvới giá $ 1200 hoặc nhiều hơn. Chúng ta cùng xem - tại
mốc 20.000 client (khách truy cập), tần suất đạt50KHz, 100KBytes, và 50Kbpscho mỗi
khách truy cập. Chúng ta không cần dùng bất kỳ công suất nào nhiều hơn thế để lấy bốn
kilobyte từ đĩa và gửi chúng vào mạng một giây một cho mỗi hai mươi ngàn khách hàng.
(Bằng phép tính đó, cho kết quả $0.08 cho mỗi khách hàng. Những phép tính phí bản
quyền $100/client của 1 số hệ thống có vẻ quá đắt đỏ cho người dùng). Vì vậy, phần cứng
không phải là nút cổ chai.
Vào năm 1999, một trong những trang web ftp bận rộn nhất, cdrom.com, thực sự

xử lý 10.000 khách hàng đồng thời thông qua một đường ống (pipe) Gigabit Ethernet.
Tính đến năm 2001, tốc độ tương đương được cung cấp bởi nhiều ISP (Nhà cung cấp dịch
vụ), những người màkỳ vọngđiều đó ngày càng trở nên phổ biến với khách hàng doanh
nghiệp lớn.
Và mô hình máy khách dẹt (thin) của máy tính dường như được trở lại trong phong
cách - thời gian này với máy chủ trên Internet, phục vụ hàng ngàn khách hàng.
Với tư duy đó, ở đây có vài lưu ý về cách cấu hình hệ điều hành và viết code để hỗ
trợ hàng ngàn khách hàng. Các cuộc thảo luận xoay quanh hệ điều hành lai-Unix, được
nhiều sự quan tâm, và hệ điều hành Windows cũng được xem xét (cover).
Các Site liên quan
• Trang cá nhân của Nick Black Fast UNIX
black.com/dankwiki/index.php/Network_servers).

24

Servers

(http://nick-


• Trong năm 2003, Felix Von Leitner đặt đồng thời cả 1 Page
( và 1 bài thuyết trình ( về vấn đề Khả năng mở rộng mạng (network scalability), so sánh
nhiều lời gọi hàm và các hệ điều hành khác nhau. Một trong những góc nhìn của
ông là nhân Linux 2.6 hoàn toàn chiến thắng nhân 2.4, nhưng có nhiều đồ thị tốt
đưa cho người lập trình hệ thống các tư tưởng trong 1 số thời điểm (thought for
sometime).
(Xem
thêm
comment
về

Slashdot
( rất thú vị khi xem khi nào có người theo dõi
benchmarks tăng cường kết quả của Felix.)
Ebook cần đọc
• Unix Network Programming: Networking Apis: Sockets and Xti (Volume1) W.Richard. Stevens. Nó mô tả nhiều chiến lược I/O và pitfalls liên quan đến việc
viết server hiệu năng cao. Nó thậm chí nói về bài toán 'thundering herd'
( />o Và nếu bạn đọc rồi, hãy đọc 1 ghi chú của Jefff Darcy về thiết kế máy chủ
hiệu năng cao.
o Sách hữu ích khác cho ai mà "sử dụng" chứ không phải "phát triển" 1 web
server là "Building Scalable Web Sites" bởi Carl Henderson.
I/O Frameworks
Những thư viện đóng gói và sẵn sàng và trừu tượng hóa kỹ thuật được trình bày
dưới đây, độc lập hóa mã nguồn người phát triển với hệ điều hành và làm cho nó khả
chuyển (portable).
• ACE, 1 framework C++ cồng kềnh, object/oriented implementations cho
những chiến lược I/O và những thứ hữu ích khác. Cụ thể, việc Reactor là 1
con đường OO để thực hiện nonblocking I/O, và Proactor là phương pháp
OO để làm I/O bất đồng bộ.
• ASIO: I/O framework C++, là 1 thành phần của thư viện Boost. Nó tương
tự bản cập nhật ACE trong thời đại STL.
• libevent, framework gọn nhẹ, viết bằng C, của Niels Provos. Hỗ trợ Kqueue
và select, và hỗ trợ poll và epoll.
Những người phát triển thì nỗ lực với các nền tảng gọn nhẹ nhất:
25


×