banner
Nov 5, 2022
106 Views

[netflixtechblog] Timestone: Hệ thống hàng chờ ưu tiên của netflix có lưu lượng cao, độ trễ thấp và hỗ trợ các công việc không-thể-thực-thi-song-song P3/3

Written by
banner

Nguồnhttps://netflixtechblog.com/timestone-netflixs-high-throughput-low-latency-priority-queueing-system-with-built-in-support-1abf249ba95f

Các khái niệm chính

Gói tin

Các gói tin chứa một cấu trúc thông tin không được định nghĩa trước với độ ưu tiên do người dùng tự định nghĩa (Xem mục "Độ ưu tiên"), các cặp khóa-giá trị (key-value) dùng để lọc khi lấy gói tin ra khỏi hàng chờ (mục này chỉ bắt buộc phải có với hàng đợi riêng - exclusive queues), thông tin về thời gian ẩn (không bắt buộc). Mỗi gói tin được đưa vào hàng chờ có thể được lấy ra nhiều lần (nhưng có hạn). Chúng tôi gọi số lần được phép lấy ra này là số-lần-được-lấy (attempts), mỗi lần lấy gói tin ra số này sẽ giảm đi.

Độ ưu tiên

Độ ưu tiên dùng 1 số nguyên để biểu thị, số càng nhỏ thì độ ưu tiên càng cao. Dù các ứng dụng được phép dùng bất kỳ số nào nhưng nên dùng theo chuẩn Unix timestamps theo mili giây (ví dụ 1661990400000 cho nửa đêm ngày 1 tháng 9 giờ UTC).

1 mảnh code từ PriorityClass enum được sửa dụng ở COSMOS. Giá trị ở đây tính theo ngày.

Việc định nghĩa priority phụ thuộc hoàn toàn vào ứng dụng. Ví dụ như hệ thống streaming được dùng trong COSMOS dùng độ ưu tiên phụ thuộc vào thứ hạng của hộp thư khách hàng như ảnh trên.

Trạng thái gói tin

Trong 1 hàng chờ, mỗi gói tin của Timestone thuộc một trong các trạng thái sau (ảnh dưới):

  1. ẩn: invisible
  2. chờ: pending
  3. xử lý: running
  4. hoàn thành: completed
  5. hủy: canceled
  6. lỗi: errored

Thông thường các gói tin có thể thêm vào hàng chờ có thể có trạng thái ẩn hoặc chờ. Các gói tin ẩn vào trạng thái chờ sau khi thời gian ẩn được định nghĩa từ trước kết thúc. Các máy chủ xử lý có thể lấy 1 gói tin ở trạng thái chờ từ hàng đợi bằng cách chỉ định thời gian máy chủ sẽ dùng để xử lý. Lấy nhiều gói tin một lúc cũng được hỗ trợ. Sau khi gói tin được lấy ra khỏi hàng chờ trạng thái sẽ được đổi sang xử lý, các máy chủ xử lý có thể thông báo với Timestone đã xử lý xong gói tin để chuyển trạng thái gói tin về hoàn thành hoặc nếu không cần xử lý nữa có thể thông báo đánh dấu gói tin ở trạng thái hủy. Nếu các trạng thái đó không được thông báo đúng thời hạn định nghĩa trước, các gói tin sẽ cho phép xử lý lần sau và số-lần-được-lấy (attempts) sẽ giảm. Nếu số-lần-được-lấy giảm về 0 gói tin đó sẽ bị đánh dấu trạng thái là lỗi. Các trạng thái hoàn thành, lỗi và bị hủy sẽ được dọn dẹp sau 1 khoảng thời gian định sẵn bằng tiến trình chạy nền.

Các gói tin có thể bị chuyển trạng thái khi máy chủ gọi API hoặc Timestone chạy tiến trình chạy nền. Ảnh dưới cho chúng ta cái nhìn về việc chuyển trạng thái.

Cơ chế chuyển trạng thái của gói tin trong Timestone.

Hàng chờ

