Xử lý bất đồng bộ

Nguồn: Intro to architecting systems for scale
Các workflow bất đồng bộ giúp giảm thời gian request của những thao tác tốn kém mà nếu không sẽ phải thực hiện ngay trong request. Chúng cũng giúp ích 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ỳ.
Message queue
Message queue nhận, lưu giữ và chuyển giao các message. Nếu một thao tác quá chậm để thực hiện ngay trong request, bạn có thể dùng message queue theo workflow sau:
- Ứng dụng publish một job vào queue, rồi thông báo trạng thái job cho người dùng
- Một worker lấy job từ queue, xử lý, rồi báo hiệu job đã hoàn tất
Người dùng không bị chặn và job được xử lý ở chế độ nền. Trong thời gian này, client có thể xử lý thêm một chút để tạo cảm giác tác vụ đã xong. Ví dụ, khi đăng một tweet, tweet có thể hiện ngay lên timeline của bạn, nhưng có thể mất một lúc tweet mới thực sự được chuyển tới tất cả follower.
Redis hữu ích như một message broker đơn giản nhưng message 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 host sẵn nhưng có thể có latency cao và có khả năng message bị giao hai lần.
Task queue
Task queue nhận các task 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 và dùng để chạy các job tốn nhiều tính toán ở chế độ nền.
Celery hỗ trợ lập lịch và chủ yếu hỗ trợ python.
Back pressure
Nếu queue phình to đáng kể, kích thước queue có thể vượt quá bộ nhớ, dẫn đến cache miss, đọc đĩa và thậm chí chậm hơn nữa. Back pressure giúp ích bằng cách giới hạn kích thước queue, nhờ đó duy trì throughput cao và thời gian response tốt cho các job đã nằm trong queue. Khi queue đầy, client nhận được thông báo server bận hoặc HTTP status code 503 để thử lại sau. Client có thể gửi lại request vào lúc khác, có thể kèm exponential backoff.
Nhược điểm: xử lý bất đồng bộ
- Các use case như tính toán rẻ và workflow thời gian thực có thể phù hợp hơn với thao tác đồng bộ, vì việc đưa queue vào có thể thêm độ trễ và độ phức tạp.