Kiến trúc hệ thốngBất đồng bộ (Asynchronism)

Bất đồng bộ (Asynchronism)

Nội dung bài

Bất đồng bộ (Asynchronism)

Chủ đề11 phút đọcThe System Design Primer - mục "Asynchronism"

Mục lục
  1. Nội dung gốc
  2. Ghi chú của người dịch

Bất đồng bộ (Asynchronism)

Nội dung gốc

Sơ đồ tầng nền tảng với hàng đợi và worker xử lý bất đồng bộ
Nguồn: Intro to architecting systems for scale

Các luồng công việc bất đồng bộ (asynchronous workflows) giúp giảm thời gian xử lý request đối với những thao tác tốn kém mà nếu không thì phải thực hiện ngay trong luồng request (in-line). Chúng cũng có thể giúp bằng cách làm trước những việc tốn thời gian, chẳng hạn tổng hợp dữ liệu định kỳ.

Luồng đồng bộ so với luồng bất đồng bộ qua hàng đợi Đồng bộ (in-line) Client Server chờ đến khi xong (chậm) Bất đồng bộ Client Server nhận việc, trả lời ngay Queue Worker worker xử lý ở chế độ nền
Đồng bộ: client phải chờ server xử lý xong mới nhận phản hồi. Bất đồng bộ: server trả lời ngay sau khi đẩy việc vào hàng đợi, worker xử lý ở chế độ nền.

Hàng đợi thông điệp (Message queues)

Hàng đợi thông điệp nhận, lưu giữ và chuyển phát thông điệp. Nếu một thao tác quá chậm để thực hiện ngay trong luồng request, bạn có thể dùng hàng đợi thông điệp với luồng công việc sau:

Người dùng không bị chặn (blocked) và công việc được xử lý ở chế độ nền. Trong khoảng thời gian này, client có thể tùy chọn tự xử lý một phần nhỏ để trông như tác vụ đã hoàn thành. Ví dụ, khi đăng một tweet, tweet đó có thể lập tức hiện trên dòng thời gian (timeline) của bạn, nhưng có thể mất một lúc trước khi tweet thực sự được chuyển tới tất cả người theo dõi bạn.

Redis hữu ích như một message broker đơn giản nhưng thông điệp có thể bị mất.

RabbitMQ phổ biến nhưng đòi hỏi bạn phải làm quen với giao thức "AMQP" và tự quản lý các node của mình.

Amazon SQS là dịch vụ được lưu trữ sẵn (hosted) nhưng có thể có độ trễ cao và có khả năng một thông điệp bị chuyển phát hai lần.

Hàng đợi tác vụ (Task queues)

Hàng đợi tác vụ nhận các tác vụ cùng dữ liệu liên quan, chạy chúng, rồi trả về kết quả. Chúng có thể hỗ trợ lập lịch (scheduling) và có thể được dùng để chạy các công việc nặng về tính toán ở chế độ nền.

Celery hỗ trợ lập lịch và chủ yếu hỗ trợ Python.

Áp lực ngược (Back pressure)

Nếu hàng đợi bắt đầu phình to đáng kể, kích thước hàng đợi có thể vượt quá bộ nhớ, dẫn tới trượt cache (cache miss), đọc đĩa, và hiệu năng còn chậm hơn nữa. Áp lực ngược (back pressure) có thể giúp bằng cách giới hạn kích thước hàng đợi, nhờ đó duy trì thông lượng cao và thời gian phản hồi tốt cho các công việc đã nằm trong hàng đợi. Khi hàng đợi đầy, client nhận được thông báo máy chủ bận hoặc mã trạng thái HTTP 503 để thử lại sau. Client có thể thử lại request vào thời điểm sau đó, có thể dùng giãn cách lũy thừa (exponential backoff).

Áp lực ngược: hàng đợi đầy tới giới hạn thì từ chối request mới bằng HTTP 503, client thử lại sau Hàng đợi (queue) giới hạn đã đầy tới giới hạn Client request mới HTTP 503: đang bận thử lại sau, giãn cách lũy thừa (backoff)
Khi hàng đợi đầy tới giới hạn, hệ thống từ chối bớt request mới bằng HTTP 503; client thử lại sau, thường kèm giãn cách lũy thừa (exponential backoff).

Nhược điểm: bất đồng bộ

Nguồn và đọc thêm


Nguồn: The System Design Primer - mục "Asynchronism" — Donne Martin và cộng đồng đóng góp

Giấy phép: CC BY 4.0 (nguyên bản: Donne Martin, The System Design Primer)

Xem bản gốc

Bài tiếp theoGiao tiếp (Communication)