1.2.1. MERN stack
MERN stack là một bộ combo mã nguồn mở các công nghệ liên quan đến Javascript. MERN stack bao gồm 4 công nghê: MongoDB, Express, React và Nodejs. Nó được thiết kế để giúp việc tạo ra các ứng dụng web dễ và nhanh hơn.
1.2.1.1. MongoDB
MongoDB là phần mềm CSDL mã nguồn mở NoSQL hỗ trợ đa nền tảng thiết kế hướng đối tượng. Các collection trong MongoDB (hay còn gọi là các bảng) có thể có cẩu trúc linh hoạt. Ví dụ, trong quan hệ một lớp có nhiều sinh viên, thay vì tạo 2 bảng là lớp và sinh viên rồi gán trường mã lớp là khóa ngoại của bảng mã sinh viên trong MongoDB có thể tạo một bảng lớp với một trường sinh viên là một dãy các đối tượng sinh viên của lớp đó. MongoDB lưu trữ dữ liệu vào collection theo hướng tài liệu kiểu JSON (Javascript Object Notation) với các cặp key - value thay vì bảng tạo hiệu suất và tính khả dụng cao.
Trong khái niệm của MongoDB nhắc đến NoSQL. NoSQL (Non-Relational SQL hay Not only SQL) là dạng cơ sở dữ liệu mã nguồn mở được ra đời như một mô hình tiến hóa hơn về tốc độ, tính năng... khi so sánh với hệ quản trị CSDL hướng quan hệ (hay còn gọi là RDBMS).
Các thuật ngữ cơ bản:
- database: giống với RDBMS. Database hay cơ sở dữ liệu có chứa nhiều collection và được lưu trữ vật lý vào 1 tập tin.
- collection: tập hợp lại các document có cùng tính chất. Nó tương tự các bảng trong RDBMS. Với MongoDB không cần định nghĩa các trường khi tạo một collection.
- document: là một bản ghi trong collection. Một collection có nhiều document. Document là một đối tượng với các cặp khóa - giá trị.
- field: giống như các cột trong RDBMS. Field thể hiện một loại đặc điểm của đối tượng.
Lê Đình Thảo - Lớp K19HTTTB 20
Khóa luận tốt nghiệp Nghiên cứu hệ thống giao dịch chứng khoán trực tuyến và xây dựng mô đun khớp lệnh giao dịch
- cursor: Kết quả của một câu truy vẫn sẽ có 1 con trỏ ở document đầu tiên. Sử dụng nó để đi đến các document khác.
- _id: là trường bắt buộc được coi như khóa chính trong 1 document. Nó được tự thêm vào 1 cách mặc định vào document và là duy nhất
- index: lưu trữ 1 vài field quan trọng trong collection giúp khi truy vấn được nhanh hơn thay vì phải tìm kiếm với cả một collection với nhiều dữ liệu.
Ưu điểm:
- Tính linh hoạt lưu trữ dữ liệu theo các kích cỡ khác nhau, dữ liệu dưới dạng hướng tài liệu JSON nên có thể chèn vào bất cứ thông tin gì.
- Dữ liệu trong MongoDB không yêu cầu ràng buộc và không có yêu cầu tuân theo khuôn khổ nhất định, điều này giúp tiết kiệm thời gian cho việc kiểm tra sự thỏa mãn về cấu trúc nếu muốn chèn, xóa, cập nhật hay thay đổi các dữ liệu trong bảng.
- Tốc độ truy vấn nhanh hơn do dữ liệu truy vấn được cached vào trong RAM vì thế truy vấn sau sẽ được thực hiện nhanh hơn truy vấn trước, và truy vấn sau sẽ không cần đọc lại từ ổ cứng nữa.
- _id luôn được đánh index tạo hiệu suất tìm kiếm cao. Nhược điểm:
- Dữ liệu trong MongoDB không yêu cầu ràng buộc nhưng người sử dụng lưu ý cẩn thận mọi thao tác để không xảy ra các kết quả ngoài ý muốn gây ảnh hưởng đến dữ liệu.
- Dữ liệu được lưu dưới dạng key - value, trong khi các collection chỉ khác về value nên sẽ lặp lại key dẫn đến thừa dữ liệu gây tốn bộ nhớ.
- Thông thường, đề thay đổi dữ liệu từ bộ nhớ RAM đến ổ cứng phải qua 60 giây thì chương trình mới thực hiện hoàn tất, đây là nguy cơ bị mất dữ liệu nếu bất ngờ xảy ra tình huống mất điện trong vòng 60 giây đó.
1.2.1.2. ExpressJS
ExpressJS là một framework được xây dựng dựa trên nền tảng (platform) là Nodejs với nhiều tính năng mạnh giúp lập trình và tạo lên ứng dụng website và ứng dụng mobile. Express có các API hỗ trợ các HTTP method và các lớp trung gian (middleware). Một số tính năng của ExpressJS như sau: sử dụng các lớp trung gian vào giữa quá trình nhận request và trả response để xử lý tạo ra response, có bộ định tuyến (router) giúp làm match các URL và HTTP method, làm việc với các file html.
Lê Đình Thảo - Lớp K19HTTTB 21
Khóa luận tốt nghiệp Nghiên cứu hệ thống giao dịch chứng khoán trực tuyến và xây dựng mô đun khớp lệnh giao dịch
- Không đệm: “NodeJS không đệm bất kì một dữ liệu nào và các ứng dụng này
chủ yếu là đầu ra dữ liệu.”
- Có giấy phép: “NodeJS đã được cấp giấy phép bởi MIT License.”
Khóa luận tốt nghiệp Nghiên cứu hệ thống giao dịch chứng khoán trực tuyến và xây dựng mô đun khớp lệnh giao dịch
Sử dụng lớp trung gian trong ExpressJS: Lớp trung gian là những hàm được thực thi ở giữa request từ trình duyệt đến và kết quả cuối cùng được trả ra và gửi response đến trình duyệt. Có thể có nhiều lớp trung gian để xử lý một request và chúng được thực
hiện theo thứ tự. Lớp trung gian A dược thực hiện trước lớp trung gian B, lớp trung gian
B thực hiện trước lớp trung gian C, ... Hơn nữa các lớp trung cũng có thể nhận được các
biến từ lớp trung gian trước.
Router trong ExpressJS nó là bộ đính tuyến hay còn gọi là router để có thể định danh được những url cùng với các phương thức kèm theo nó. Route trong ExpressJs có cú pháp như sau: “app.get(‘/greeting’, (req,res)=> res.send(‘hello world’))” Ví dụ với dòng code này khi truy cập vào tên miền + với /greeting giao diện trình duyệt sẽ hiện ra dòng chữ “hello world”.
Có thể làm việc dễ dàng với file tĩnh: trong expressjs ta có thể sử dụng lớp tiện ích
trung gian là express.static nhằm làm việc với các file tĩnh là các hình ảnh video,các file css và các file js,...
1.2.1.3. NodeJS
NodeJS là một nền tảng lập trình web mã nguồn mở và đa nền tảng được dựng trên
Javascript V8 Engine. Nodejs có cộng đồng lập trình viên lớn nên có thư viên lập trình dưới dạng javascript module để cài đặt vào ứng dụng để việc lập trình trở lên thuận tiện.
Một số đặc điểm của nodejs:
- Không đồng bộ: “Tất cả các API của NodeJS đều không đồng bộ (none - blocking), nó chủ yếu dựa trên nền của NodeJS Server và chờ đợi Server trả dữ liệu về. Việc di chuyển máy chủ đến các API tiếp theo sau khi gọi và cơ chế thông báo các sự kiện của Nodejs giúp máy chủ để có được một phản ứng từ các cuộc gọi API trước (Realtime).”
- Chạy rất nhanh: “NodeJS được xây dựng dựa vào nền tảng V8 Javascript Engine nên việc thực thi chương trình rất nhanh.”
- Đơn luồng nhưng khả năng mở rộng cao: “Node.js sử dụng một mô hình luồng duy nhất với sự kiện lặp. cơ chế tổ chức sự kiện giúp các máy chủ để đáp ứng
Lê Đình Thảo - Lớp K19HTTTB 23
Khóa luận tốt nghiệp Nghiên cứu hệ thống giao dịch chứng khoán trực tuyến và xây dựng mô đun khớp lệnh giao dịch
1.2.1.3. ReactJS
React hay còn gọi là ReactJs là một thư viện được viết bằng ngôn ngữ javascirpt. Thư viện react cung cấp các hàm để có thể phát triền website bên phía client được tốt hơn và nhanh chóng hơn. Nó cho phép những nhà phát triển web tạo ra giao diện người dung nhanh chóng. Phần Views của Reactjs thường được hiển thị bằng việc chủ yếu dung các component mà chứa các component cụ thể hoặc các thẻ HTML. Một trong những đặc trưng duy nhất của Reactjs là việc render dữ liệu không những có thể thực hiện ở tầng server mà còn ở tầng client. Nó cũng sử dụng khái niệm là Virtual DOM (DOM ảo). Virtual DOM tạo ra bản cache cấu trúc dữ liệu của ứng dụng trên bộ nhớ. Sau đó, ở mỗi vòng lặp, nó liệt kê những thay đổi và sau đó là cập nhật lại sự thay đổi trên DOM của trình duyệt một cách hiệu quả. Điều này cho phép ta viết các đoạn code như thể toàn bộ trang được render lại dù thực tế là Reactjs chỉ render những component hay subcomponent nào thực sự thay đổi. Mỗi framework hay thư viện luôn có những ưu và nhược điểm riêng. Sau đây tôi xin trình bày về ưu điểm và nhược điểm của nó.
Ưu điểm:
- React sử dụng DOM ảo với component thay vì DOM thông thường.
- React sử dụng JSX (Javascript XML) có thể nhúng các đoạn code HTML vào trong đoạn code JS.
- Nhiều công cụ hỗ trợ phát triển. “React Developer Tools” là một ứng dụng mở rộng trên Chrome giúp tìm lỗi của React.
- Render tầng server: React có thể render cả javascript và html trong trường hợp người dùng tắt javascript trên trình duyệt.
- Test giao diện dễ dàng vì giao diện chia thành các component.
- Hiệu năng cao đối với các ứng dụng có dữ liệu thay đổi liên tục, dễ dàng cho bảo trì và sửa lỗi.
Nhược điểm:
- React là một thư viện giúp lập trình phía client tức là chỉ có phần View. Nó không có phần model và controller. Việc lấy dữ liệu cần gọi qua các Ajax.
- Cần phải cấu hình lại hệ thống, khi muốn tích hợp ReactJS vào nhưng mvc framework khác.
- Khó tiếp cận cho người mới.
1.2.2. Websocket
1.2.2.1. Giao thức Websocket
Websocket là một giao thức truyền dữ liệu qua lại giữa client bằng một kết nối duy nhất qua cổng 80 và 443. Websocket không lo bị chặn bởi tường lửa hay proxy server, do hoạt động trên các cổng web tiêu chuẩn.
Khác với giao thức HTTP, server chờ đợi các request từ client để xử lý rồi trả lại response cho client, trong giao thức websocket server có thể chủ động gửi dữ liệu tới client khi mà có sự thay đổi về dữ liệu mà không cần phải có yêu cầu từ client.
Dữ liệu truyền giữa client và server qua một kết nối cố định nên giảm được nhiều thời gian truyền dữ liệu.
Để sử dụng giao thức websocket, trình duyệt phải hỗ trợ giao thức này và server cũng phải hỗ trợ websocket. Có nhiều thư viện hỗ trợ làm việc với websocket như socket.io với nodejs và signalR với asp.net
1.2.2.2. Hoạt động
Hiểu một cách đơn giản, giao thức hoạt động với 2 phần: phần bắt tay và phần truyền dữ liệu. Phần bắt tay là phần mà các client sẽ gửi yêu cầu kết nối tới server, server xác thực request đó và chấp nhận nếu hợp lệ. Sau khi được chấp nhận thì kết nối giữa client và server được tạo. Kết nối được tạo thành công, phần truyền dữ liệu được bắt đầu. Các dữ liệu sẽ được truyền đi bằng một kết nối duy nhất, là kết nối sau khi thực hiện phần 1.
Đầu tiên client sẽ gửi một yêu cầu nâng cấp tới server:
Connection: Upgrade
Cookie: IO=IQeZeElceheotlbGAAAB
Lê Đình Thảo - Lớp K19HTTTB 24
Khóa luận tốt nghiệp Nghiên cứu hệ thống giao dịch chứng khoán trực tuyến và xây dựng mô đun khớp lệnh giao dịch
Sau khi nhận được yêu cầu kết nối, server trả về kết quả:
Connection: Upgrade
Sec-Websoc ket-Acc ept: N8 a Z b IF+5 X 0b2 b C j 6 S X9 ho Z h 6 hu= Sec-Websocket-Extensions: permessage-defIate
Upgrade: websocket
Via: 1.1 vegur
IHost: kl9a4040152.herokuapp.com
Origin: http:/∕kl9a4040152.herokuapp. com
Pragma: no-cache
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
Sec-WebSocket-Key: mZ0VLgCqz2DlQ+T7aSLlLg≈=
Sec-WebSocket-Version: 13
Hình 1: Yêu cầu kết nối socketio từ client
Lê Đình Thảo - Lớp K19HTTTB 25
Khóa luận tốt nghiệp Nghiên cứu hệ thống giao dịch chứng khoán trực tuyến và xây dựng mô đun khớp lệnh giao dịch
Hình 2: Kết quả trả về yêu cầu kết nối Websoket từ server
Client sau đó kiểm tra status code trả về (101 nếu thành công) và Sec-Websocket- Accept (được mã hóa từ Sec-Websocket-Key) và thực hiện kết nối. Sau khi kết nối dữ liệu sẽ được truyền qua các frame thông qua một kết nối duy nhất vừa được tạo.
Hình 3: Dữ liệu được truyền qua một kết nối socket
1.2.2.1. Thư viện Socket.io
Socket.IO là một thư viện giúp làm việc với websocket để làm ra các ứng dụng có tính thời gian thực. Thư viện socket.io có phần server và phần client. Phần server dùng cho Nodejs server. Phần client dùng cho web và mobile.
Socket.IO hỗ trợ nhiều công nghệ realtime khác nhau: websocket, AJAX long polling, AJAX short polling ... và sẽ tự động mặc định dùng giao thức Socket.IO. Cách sử dụng thư viện Socket.IO cũng khá đơn giản với 3 bước là khởi tạo, nhận thay đổi, và gửi đi thay đổi. Đối với server thì không có phần khởi tạo, vì server sẽ nhận request kết nối từ client.
Khóa luận tốt nghiệp Nghiên cứu hệ thống giao dịch chứng khoán trực tuyến và xây dựng mô đun khớp lệnh giao dịch
function OnConnect socket // sending to the client
socket.emit(’hello■, 'can you hear me?', 1, 2, 'abc'); // sending to all clients except sender
socket. broadcast.emit(’broadcast’, 'hello friends!'); // sending to all clients in 'game' room except sender socket.to(■game’).emit(’nice game', "let’s play a game");
// sending to all clients in 'gamel' and/or in 'game2' room, except sender socket.to('gamel').to('game2').emit('nice game', "let's play a game (too)"); // sending to all clients in 'game' room, including sender
io.in('game').emit('big-announcement’, 'the game will start soon’); // sending to all clients in namespace 'myNamespace■, including sender
io.of('myNamespace').emit('bigger-announcement', 'the tournament will start soon’); // sending to a specific room in a specific namespace, including sender
io.of('myNamespace’).to('room’).emit('event', 'message*); // sending to individual SOCketid (private message)
io.to(socketld).emit('hey', 'I just met you');
// WARNING: `socket.to(socket.id).emit()' will NOT work, as it will send to everyone in the room // named `socket.id` but the sender. Please use the classic `socket.emit()` instead.
// sending with acknowledgement
socket.emit('question', 'do you think so?’, function (answer) {}); // sending without compression
socket.compress(false).emit('uncompressed', "that's rough");
// sending a message that might be dropped if the client is not ready to receive messages
socket.volatile.emit('maybe■, 'do you really need it?'); // specifying whether the data to send has binary data
socket.binary(false).emit('what■, 'I have no binaries!');
// sending to all clients on this node (when using multiple nodes) io. local.emit('hi', 'my lovely babies');
// sending to all connected clients
io.emit('an event sent to all connected clients');
Hình 4: Các api của thư viện socket.io
Khóa luận tốt nghiệp Nghiên cứu hệ thống giao dịch chứng khoán trực tuyến và xây dựng mô đun khớp lệnh giao dịch
CHƯƠNG 2: PHÂN TÍCH THIẾT KẾ HỆ THỐNG
2.1. Xác định yêu cầu hệ thống
Hệ thống đáp ứng được nhu cầu đặt lệnh giao dịch mua và bán cổ phiếu của khách
hàng. Hệ thống cung cấp bảng giá hiển thị theo thời gian thực giúp khách hàng theo dõi được thay đổi của cổ phiếu.
2.2. Biểu đồ hoạt động
2.2.1. Khách hàng đăng ký dịch vụ
Hình 5: Biểu đồ hoạt động khách hàng đăng ký dịch vụ
Khóa luận tốt nghiệp Nghiên cứu hệ thống giao dịch chứng khoán trực tuyến và xây dựng mô đun khớp lệnh giao dịch
Mô tả quy trình khách hàng đăng ký dịch vụ:
Bước 1: Khách hàng yêu cầu đăng ký dịch vụ bằng cách click chuột vào nút đăng ký trên giao diện client.
Bước 2: Client nhận được request có yêu cầu đăng ký dùng dịch vụ của khách hàng
và hiển thị form đăng ký tài khoản.
Bước 3: Khách hàng điền thông tin đăng ký và chấp nhận điều khoản dịch vụ. Sau
khi đã điền đầy đủ thông tin khách hàng sẽ đệ trình đơn đăng ký bằng cách ấn nút đăng ký trên giao diện website.
Bước 4: Client kiểm tra tính hợp lệ của thông tin khách hàng đăng ký. Nếu thông tin hợp lệ, thực hiện bước 5. Nếu thông tin không hợp lệ thực hiện bước 8.
Bước 5: Thông tin đăng ký được gửi đến server và được lưu trữ vào cơ sở dữ liệu.
Nếu dữ liệu được lưu thành công, thực hiện bước 6. Nếu đăng ký thất bại thực hiện bước
9.
Bước 6: Thông báo thành công và gửi yêu cầu xác thực tới email của khách hàng.
Khóa luận tốt nghiệp Nghiên cứu hệ thống giao dịch chứng khoán trực tuyến và xây dựng mô đun khớp lệnh giao dịch
2.2.2. Khách hàng thực hiện đặt lệnh
Hình 6: Biểu đồ hoạt động thực hiện đặt lệnh
Mô tả quy trình khách hàng thực hiện đặt lệnh:
Bước 1: Khách hàng thực hiện đặt lệnh giao dịch bằng cách nhấn nút đặt lệnh trên