Mục lục

Vấn đề với các công việc chạy lâu

Hãy tưởng tượng bạn đang ở một nhà hàng thức ăn nhanh đông đúc. Có những hàng khác nhau để đặt hamburger, khoai tây chiên và đồ uống. Bây giờ, nếu ai đó đặt 100 cái hamburger thì sao? Liệu điều đó có nên làm chậm trễ cả hàng khoai tây chiên và đồ uống không?

Trong hệ thống máy tính, chúng ta cũng gặp một thách thức tương tự với "hàng đợi công việc" (job queue). Một hàng đợi công việc giống như một dãy các nhiệm vụ đang chờ máy tính thực hiện. Một số công việc nhanh chóng, như phục vụ đồ uống. Những công việc khác mất nhiều thời gian hơn, như làm 100 cái hamburger.

Một công việc chạy dài (như 100 cái hamburger kia) có thể chặn các công việc ngắn hơn nếu không được quản lý đúng cách. Điều này có thể làm chậm toàn bộ hệ thống và gây bực bội cho người dùng đang chờ đợi các tác vụ nhanh hơn hoàn thành.

Để ngăn chặn điều này, chúng ta sử dụng một kỹ thuật gọi là "xử lý bất đồng bộ".

Làm thế nào để ngăn chặn các công việc chạy lâu?

Hàng đợi riêng biệt

Tạo các hàng đợi khác nhau cho các loại công việc khác nhau.

Ví dụ: các hàng riêng cho hamburger, khoai tây chiên và đồ uống.

Ưu tiên công việc

Cho phép các công việc ngắn hơn vượt lên trước các công việc dài hơn khi thích hợp.

Ví dụ:

  • Phòng cấp cứu bệnh viện: Ưu tiên bệnh nhân nguy kịch hơn những người bị thương nhẹ.
  • Hệ điều hành: Ưu tiên cao hơn cho các tác vụ giao diện người dùng so với các cập nhật nền.

Xử lý song song

Sử dụng nhiều "công nhân" (như có nhiều đầu bếp) để xử lý các công việc khác nhau đồng thời.

Ví dụ Dịch vụ dịch thuật: Khi dịch một tài liệu lớn, văn bản được chia cho nhiều công cụ dịch thuật làm việc song song, mỗi công cụ xử lý một phần khác nhau.

Chia nhỏ công việc

Chia nhỏ các công việc lớn thành các phần nhỏ hơn có thể được xử lý từng chút một.

Ví dụ: Tải xuống tệp lớn: Chia tệp thành các phần nhỏ hơn và tải xuống chúng đồng thời.

Bằng cách sử dụng các phương pháp này, chúng ta đảm bảo rằng các công việc chạy dài không làm tắc nghẽn toàn bộ hệ thống. Điều này giúp mọi thứ hoạt động trơn tru.

Hàng đợi Redis (Redis Queue)

Redis, với khả năng hỗ trợ cấu trúc dữ liệu danh sách và tập hợp, có thể được sử dụng hiệu quả như một hàng đợi tin nhắn (message queue). Điều này có nghĩa là nó có thể xử lý nhiều tác vụ được xếp hàng để xử lý. Các tác vụ có thể được xử lý ngay lập tức hoặc vào một thời điểm đã lên lịch. Khả năng sử dụng Redis như một hàng đợi mở ra nhiều khả năng để xử lý các công việc và tin nhắn phân tán, đặc biệt là trong các ứng dụng yêu cầu hiệu suất và độ tin cậy cao.

Hãy tập trung vào cách đảm bảo các công việc chạy dài không chặn các hàng đợi công việc khác trong Redis https://redis.io/glossary/redis-queue/.

Hàng đợi riêng biệt

Trong Redis, bạn có thể tạo nhiều danh sách để hoạt động như các hàng đợi riêng biệt. Ví dụ:

  • fast_jobs cho các tác vụ nhanh
  • slow_jobs cho các tác vụ chạy dài

Bằng cách này, các công việc chạy dài trong slow_jobs sẽ không chặn việc xử lý fast_jobs.

fast_queue = Queue('fast', connection=redis_conn)
slow_queue = Queue('slow', connection=redis_conn)

Ưu tiên công việc

Sử dụng tập hợp có thứ tự của Redis để ưu tiên công việc. Các công việc có độ ưu tiên cao hơn có thể được xử lý trước, ngăn chặn các công việc chạy dài, có độ ưu tiên thấp chặn các tác vụ quan trọng.

Thời gian chờ công việc (Job Timeout)

Triển khai thời gian chờ cho công việc. Nếu một công việc chạy lâu hơn dự kiến, tạm dừng nó và đưa nó trở lại hàng đợi. Điều này ngăn một công việc dài đơn lẻ chặn các công việc khác vô thời hạn.

fast_queue.enqueue(quick_task, timeout=30)  # thời gian chờ 30 giây
slow_queue.enqueue(long_running_task, timeout=3600)  # thời gian chờ 1 giờ

Nhóm Worker (Worker chuyên dụng)

Tạo các nhóm Worker riêng biệt cho các loại công việc khác nhau. Các công việc chạy dài có Worker riêng, vì vậy chúng không chiếm dụng Worker cần thiết cho các tác vụ nhanh hơn.

Worker([fast_queue]).work()
Worker([slow_queue]).work()

Chia nhỏ công việc

Đối với các tác vụ rất dài, chia chúng thành các tác vụ con nhỏ hơn. Mỗi tác vụ con có thể được thêm vào hàng đợi riêng biệt, cho phép các công việc khác được xử lý xen kẽ.

Xử lý trễ (Delayed Processing)

Sử dụng tập hợp có thứ tự của Redis với dấu thời gian làm điểm số để lên lịch công việc cho sau này. Điều này có thể giúp phân bổ các tác vụ tiêu tốn nhiều tài nguyên.

Giám sát và tự động mở rộng (Auto-scaling)

Triển khai giám sát để phát hiện tồn đọng hàng đợi. Tự động mở rộng worker cho các hàng đợi đang bị tụt hậu.

Bằng cách triển khai các kỹ thuật xử lý bất đồng bộ như đã đề cập ở trên, bạn có thể đảm bảo các công việc chạy lau không làm tắc nghẽn hệ thống. Điều này giúp mọi thứ hoạt động hiệu quả, giống như một nhà hàng được quản lý tốt trong giờ cao điểm. Hãy nhớ rằng, quản lý hàng đợi hiệu quả là chìa khóa để tạo ra các hệ thống máy tính có khả năng phản hồi nhanh và thân thiện với người dùng.

Xin chào! Cám ơn bạn đã đọc bài viết có tiêu đề Đừng để các tác vụ lâu làm chậm hệ thống của bạn: Làm chủ xử lý bất đồng bộ của tác giả Vũ Lê Huân. Trong trường hợp bạn muốn tìm hiểu thêm thông tin về tác giả, bạn có thể truy cập .