Async và Sync NodeJs - Để tôi test một ví dụ, đừng nghe lý thuyết

Nội dung bài viết

Lập trình đồng bộ hay bất đồng bộ không đơn giản như những gì được viết trong nhiều blog, đó chỉ là lý thuyết, vậy làm sao chúng ta biết được hiệu suất của nó thế nào đây?

Lưu ý: Đây là một trong những bài viết trong Serires Nodejs: Học 7 ngày


Async và Sync


Là một lập trình viên bất cứ level nào bạn cũng hiểu về khái niệm lập trình đồng bộ và bất đồng bộ. Chúng ta chỉ hiểu nôm na rằng nếu lâp trình không đồng bộ thì sử dụng và thực hiện với sự trợ giúp của callbacks, Promise, async và await. Và hơn ai hết cả thảy chúng ta đều biết rằng không đồng bộ sẽ tốt hợn rất nhiều, vậy nó thực sự tốt như thế nào? Tôi sẽ làm một ví dụ giúp bạn hiểu rõ thực sự. Và cũng là để cho các bạn có thêm kiến thức nhằm có điểm công trong mắt nhà tuyển dụng vị trí back-end nodejs.


So sánh hiệu suất Async và Sync


Để so sánh hiệu suất giữa đồng bộ và bất đồng bộ, thì chúng tôi sẽ sử dụng package bcrypt và expressjs. Vì bcrypt có cung cấp các phương thức đồng bộ và không đồng bộ để băm một chuỗi nhất định. lấy nó làm ví dụ qủa là hợp lý. Ở đây không giải thích nhiều về 2 khái niệm Async và Sync chỉ tập trung test hiệu suất. OK!! 


Đầu tiên hãy install các packages:


AnonyStick$ npm i bcrypt express --save

added 39 packages, and audited 589 packages in 4s

5 packages are looking for funding
  run `npm fund` for details

2 high severity vulnerabilities

Some issues need review, and may require choosing
a different dependency.

Run `npm audit` for details.

## Tạo file app.js

const express = require('express')
const bcrypt = require('bcrypt')

const app = express()

app.get('/sync', (req, res) => {
    let hashed = bcrypt.hashSync('secret', 10)
    return res.send(hashed)
})

app.get('/async', async (req, res) => {
    let hashed = await bcrypt.hash('secret', 10)
    return res.send(hashed)
})

app.listen(3000, () => console.log('Server started on port 3000'))


Cần chú ý đoạn code trên, nếu bạn đủ trình độ thì bỏ qua khúc này, còn chưa hãy để tôi giải thích cho bạn. Chúng ta có 2 nhiệm vụ, đó là gọi hai routes là /sync/async. bcrypt.hashSync() là một method đồng bộ, và bcrypt.hash() không đồng bộ. Bây giờ chúng ta sẽ test hiệu suất hai routes này thông qua apache bench.


Apache bench là một công cụ để đánh giá các máy chủ HTTP.


Sync mode benchmark


Sủ dụng lệnh sau đây để test về đồng bộ


AnonyStick$ ab -k -c 20 -n 250 "http://localhost:3000/sync"

AnonyStick$ ab -k -c 20 -n 250 "http://localhost:3000/async"


Nếu vẫn chưa biết về apache bench thì hãy để tôt giải thích tiếp: 


  • ab: viết tắt của apache bench 
  • -k: Kích hoạt tính năng HTTP KeepAlive 
  • -c: Số lượng nhiều yêu cầu thực hiện cùng một lúc. 
  • -n: Số lượng yêu cầu thực hiện cho phiên đo điểm chuẩn 


Kết quả cho câu lênh trên được đưa ra dưới đây. Hay để ý hình ảnh chi tiết một chút 


SO SÁNH: Trước tiên tôi đã tổng kết cho bạn đọc nhanh nhất: 


Xem hình ảnh chúng ta có thể thấy rằng. Cơ chế async tốt hơn sync về tính trung bình xử lý đồng thời. 1446.324 so với 384.406. Và còn nhiều thông số khác nhỉnh hơn. Nếu bạn cảm thấy chưa thoả mãn, vui lòng đọc thêm thông tin về các chỉ số trên đó.


Tóm lại


So sánh để làm gì? Để luôn nhớ rằng sử dụng chế độ async khi mã của bạn cần thực hiện một số thao tác Blocking i/o vì nó không chặn Event Loop.

Có thể bạn đã bị missing