Tất cả các gói tin được nhận đều lưu trữ trong hàng chờ. Trong một hàng chờ, gói tin được sắp xếp theo độ ưu tiên. Timestone có thể lưu trữ một số lượng tùy ý các hàng đợi và cung cấp một bộ các API để quản lý và cấu hình hàng đợi. Dữ liệu chúng tôi lưu trữ bao gồm kiểu của hàng đợi, thời gian được phép xử lý áp dụng cho các gói tin được đưa ra khỏi hàng đợi hoặc thời gian ẩn áp dụng cho các gói tin được đưa vào hàng đợi ở trạng thái ẩn, số lần 1 gói tin được phép đưa ra khỏi hàng đợi và việc thêm/ lấy gói tin vào/ra hàng đợi có đang bị chặn tạm thời hay không. Nhưng hãy nhớ là những nơi đưa gói tin vào có thể sẽ ghi đè được các thông tin về thời gian được phép xử lý hay thời gian ẩn của gói tin bằng cách thiết lập trong từng gói tin lúc đưa vào hàng chờ.

Các hàng chờ của Timestone được chia thành 2 kiểu là đơn giảnđộc quyền.

Khi một hàng chờ độc quyền được tạo, nó được gắn với 1 khóa độc quyền của người dùng. Ví dụ đặt 1 key là abc thì tất cả các gói tin được đưa vào hàng chờ phải chứa key này trong dữ liệu (metadata). Ví dụ 1 gói tin abc=foo sẽ được đưa vào queue này, foo ở đây sẽ là giá trị tương ứng với khóa độc quyền đó được gọi là giá trị độc quyền của gói tin. Ở bất kỳ thời điểm nào chỉ được phép có duy nhất 1 ứng dụng tiêu thụ 1 giá trị độc quyền. Vì thế nên nếu hàng đợi độc quyền có key là abc trên có 2 gói tin là abc=foo và 1 trong 2 gói tin đó đã được 1 máy chủ tiêu thụ thì các máy chủ còn lại không được phép xử lý gói tin còn lại như mô tả ảnh dưới.

Khi máy chủ B yêu cầu lấy gói tin, nó gọi gói tin 2 thay vì gói tin 1 ngay cả khi gói tin 1 có độ ưu tiên cao hơn. Lý do bởi vì đây là hàng chờ độc quyền và giá trị độc quyền foo đã được tiêu thụ.

Còn ở các hàng chờ đơn giản thì việc này không được áp dụng, không có liên kết chặt chẽ nào giữa gói tin và khóa dữ liệu. 1 hàng chờ đơn giản hoạt động như 1 hàng chờ ưu tiên thông thường, sắp xếp các gói tin theo thứ tự EDF.

Những thứ chúng tôi đang phát triển

Có vài thứ chúng tôi vẫn đang phát triển:

  1. Cùng với nhu cầu sử dụng Timestone trong COSMOS ngày càng phổ biến, nhu cầu truy vấn các hàng chờ đang trở nên cấp thiết. Để giải quyết vấn đề này, chúng tôi xây dựng một dịch vụ khác biệt sử dụng một phương pháp truy vấn riêng.
  2. Như đã lưu ý ở mục trên (xem phần "Hệ thống lưu trữ bản ghi"), một hàng đợi và nội dung hiện tại chỉ nằm trên 1 phân đoạn (shard) của redis. Các hàng đợi có thể sẽ hoạt động với tần suất cao, chúng tôi muốn hỗ trợ 1 hàng đợi lớn tùy ý nên chúng tôi đang suy nghĩ về việc chia các hàng đợi thành các phân đoạn.
  3. Mỗi gói tin có thể chứa nhiều nhất là 4 cặp khóa-giá trị. Hiện chúng tôi dùng hết các cặp đó để chứa chỉ mục thứ cấp dùng khi muốn lọc để lấy gói tin khỏi hàng đợi. Độ phức tạp của thuật toán tăng theo cấp số nhân cả thời gian và dung lượng (O(2^n)). Chúng tôi đang chuyển sang dạng thứ tự từ điển ở các bộ-tự-sắp-xếp (sorted set) để giảm một nửa số lượng chỉ mục (index) và xử lý thông tin dữ liệu theo cách hiệu quả hơn.
Article Tags:
· · ·
Article Categories:
techblog
banner

Leave a Reply

Your email address will not be published. Required fields are marked *