Phân tích và thiӃt kӃ chӭc chӫ cӱa hàng quҧn lý viӋFÿһt hàng cӫa khách hàng 30 II.2.4.. Giӟi thiӋ u Blocking và Non-Blocking Blocking Theo cách truyӅn thӕng thread-EDVHG WKuKm\WѭӣQJWѭӧn
Trang 1.+2$7,1+Ӑ&
-
/8Ұ19Ă17Ӕ71*+,ӊ3&Ӱ1+Æ1 1*¬1+&Ð1*1*+ӊ7+Ð1*7,1
Trang 20ӝWOҫQQӳDem xin FKkQWKjQKFҧPѫQ
Ĉj1ҹQJQJj\WKiQJQăP
6LQKYLrQWKӵFKLӋQ
&KX7Kӏ7KDQK9kQ
Trang 4LӠI CҦ0Ѫ1 2
LӠ,&$0Ĉ2$1 3
LÝ DO CHӐ1Ĉ ӄ TÀI 1
1 Bӕi cҧQKÿӅ tài: 1
2 MөFÿtFKÿӅ tài 2
&+ѬѪ1*, &Ѫ6 Ӣ LÝ THUYӂT 3
I.1 GIӞI THIӊU NODE.JS 3
I.1.1 Javascript và lұp trình Server 3
I.1.2 Node.JS là gì 3
I.1.3 Giӟi thiӋu Blocking và Non-Blocking 4
I.1.4 Socket.io 7
I.1.5 10 lý do nên sӱ dөng Node JS: 8
I.2 GIӞI THIӊU Vӄ &Ѫ6Ӣ DӲ LIӊU NoSQL 10
I.2.1 Giӟi thiӋu NoSQL 10
I.2.2 ;iFÿӏnh NoSQL có phù hӧp 12
I.2.3 Tìm hiӇu vӅ CouchDB 13
&+ѬѪ1*,, PHÂN TÍCH VÀ THIӂT Kӂ Hӊ THӔNG 18
II.1 PHÂN TÍCH YÊU CҪU 18
II.1.1 Mô tҧ bài toán quҧn lý cӱa hàng bán thӭFăQQKDQKWUӵc tuyӃn 18
II.1.2 Phân tích yêu cҫu bài toán 18
II.1.3 ;iFÿӏnh các chӭFQăQJFKtQKFӫa hӋ thӕng 19
II.2 PHÂN TÍCH VÀ THIӂT Kӂ Hӊ THӔNG : 21
Trang 5II.2.2 BiӇXÿӗ UseCase sӱ dөng 21
II.2.1 Phân tích và thiӃt kӃ chӭFQăQJÿăQJNê 26
II.2.2 Phân tích và thiӃt kӃ chӭFQăQJÿăQJQKұp 28
II.2.3 Phân tích và thiӃt kӃ chӭc chӫ cӱa hàng quҧn lý viӋFÿһt hàng cӫa khách
hàng 30
II.2.4 Phân tích và thiӃt kӃ chӭFQăQJFKӫ cӱDKjQJ[HPÿѭӧc danh sách tҩt cҧ
FiFPyQăQWҩt cҧ các nhân viên, tҩt cҧ các khách hàng 31
II.2.5 Phân tích và thiӃt kӃ chӭFQăQJFKӫ cӱDKjQJWKrPPyQăQWKrPQKkQ
II.3 Phân tích và thiӃt kӃ FѫVӣ dӳ liӋu 44
II.3.1 ThiӃt kӃ các doc 44
II.3.2 ThiӃt kӃ các View :(hiên thӏ các thông tin cҫn thiӃt lҩy tӯ các doc) 46
&+ѬѪ1*,,, TRIӆ1.+$,&+ѬѪ1*75Î1+ « 49
III.1 CÁC CÔNG CӨ SӰ DӨNG 49
Trang 6III.3 KӺ THUҰT VÀ CÔNG NGHӊ SӰ DӨNG 49
III.4 &¬,ĈҺ70Ð,75ѬӠNG 49
III.4.1 &jLÿһt node.js 49
III.4.2 &jLÿһt couchdb 49
III.5 DEMO 50
KӂT LUҰN 58
Trang 7DANH MӨC HÌNH VӀ
Hình 1: Mô tҧ blocking 5
Hình 2 : Mô tҧ non-blocking 6
Hình 3 : Mô tҧ event loop 6
Hình 4 : UseCase tәng quát 22
+uQK8VH&DVHĈăQJNêÿăQJQKұp 22
Hình 6 : UseCase Quҧn lý danh sách thӵFÿѫQ 23
Hình 7: UseCase chӫ cӱa hàng quҧn lý danh sách nhân viên 24
Hình 8 : UseCase chӫ cӱa hàng quҧn lý danh sách khách hàng 24
Hình 9 : UseCase chӫ cӱa hàng quҧQOêÿһt hàng 24
Hình 10 : UseCase khách hàng xem lӏch sӱ ÿһt hàng 25
Hình 11 : UseCase khách hàng xem danh sách thӵFÿѫQ 25
+uQK8VH&DVHNKiFKKjQJÿһt hàng 25
Hình 13 : BiӇXÿӗ hoҥWÿӝQJÿăQJNê 27
Hình 14 : BiӇXÿӗ tuҫn tӵ - ĈăQJNt 27
Hình 15: BiӇXÿӗ hoҥWÿӝng - ĈăQJQKұp 29
Hình 16: BiӇXÿӗ tuҫn tӵ - ĈăQJQKұp 29
Hình 17 : BiӇXÿӗ hoҥWÿӝng quҧQOêÿһt hàng 30
Hình 18 : BiӇXÿӗ tuҫn tӵ chӫ cӱa hàng quҧQOêÿһt hàng 31
Hình 19: BiӇXÿӗ hoҥWÿӝng ± danh sách thӵFÿѫQ 32
Hình 20 : BiӇXÿӗ hoҥWÿӝQJÿăQJQKұp 32
Hình 21: BiӇXÿӗ hoҥWÿӝng ± 7KrPPyQăQ 33
Hình 22 : BiӇXÿӗ tuҫn tӵ chӫ cӱa hàQJWKrPPyQăQ 34
Trang 8Hình 23: BiӇXÿӗ hoҥWÿӝng chӫ cӱa hàng chӍnh sӱDWK{QJWLQPyQăQ 35
Hình 24 : BiӇXÿӗ tuҫn chӫ cӱa hàng chӍnh sӱDWK{QJWLQPyQăQ 36
Hình 25: BiӇXÿӗ hoҥWÿӝng chӫ cӱa hàng quҧn lý thӵFÿѫQ 38
Hình 26 : BiӇXÿӗ tuҫn tӵ chӫ cӱDKjQJ[yDPyQăQ 38
Hình 27 : BiӇXÿӗ tuҫn tӵ tìm kiӃPPyQăQ 40
Hình 28 : BiӇXÿӗ hoҥWÿӝng khách hàng xem danh sách thӵFÿѫQ 41
Hình 29 : BiӇXÿӗ tuҫn tӵ khách hàng xem danh sách thӵFÿѫQ 42
Hình 30 : BiӇXÿӗ hoҥWÿӝQJNKiFKKjQJÿһt hàng 43
Hình 31: BiӇXÿӗ tuҫn tӵ NKiFKKjQJÿһt hàng 43
Hình 327UDQJÿăQJQKұp 50
Hình 337UDQJÿăQJNêWjLNKRҧn mӟi 53
Trang 9DANH MӨC BҦNG BIӆU
Bҧng 1 : Bҧng các chӭFQăQJÿăQJNêÿăQJQKұp 19
Bҧng 2 : Bҧng các chӭFQăQJFKӫ cӱa hàng quҧn lý viӋFÿһt hàng cӫa khách hàng 19 Bҧng 3 : Bҧng chӭFQăQJFKӫ cӱa hàng quҧn lý danh sách thӵFÿѫQPyQăQ 20
Bҧng 4 : Bҧng chӭFQăQJFKӫ cӱa hàng quҧn lý danh sách nhân viên 20
Bҧng 5 : Bҧng chӭFQăQJFKӫ cӱa hàng quҧn lý danh sách khách hàng 20
Bҧng 6 : Bҧng chӭFQăQJNKiFKKjQJ[HPGDQKViFKWKӵFÿѫQPyQăQ 21
Bҧng 7 : Bҧng chӭFQăQJNKiFKKjQJWKӵc hiên viӋFÿһt hàng 21
Bҧng 8 : Doc Users 44
Bҧng 9 : Doc thӵFÿѫQ 45
Bҧng 10 : Doc nhân viên 45
Bҧng 11 : Doc nhân viên 46
Trang 10WUѭӡQJKӧSQj\1yVӁJLҧPVӕOXӗQJKRҥWÿӝQJFӫDPi\FKӫ[XӕQJJLҧPWKӡLJLDQ WUӉ
Trang 112 MөFÿtFKÿ Ӆ tài
/XұQYăQWӕWQJKLӋSWUrQêWѭӣ QJÿӅWjLYӟLEDPөFÿtFKFKtQK :
x Tìm hiӇu vӅ Node.JS
x Tìm hiӇu vӅ FѫVӣ dӳ liӋu phi quan hӋ NoSQL, couchDB
x Xây dӵng ӭng dөng bán thӭFăQnhanh
Trang 12&+ѬѪ1*, &Ѫ6 Ӣ LÝ THUYӂT
I.1 GIӞI THIӊU NODE.JS
I.1.1 Javascript và lұ p trình Server
Mһc dù các ӭng dөng trên nӅn web trӣ nên phә biӃn trong nhӳng năm gҫn ÿây, nhѭng chúng vүn rҩt khó ÿӇ phát triӇn, duy trì và mӣ rӝng NhiӅu thách thӭc ӣ ÿây là viӋc QJăQ cách giӳa các thành phҫn client và server Các thành phҫn phía client thѭӡng ÿѭӧc sӱ dөng bao gӗm HTML, CSS, Javascript, Ajax (mӝt phҫn cӫa javascript), ҧnh
và các file mà ta có thӇ tҧi vӅ tӯ trình duyӋt Phía server, thì ta cҫn lҳng nghe tӯ các yêu
cҫu, xuҩt ra tài nguyên hoһc thông tin và thao tác vӟi chúng ÿӇ chúng có thӇ gӱi trҧ
vӅ phía client Mӛi mӝt công nghӋ mang lҥi mӝt trҧi nghiӋm khác nhau Các ngôn ngӳ phía server ÿѭӧc dùng phә biӃn ÿӃn bây giӡ là PHP, java và NET
ĈLӅu này dүn ÿӃn viӋc cҫn có mӝt chuҭn ÿӇ thӕng nhҩt lұp trình giӳa server
và client Hӑ xây dӵng server dӵa theo Javascript có thӇ làm web server và nhiӅu KѫQthӃ nӳa
Chúng ta sӁ tұp trung vào mӝt Javascript-server-side khác: Nodejs
I.1.2 Node.JS là gì
Node.js là 1 nӅn tҧng (platform) chҥ\WUrQP{LWUѭӡng V8 Javascript runtime Node.js cho phép lұp trình viên xây dӵng các ӭng dөng có tính mӣ rӝng cao sӱ dөng -DYDVFULSWWUrQVHUYHU9jYuÿѭӧc porting tӯ C nên vӅ mһt tӕFÿӝ xӱ lý thì khá nhanh Nodejs, sӱ dөng mӝt sӵ kiӋn lһp thay cho các luӗng, và nó có thӇ mӣ rӝng lên hàng triӋu kӃt nӕi mӝt lúc
Mӛi mӝt xӱ lý vào ra trong Nodejs là không ÿӗng bӝ, QJKƭD là máy chӫ có thӇtiӃp tөc xӱ lý các request ÿӃn trong khi các xӱ lý vào ra ÿDQJ diӉn ra Javascript mà
mӝt ngôn ngӳ phù hӧp cho viӋc lұp trình hѭӟng sӵ kiӋn bӣi vì nó có các hàm không ÿӗng bӝ và sӵ bao ÿóng cái mà tҥo ra mӝt hàm callbacks ÿҧm bҧo Và lұp trình viên Javascript thì ÿmELӃt cách lұp trình theo cách này rӗi Mô hình hѭӟng sӵ kiӋn khiӃn cho Nodejs chҥy rҩt nhanh và có thӇ triӇn khai và mӣ rӝng cho các ӭng dөng
Trang 13thӡi gian thӵc mӝt cách dӉ dàng
Mӝt lӧi ích lӟn lao cӫa NodeJS ÿy là nó ÿѭӧc viӃt bҵng javascript Nó FNJQJ hӛ
trӧ các hӋ NoSQL dùng javascript ÿӇ truy vҩn Tӯ ÿây ta chӍ cҫn hӑc mӝt ngôn ngӳ
là javascript ÿӇ thӵc thi tӯ phía trình duyӋt, phía webserver và cҧ cho database server
I.1.3 Giӟi thiӋ u Blocking và Non-Blocking
Blocking Theo cách truyӅn thӕng (thread-EDVHG WKuKm\WѭӣQJWѭӧng mӝWQJkQKjQJÿDQJ
áp dөng mô hình phөc vө: Phөc vө hoàn toàn mӝt yêu cҫu rӗi mӟi chuyӇn sang
yêu cҫXNKiF7URQJÿyQKkQYLrQWURQJQJkQKjQJ7ѭѫQJӭng mӛi nhân viên là mӝt Thread Và mӛi mӝt yêu cҫXWѭѫQJӭQJOjUHTXHVWÿӃn server Bҥn yêu cҫu là muӕn
gӱi tiӅn vào ngân hàng Bҥn sӁ phҧLÿLӅn 1 sӕ IRUPQKѭWrQQJѭӡi gӱi, sӕ tài khoҧn cӫa
hӑ, sӕ tiӅn cҫn gӱi.v v Trong thӡi gian bҥQÿLӅn thông tin cҫn rút tiӅn vào tӡ khai Cô
nhân viên phҧi chӡ bҥn BҥQÿmNKyDF{ҩy không cho cô ҩy phөc vө các khách hàng
NKiFYuO~FÿyF{ҩ\ÿDQJUҧnh vì phҧLÿӧi bҥQ+jQKÿӝng ÿӧi ӣ ÿk\SKҫn lӟn là hành
ÿӝng vào/ra, truy suҩt file, hoһFÿӧi kӃt quҧ truy vҩQ64/WURQJ:HEVHUYLFHĈyOjFѫchӃ Blocking Theo cách này NӃXQJkQKjQJÿDQJTXiWҧi vì có quá nhiӅXQJѭӡi chӡ
ÿѭӧc phөc vө Thì ngân hàng chӍ còn mӝt cách duy nhҩWOj7ăQg thêm sӕ nhân viên
phөc vө lên Ӣ WUѭӡng hӧp này trong ví dө FK~QJWDOjWăQJVӕ server phөc vө lên
VҩQÿӅ xҧy ra ӣ ÿk\UD.KLWăQJVӕ OѭӧQJQKkQYLrQOrQÿӇ ÿiSӭng nhu cҫu phөc
vө khách hàng thì ngân hàng phҧLWăQJFKLSKtWLӅQÿӇ trҧ lѭѫQJPһt bҵQJYăQ
SKzQJ WѭѫQJӭng vӟi viӋFWăQJSKҫn cӭng máy chӫ OrQÿӇ ÿiSӭQJ 1KѭWKӃ sӁ gây
ra các vҩQÿӅ vӅ lãng phí Và không tұn dөQJÿѭӧc nguӗn lӵc và tiӃt kiӋPÿѭӧc chi phí
Trang 14I.1.3.2 Non-Blocking
Ӣ mӝt ngân hàng khác, hӑ lҥi áp dөng theo mӝWSKѭѫQJWKӭc mӟi
(eventdriven): Tұn dөng mӑi khҧ QăQJFӫa tҩt cҧ các nhân viên khi hӑ rҧnh và nhân viên
khi có yêu cҫu mӟi phөc vө.Tӭc là khi bҥn có mӝt yêu cҫu muӕn gӱi tiӅQQKѭӣ trên
Cô nhân viên chӍ cҫn ÿѭDEҥn bút và giҩ\ÿӇ bҥQÿLӅn vào và bҧo bҥn hãy ngӗi ӣ ghӃ
chӡ ÿӇ ÿLӅn xong thông tin gӱi tiӅQ7URQJNKLÿyF{ҩy có thӇ phөc vө nhӳng vӏ khách
tiӃp theo Ӣ ÿk\EҥQÿmNK{QJNKyDF{ҩy lҥi Và cô nhân viên tranh thӫ O~Fÿӧi bҥn
ÿLӅn các thông tin Cô ҩy có thӇ làm viӋc khác Thành ra ӣ ÿk\NK{QJFyKjQKÿӝQJÿӧi
Y{QJKƭDӣ ÿk\.KLEҥQÿLӅn xong thông tin, bҥn có thӇ trӣ lҥi gһp cô ҩ\EiROjÿmKRjQ
thành Cô ҩy sӁ tiӃp tөc phөc vө bҥQÿӇ bҥn hoàn thành viӋc cӫDPuQKĈk\OjFѫFKӃ
Non-Blocking
Bҥn có thӇ thҩy, theo mô hình áp dөng cӫa ngân hàng này (event-driven), hӑ sӁ
tұn dөQJÿѭӧc khoҧng thӡi gian rӛi cӫa nhân viên KhiӃn cho viӋc mӝt nhân viên có thӇ
phөc vө nhiӅXNKiFKKjQJKѫQVRYӟLQJkQKjQJGQJP{KuQKWKHRFiFKFNJӣ trên NӃu
có quá tҧi Bҥn chҳc chҳn vүn phҧLWKrPQKkQYLrQÿӇ ÿiSӭng kӏp thӡi 1KѭQJ
Trang 15chҳc chҳn sӁ WKrPtWQKkQYLrQKѫQ7LӃt kiӋPÿѭӧc rҩt nhiӅXWjLQJX\rQĈk\FNJQJOjP{KuQKÿѭӧc áp dөng phә biӃn ӣ các ngân hàng)
+uQK0{WҧQRQ -blocking
I.1.3.3 KiӃn trúc event loop:
Event loop
x Cho phép tiӃp tөc nhұQUHTXHVWNKiFNKLÿmQKұn 1 request, cho phép sӱ lý
ÿDOXӗng, mӛi luӗng thӵc hiӋn 1 task cӫa request
x Trҧ lҥi callback cӫDUHTXHVWWѭѫQJӭng
+uQK0{WҧHYHQWORRS
Trang 16I.1.4 Socket.io
*LӟLWKLӋX6RFNHWLR6RFNHW,2OjPӝWWKѭYLӋQMDYDVFULSWFyPөFÿtFKWҥRUDFiFӭQJGөQJUHDOWLPHWUrQWUuQKGX\ӋWFNJQJQKѭWKLӃWEӏGLÿӝQJ9LӋFVӱGөQJWKѭYLӋQQj\FNJQJUҩWÿѫQJLҧQYjJLӕQJQKDXӣFҧVHUYHUOүQFOLHQW
&iFKVӱGөQJVRFNHWLRĈӇLPSRUWWKѭYLӋQQj\ PӣFӱDVәFRQVROHYjFjLÿһW6RFNHWLREҵQJOӋQKVDX
Socket.IO cung cҩp 3 event chính là connect, message và disconnect Chúng
ÿѭӧc kích hoҥt khi client/server kӃt nӕi
ĈӇ gӱi dӳ liӋu, ta dùng lӋnh send() Dӳ liӋu có thӇ Ojÿӕi Wѭӧng và sӁ nhұn
ÿѭӧc qua sӵ kiӋn message
Ví dө: socket.send("Hello world");
Trang 17Socket.IO có thӇ gӱi và nhұn các event tӵ tҥo vӟLSKѭѫQJWKӭc emit() Hai phía
gӱi và nhұn phҧi biӃWÿѭӧc tên cӫDHYHQWÿyÿӇ thӵc hiӋn giao tiӃp:
-DYDVFULSWÿѭӧc tҥRUDOjÿӇ làm ngôn ngӳ lұp trình cho client web
Tҩt cҧ các web deYHORSHUÿӅu biӃW-6GRÿyYLӋc cҧ phía client và phía server
ÿӅu sӱ dөQJ-6FNJQJPDQJQKLӅXêQJKƭD
+ѫQQӳa, viӋc cҧ hai phía C/S cùng sӱ dөng mӝt ngôn ngӳ FKXQJÿHPWӟi khҧ
QăQJKҩp dүn là cҧ hai phía có thӇ sӱ dөng chung mӝWÿRҥn code, mӝt module, làm
giҧm thӡi gian phát triӇn, ít lӛLKѫQYjWKӡi gian kiӇm thӱIL[EXJFNJQJQJҳQKѫQ
2 Khҧ QăQJP ӣ rӝng
ViӋc thiӃt kӃ mӝt ӭng dөng có khҧ QăQJPӣ rӝng là mӝt thách thӭc lӟn TӕFÿӝ
xây dӵng và mӣ rӝng mӝt ӭng dөng Node.JS gây ҩQWѭӧng mҥnh
Mӝt trong nhӳng bí mұWÿӇ Node.JS có thӇ có ÿyOjHYHQW-loop KiӃn trúc này
cӫa Node.JS khiӃQQyÿiSӭng các yêu cҫu tӯ client hoàn toàn khác so vӟi các công
Trang 18Công nghӋ web phát triӇn tӟi chóng mһt, và ӭng dөng web thӡi gian thӵFÿDQJ
nhen nhóm phát triӇn Các công nghӋ QKѭ :HE6RFNHWÿmVҹn sàng cho viӋc hàng
triӋXQJѭӡi dùng có thӇ tұQKѭӣng viӋFWѭѫQJWiFZHEJҫQQKѭKRjQWRjQNK{QJFy
ÿӝ trӉ
1RGH-6FNJQJKѭӟng tӟi viӋc xӱ lý sӕ Oѭӧng kӃt nӕLÿӗng thӡi khәng lӗ QKѭNӇ
WUrQ'RÿyEҵng viӋc sӱ dөng Node.JS bҥQFNJQJÿDQJOjPFKRF{QJty mình bҳWÿҫu
sӱ dөng nhӳng thӃ mҥnh trên ngay bây giӡ
4 HiӋ XQăQJ
Node.JS sӱ dөng engine V8 cӫa Google - mӝt thӭ nhanh mӝWFiFKÿLrQUӗ và
QJj\FjQJÿѭӧc cҧi thiӋn Cùng vӟi mô hình non-blocking IO, viӋc tҥo ra mӝt ӭng
dөng web chұm chҥp bҵng Node.JS OjÿLӅu không thӇ
Mӛi ӭng dөng viӃt trên Node.JS có thӇ ÿiSӭng hàng ngàn kӃt nӕLÿӗng thӡi ngay
cҧ khi sӱ dөng nhӳng phҫn cӭQJWK{QJWKѭӡng
5 Tұ n dөng tӕ LÿDNK ҧ QăQJF ӫa phҫn cӭng
Bӝ nhӟ là mӝWFiLJuÿyÿҳWÿӓ khi bҥn cҫn host mӝt ӭng dөng Vӟi khҧ năQJFӫa
mình Node.JS cho phép bҥn tӕLѭXKyDYLӋc sӱ dөng hҥ tҫng hiӋn tҥi, hoһc là host
ӭng dөng trên nhӳng máy ҧo rҿ tiӅQKѫQ
6 Cӝ QJÿ ӗQJÿ{QJÿ ҧRYjQăQJÿ ӝng
CӝQJÿӗng Node.JS phát triӇn vӟi tӕFÿӝ ÿLrQUӗWKXK~Wÿѭӧc nhӳng developer
thông minh nhҩWWKDPJLDĈLӅXQj\FyQJKƭDOjKӋ sinh thái Node phát triӇn mau lҽ
tӯng ngày, nên chúng ta có thӇ Fy ÿѭӧc nhӳng hӛ trӧ miӉQSKtYjWKѭѫQJPҥi tӯ
nhiӅu nguӗn khác nhau
7 Tìm kiӃ m developer
NӃu bҥn là doanh nghiӋSYjÿDQJWuPNLӃm developer cho viӋc phát triӇn mӝt
ӭng dөng trên Node.JS thì rҩt dӉ dàng, chӍ cҫn tìm mӝt developer biӃW-6Ojÿѭӧc
/jPFKRÿ ӝi phát triӇ n cӫa bҥ n hҥ nh phúc
Trang 19Do có cӝQJ ÿӗQJ ÿ{QJ ÿҧo, nên viӋF WuP ÿѭӧc nhӳng module, package
opensource phù hӧp vӟi sҧn phҭm cӫa bҥQFNJQJNK{QJSKҧLOjNKyÿLӅu này làm
giҧm công sӭc phát triӇQWăQJÿӝ hài lòng cӫDÿӝi phát triӇn
MӝWÿӝi phát triӇn hҥnh phúc là mӝWÿӝi phát triӇn hӳu hiӋu
9 Thӡi gian phát triӇ n ngҳ n và hiӋ u suҩ WWKXÿѭ ӧFFDRKѫQ
Vӟi nhӳQJÿһFÿLӇm cӫa mình: ngôn ngӳ ÿӗng nhҩt, cӝQJÿӗQJQăQJÿӝng, dӉ
dàng tìm trӧ giúp, tính sӱ dөng lҥi cao, mӝt ӭng dөQJÿѭӧc phát triӇn trên Node.JS
sӁ có thӡi gian sҧn xuҩt ngҳQKѫQQKLӅXWăQJFѫKӝi sӟm xuҩt hiӋn và chiӃPOƭQKWKӏ
WUѭӡng
10 NhiӅ u lӵa chӑ n hosting cho doanh nghiӋ p
Rҩt nhiӅu nhà cung cҩp dӏch vө ÿiP Pk\ ÿm ÿDQJ Yj VӁ hӛ trӧ Node.JS, doanh
nghiӋp có thӇ thoҧi mái lӵa chӑn nhà cung cҩp phù hӧp vӟi mong muӕn cӫa mình
I.2 GIӞI THIӊU Vӄ &Ѫ6 Ӣ DӲ LIӊU NoSQL
I.2.1 Giӟi thiӋ u NoSQL
Giӟi thiӋu NoSQL, viӃt tҳt cӫa non-relational, hoһc theo cách hiӇXNKiFWKuFyQJKƭDOj1RWonly SQL (không chӍ Oj64/ 1R64/ÿһc biӋt nhҩn mҥQKÿӃQP{KuQKOѭXWUӳ cһp giá
trӏ khóa và hӋ thӕQJOѭXWUӳ phân tán HӋ CSDL này có thӇ OѭXWUӳ, xӱ lý tӯ Oѭӧng rҩt
nhӓ ÿӃn hàng petabytes dӳ liӋu vӟi khҧ QăQJFKӏu tҧi, chӏu lӛLFDRQKѭQJFKӍ ÿzLKӓi vӅ
tài nguyên phҫn cӭng thҩp NoSQL thiӃt kӃ ÿѫQJLҧn, nhҽ, gӑQKѫQVRYӟi RDBMs,
thiӃt kӃ ÿһc biӋt tӕLѭXYӅ hiӋu suҩt, tác vө ÿӑc-JKLtWÿzL hӓi vӅ phҫn cӭng mҥnh và
ÿӗng nhҩt, dӉ dàng thêm bӟt các node không ҧQKKѭӣng tӟi toàn hӋ thӕng,
So sánh NoSQL và RDBMS Các RDBMS hiӋn tҥLÿmEӝc lӝ nhӳng yӃXNpPQKѭYLӋFÿiQKFKӍ mөc mӝWOѭӧng
lӟn dӳ liӋu, phân trang, hoһc phân phӕi luӗng dӳ liӋu media (phim, ҧnh, nhҥF &ѫ
sӣ dӳ liӋu quan hӋ ÿѭӧc thiӃt kӃ cho nhӳng mô hình dӳ liӋu nhӓ WKѭӡQJ[X\rQÿӑc viӃt
Trang 20trong khi các Social Network Services lҥi có mӝWOѭӧng dӳ liӋu cӵc lӟn và cұp nhұt liên
tөc do sӕ OѭӧQJQJѭӡi dùng quá nhiӅu ӣ mӝt thӡLÿLӇm ThiӃt kӃ trên Distributed NoSQL
giҧm thiӇu tӕLÿDFiF phép tính toán, I/O liên quan kӃt hӧp vӟLEDWFKSURFHVVLQJÿӫ ÿҧm
bҧRÿѭӧc yêu cҫu xӱ lý dӳ liӋu cӫa các mҥng dӏch vө dӳ liӋu cӝQJÿӗng này
VӅ FѫEҧn, các thiӃt kӃ cӫa NoSQL lӵa chӑQP{KuQKOѭXWUӳ tұp dӳ liӋu theo cһp
giá trӏ key-value Khái niӋPQRGHÿѭӧc sӱ dөng trong quҧn lý dӳ liӋu phân tán.Vӟi các
hӋ thӕng phân tán, viӋFOѭXWUӳ có chҩp nhұn trùng lһp dӳ liӋu Mӝt request truy vҩn tӟi
data có thӇ gӱi tӟi nhiӅu máy cùng lúc, khi mӝt máy nào nó bӏ chӃWFNJQJNK{QJ
ҧQKKѭӣng nhiӅu tӟi toàn bӝ hӋ thӕQJĈӇ ÿҧm bҧo tính realtime trong các hӋ thӕng xӱ
OêOѭӧng lӟQWK{QJWKѭӡQJQJѭӡi ta sӁ tách biӋt database ra làm 2 hoһc nhiӅu database
Mӝt database nhӓ ÿҧm bҧo vào ra liên tөFNKLÿҥt tӟLQJѭӥng thӡi gian hoһFGXQJOѭӧng,
database nhӓ sӁ ÿѭӧc gӝp (merge) vào database lӟn có thiӃt kӃ tӕLѭXFKRSKpSÿӑc (read operation) Mô KuQKÿyFKRSKpSWăQJFѭӡng hiӋu suҩt I/O - mӝt trong nhӳng
nguyên nhân chính khiӃn performance trӣ nên kém
7tQKQăQJ &ѫVӣ dӳ liӋu quan hӋ &ѫVӣ dӳ liӋu NoSQL
tӕLѭXYӅ ÿӑc ghi dӳ liӋu Phҫn cӭng ĈzLKӓi cao vӅ phҫn cӭng ĈzLKӓi thҩSKѫQYӅ giá trӏ
YjWtQKÿӗng nhҩt cӫa phҫn
cӭng
Trang 21ĈăFÿLӇm NoSQL
x Phi quan hӋ (hay không ràng buӝc): Các mӕi quan hӋ giӳa các bҧQJWURQJFѫVӣ
dӳ liӋu quan hӋ (RDBM) sӱ dөng mô hình gӗm 2 loҥi khóa: khóa chính và khóa
phө SULPDU\NH\IRUHLJQNH\ ÿӇ ràng buӝc dӳ liӋu nhҵm thӇ hiӋn tính nhҩt
quán dӳ liӋu tӯ các bҧng khác nhau Non-relational là khái niӋm không sӱ dөng
các ràng buӝc dӳ liӋu cho nhҩt quán dӳ liӋu
x /ѭXWUӳ SKkQWiQP{KuQKOѭXWUӳ phân tán các tұp tin hoһc dӳ liӋu ra nhiӅu máy
khác nhau trong mҥng LAN hoһF,QWHUQHWGѭӟi sӵ kiӇm soát cӫa phҫn mӅm
x Nhҩt quán cuӕi: tính nhҩt quán cӫa dӳ liӋu không cҫn phҧLÿҧm bҧo ngay tӭc
khҳc sau mӛi phép ghi Mӝt hӋ thӕng phân tán chҩp nhұn nhӳng ҧQKKѭӣng theo
SKѭѫQJWKӭc lan truyӅn và sau mӝt khoҧng thӡi gian (không phҧi ngay tӭc khҳc),
WKD\ÿәi sӁ ÿLÿӃn mӑLÿLӇm trong hӋ thӕQJÿӇ cuӕi cùng dӳ liӋu trên hӋ thӕng sӁ
trӣ lҥi trҥng thái nhҩt quán
x TriӇQNKDLÿѫQJLҧn, dӉ nâng cҩp và mӣ rӝng
x Mô hình dӳ liӋu và truy vҩn linh hoҥW«
I.2.2 ;iFÿ ӏ nh NoSQL có phù hӧp
Khi làm viӋc vӟi mӝWOѭӧng lӟn dӳ liӋu, bҥQKm\QJKƭÿӃn NoSQL NoSQL rҩt
thích hӧSÿӇ làm viӋc vӟi dӳ liӋu lӟn bҵng cách loҥi bӓ các ràng buӝc toàn vҽn dӳ liӋu,
cách thiӃt kӃ mô hình phi chuҭn hoá, cách sӱ dөQJLQGH[«ĈmJL~S1R64/WUӣ nên
mҥnh mӁ ÿӇ làm viӋc vӟLOѭӧng lӟn dӳ liӋu Tuy nhiên, có mӝt sӕ tính chҩWVDXÿk\Fҫn
OѭXêNKLOӵa chӑQFѫVӣ dӳ liӋu NoSQL
Tính nhҩt quán cuӕi (Eventual consistency) cҫn phҧLÿѭӧc ӭng dөng chҩp nhұn
&yQJKƭDOjӭng dөng không yêu cҫu ràng buӝc dӳ liӋu, không yêu cҫu dӳ liӋu phҧi cұp
nhұp chính xác ngay tӭc thì Mӝt sӕ ӭng dөng phù hӧSQKѭFiFWUDQJPҥng xã hӝi, các
ӭng dөng ghi log tӵ ÿӝQJ«&iFӭng dөng loҥi này chҩp nhұp dӳ liӋXFNJWURQJPӝt
khoҧng thӡi gian ngҳQWUѭӟFNKLÿѭӧc cұp nhұp mӟLĈәi lҥi chúng WDÿҥWÿѭӧc nhӳng
tiêu chuҭn cao vӅ khҧ QăQJPӣ rӝng và hiӋu quҧ vӅ chi phí, trong khi phөc vө liên tөc
hàng triӋu khách hàng tӯ khҳSQѫLWUrQWUiLÿҩWĈһt biӋt FK~QJWDÿҥWÿѭӧc mӝt hiӋu suҩt
hoҥWÿӝQJFDRKѫQJҩp nhiӅu lҫn nhӡ vào viӋc loҥi bӓ các yêu cҫu nhҩt quán dӳ liӋu
Trang 22Các ӭng dөng không phù hӧp vӟLFѫVӣ dӳ liӋu NoSQL là các ӭng dөng yêu cҫu
tính nhҩt quán dӳ liӋu cao Tính nhҩt quán dӳ liӋXÿѭӧF[HPQKѭWtQKVӕng còn cӫa ӭng
dөng Ví dө QKѭFiFӭng dөng tài chính, ngân hàQJ«Yӟi các con sӕ OX{Qÿѭӧc cұp
nhұp và cҫQÿѭӧc cұp nhұp tӭc thì Sӵ chұm trӉ có thӇ phҧi trҧ giá rҩWÿҳt Bӣi thӃ nӃu
các ӭng dөng cӫa bҥn thuӝc loҥi này thì hãy lӵa chӑQFѫVӣ dӳ liӋu RDBMS vӟi mô
hình quan hӋ truyӅn thӕng
Các yêu cҫu phân tích hiӋQÿҥL%, FNJQJNK{QJSKKӧp vӟLFѫVӣ dӳ liӋu NoSQL
này Bӣi vì NoSQL hә trӧ rҩt ít các câu truy vҩn Tҩt cҧ ÿӅu phө thuӝc vào sӵ tinh thông
lұSWUuQK1KѭYұy, vӟi mӝt yêu cҫXSKkQWtFKÿѫQJLҧQWKuFNJQJFҫQÿӃn lұp trình trong
ÿy7URQJNKLvӟLFѫVӣ dӳ liӋu RDBMS sӱ dөng ngôn ngӳ 64/ÿӇ truy vҩn, SQL giúp
chúng ta rҩt nhiӅu viӋc trong truy vҩn, phân tích
I.2.3 Tìm hiӇ u vӅ CouchDB
Giͣ i thi͏ u CouchDB
CouchDB là mӝt hӋ quҧn trӏ FѫVӣ dӳ liӋX1R64/OѭXWUӳ WKHRKѭӟng
YăQEҧn, nguӗn mӣ, có khҧ QăQJNKҧ chuyӇn cao trong viӋFWѭѫQJWiFGӳ liӋu giӳa các
Q~WĈLӅu này khiӃn cho nó rҩt thích hӧSWURQJFiFWUѭӡng hӧSOLrQTXDQÿӃn viӋc thӕng
nhҩt và bӅn vӳng dӳ liӋu.ViӋc tích hӧp các bҧn sao (ӣ ÿk\OjFiFYLHZ OjPFKRQyOj
nӅn tҧQJOêWѭӣng cho viӋFÿӗng bӝ hóa dӳ liӋu giӳDÿLӋn thoҥLGLÿӝng, máy tính và
máy chӫ Couchdb không có mô hình cӕ ÿӏQK7KD\YjRÿyQyOѭXWUӳ các bҧn ghi (hay
YăQEҧQ WKHRÿӏnh dҥng JSON, khá nhҽ và dӉ hiӇu cҩu trúc dӳ liӋu, rҩt thích hӧp cho
viӋFOѭXWUӳ dӳ liӋu
CiFÿһFÿLӇm cӫa CouchDB
Trang 23_id OjÿӏQKGDQKGX\QKҩWFӫDWjLOLӋXĈLӅXQj\FyQJKƭDOjBLGOjEҳWEXӝFYj không
có hai WjLOLӋXFyWKӇFyFQJJLiWUӏ BLG1ӃXEҥQNK{QJ[iFÿӏQKPӝWBLG NKLWҥR PӝW
WjLOLӋX&RXFK'%VӁ WҥR PӝW ,'GX\QKҩW FKREҥQ
_rev OjSKLrQEҧQVӱDÿәLFӫDFiFWjLOLӋX giúp YұQKjQK KӋWKӕQJNLӇPVRiWSKLrQEҧQ
FӫD&RXFK'% 0ӝWWURQJQKӳQJÿLӅX ÿӝF QKҩWYӅKӋWKӕQJVӱDÿәLFӫD&RXFK'%Oj
PӛLOҫQPӝWWjLOLӋXÿѭӧFOѭXJLӳ WjLOLӋXJӕF VӁ không Eӏ JKLÿq
x Design Document
CouchDB không có khái niӋPWDEOHKD\FROOHFWLRQÿӇ cӕ ÿӏnh hay liên kӃt các
tài liӋu vӟi nhau, vì vұy nó trang bӏ cho bҥn mӝt thӭ YNJNKtÿһc biӋt gӑi là tài liӋu thiӃt
kӃ Chúng có các WUѭӡng tiêu chuҭn: _id và _rev, và có thӇ ÿѭӧc tҥRÿӑc, cұp nhұt, và
[yD 1KѭQJ không giӕQJ QKѭ FiF tài liӋu EuQK WKѭӡng, chúng chӭa mã ӭng dөng
trong form cӫa JavaScript và có mӝt cҩu trúc ÿһFWUѭQJ-DYD6FULSWQj\FyWKӇ phân
quyӅn, hiӇn thӏ view vӟi các hàm map/reduce, và nhiӅu thӭ khác
ViӋc xӱ lý truy vҩQ ÿѭӧc thӵc hiӋn qua mӝt thành phҫn trong CouchDB gӑi
là view View gӗm hai thành phҫn: map (ánh xҥ) và reduce (rút gӑn)
Map là mӝt hàm javascript có thӇ phân tích các tài liӋu, rӗi chuyӇQÿәi chúng tӯ cҩu
WU~FEDQÿҫu vào mӝt cһp key-value mӟi
Trang 24x Tính nhҩt quán cuӕi cùng
&RXFK'%ÿҧm bҧo tính nhҩt quán cuӕi cùng: Mӛi tài liӋu tӵ Qyÿmÿҧm bҧRWtQKÿҫ\ÿӫ,
mӛLGRFXPHQWÿӅu có mӝt resivion, mӝt version riêng
&iFWKDRWiFFѫEҧn trên Couch DB
x Tҥo mӝt Database
PUT http://localhost:5984/demo
x Lҩy danh sách tҩt cҧ Database
GET http://localhost:5984/_all_dbs
Trang 27&+ѬѪ1*,, PHÂN TÍCH VÀ THIӂT Kӂ Hӊ THӔNG
II.1 PHÂN TÍCH YÊU CҪU
II.1.1 Mô tҧ bài toán quҧ n lý cӱa hàng bán thӭFăQQKDQKWU ӵc tuyӃ n
Bài toán bán thӭFăQ nhanh trӵc tuyӃn nhҵm phөc vө cho các cӱa hàng bán thӭFăQ
nhanh trӵc tuyӃQÿDQJUҩt phә biӃn hiên nay
Yêu cҫXÿһt ra là viӋFÿһt thӭFăQFӫa khách hàng không bӏ JLiQÿRҥn nӃu có quá
nhiӅXQJѭӡLÿһt hàng, chӫ cӱa hàng phҧLÿѭӧc biӃWÿѭӧc viӋFÿһt hàng cӫa khách mӝt
cách nhanh chóng và phҧi biӃWÿѭӧc vӏ trí cӫa khách hàng, ngoài ra cӱa hàng còn phҧi
quҧQOêÿѭӧFÿӝLQJNJQKkQYLrQWKӵFÿѫQFiFPyQăQ thӡi gian giao hàng
Công nghӋ NodeJS vӟLÿһFÿLӇm sӱ dөng event-drivenvà non-blocking I/O làm
cho nó nhҽ và hiӋu quҧ, thích hӧp cho xӱ lý dӳ liӋu trong ӭng dөng thӡi gian thӵc trên
nhiӅu thiӃt bӏ phân tán sӁ phù hӧp vӟi bài toán này
II.1.2 Phân tích yêu cҫ u bài toán
Yêu cҫu chӭFQăQJ
&yÿӕLWѭӧng sӱ dөng là khách hàng và chӫ cӱa hàng
Yêu cҫXÿӕi vӟi hӋ thӕng dành cho chӫ cӱa hàng:
x QuҧQOêÿѭӧc viӋFÿһt hàng cӫa khách hàng(thӡLJLDQÿӏDÿLӇm) mӝt cách
nhanh chóng, chính xác
x QuҧQOêÿѭӧc danh sách thӵFÿѫQ
x QuҧQOêÿѭӧFÿӝLQJNJQKkQYLrQFӱa hàng
Yêu cҫXÿӕi vӟi hӋ thӕng dành cho khách hàng:
Trang 28Công nghӋ Các công nghӋ sӱ dөQJWURQJFKѭѫQJWUuQK
II.1.3 ;iFÿ ӏ nh các chӭFQăQJFKtQKF ӫa hӋ thӕng
giao hàng
%ҧQJ 2 %ҧQJFiFFKӭFQăQJ FKӫFӱDKjQJ TXҧQOê YLӋFÿһWKjQJFӫDNKiFKKjQJ
&KӫFӱDKjQJTXҧQOêGDQKViFKWKӵFÿѫQFiFPyQăQ
0mFKӭFQăQJ 7rQFKӭFQăQJ
Trang 30viӋc giao hàng,quҧQOêÿѭӧc danh sách thông tin thӵc ÿѫQFiFPyQăQTXҧQOêÿѭӧc
danh sách thông tin nhân viên, quҧQOêÿѭӧc danh sách khách hàng
Khách hàng sӁ ÿѭӧc cung cҩp các dӏch vө cӫa hӋ thӕng nhҵm mөFÿtFK[HPÿѭӧc
danh sách thӵFÿѫQFiFPyQăQÿһWÿѭӧFFiFPyQăQPRQJPXӕn theo thӡi gian giao,
sӕ Oѭӧng và vӏ trí cҫn giao
II.2.2 BiӇ Xÿ ӗ UseCase sӱ dөng
6ѫÿӗ Gѭӟi thӇ hiӋn UseCase tәng quát cӫa hӋ thӕng vӟLWiFQKkQOjQJѭӡi dùng gӗm
KDLÿӕLWѭӧng là khách hàng và chӫ cӱa hàng UseCase này chӍ ӣ mӭc tәng quát (mӭc
0) cӫa hӋ thӕng
Trang 31Hình 4 8VH&DVHWәQJ quát
8VH&DVHPӭFÿăQJNêÿăQJQKұS
Hình 5 8VH&DVHĈăQJNêÿăQJQKұS
... thӭc lӟn TӕFÿӝxây dӵng mӣ rӝng mӝt ӭng dөng Node. JS gây ҩQWѭӧng mҥnh
Mӝt nhӳng bí mұWÿӇ Node. JS có thӇ có ÿyOjHYHQW-loop KiӃn trúc
cӫa Node. JS khiӃQQyÿiSӭng yêu... viӋc truy vҩn, phân tích
I.2.3 Tìm hiӇ u vӅ CouchDB
Giͣ i thi͏ u CouchDB
CouchDB mӝt hӋ quҧn trӏ FѫVӣ dӳ liӋX1R64/OѭXWUӳ WKHRKѭӟng...
Node. JS sӱ dөng engine V8 cӫa Google - mӝt thӭ nhanh mӝWFiFKÿLrQUӗ
QJj\FjQJÿѭӧc cҧi thiӋn Cùng vӟi mô hình non-blocking IO, viӋc tҥo mӝt ӭng
dөng web chұm chҥp bҵng Node. JS