View profile

#178 - Đo lường Site Reliability với SLI, SLO, và SLA

Revue
 
 

Grokking Newsletter

July 4 · Issue #179 · View online

Tuyển tập những bài viết hay cùng sự kiện bổ ích dành cho kĩ sư phần mềm tại Việt Nam.


Những bài viết hay
Measuring Site Reliability with SLI, SLO, and SLA
How to troubleshoot memory problems in Python
How Netflix describes the play process
How Netflix describes the play process
Netflix: What Happens When You Press Play?
Góc Distributed System
Một số ý tưởng trong thiết kế hệ thống Async của FacebookAsync là hệ thống trung tâm xử lý các job bất đồng bộ ở Facebook, bất kể job được submit từ service nào.
Nhiệm vụ chính của nó là nhận job từ các service, đưa vào hệ thống queue, sau đó phân bổ tới các máy worker để thực hiện. Tuy nhiên do đặc thù của Facebook là có lượng truy cập rất lớn, hệ thống Async này có một số điểm thiết kế đặc biệt để đáp ứng được.
Bài viết này tuy không đi sâu vào implementation, nhưng có liệt kê những điểm thiết kế đó như sau:
1. Đảo ngược mức độ ưu tiên.
Thay vì ưu tiên các job cần thực hiện sớm theo thiết kế thông thường, Async xác định deadline của job và ưu tiên chọn job gần sát với deadline nhất để xử lý. Việc này làm giảm gánh nặng đáng kể cho hệ thống lúc peak time.
2. Xây dựng hệ thống Async gồm rất nhiều queue.
Mỗi queue phục vụ cho 1 luồng use-case cụ thể và chỉ nhận job từ use-case đó. Queue ở đây là priority queue, sắp xếp job theo thứ tự deadline mô tả ở điểm #1. Ở đầu nhận, Dispatcher sẽ pickup job từ các queue, chọn lấy job có deadline sát nhất đẩy vào worker. Ở đầu gửi, các background threads sẽ đẩy thêm job từ client services vào các queue.
3. Time shifting.
Để tránh quá tải ở peak time, Async sẽ thực hiện một số pre-computation ở những thời điểm low traffic, hay còn gọi là off-peak. Hệ thống có module đi thu thập dữ liệu người dùng đã sử dụng hoặc tương tác trong ngày hôm qua, đưa ra dự đoán về các dữ liệu người dùng có thể cần tới trong ngày hôm nay để lưu vào cache, phục vụ cho thời điểm peak time. Một ví dụ khác là những dữ liệu đưa cho người dùng lúc họ online nhưng có thể tính offline ví dụ như “people you may know”
4. Batching.
Các job được gom lại để lưu vào 1 slot trong queue, tránh việc phân bổ job quá nhỏ. Đây là cách tiếp cận thông thường, và các hệ thống queue thường có hỗ trợ việc batching này.
5. Xây dựng policy về quota và rate limit.
Async có cơ chế track vấn đề sử dụng resource của từng luồng use-case để có điều chỉnh quota và rate limit cho phù hợp. Tuy nhiên các traffic mang tính đột biến có thể go over ngưỡng cho phép, do đó rate limiting của async vẫn có cơ chế buffer (overlimit) để đề phòng cho những trường hợp này.
Trong một bài viết khác, Facebook có mô tả về hệ thống priority queue của họ. Mời bạn xem ở đây: https://engineering.fb.com/2021/02/22/production-engineering/foqs-scaling-a-distributed-priority-queue/
Góc Lập Trình
Đề ra kỳ này
Tìm số đường đi trong ma trận.
Cho ma trận mxn, hãy tìm số đường đi có thể để đi từ điểm xuất phát (0, 0) tới đích (m-1, n-1). Lưu ý, ta chỉ có thể đi sang phải, hoặc đi xuống.Điều kiện: 1 <= m, n <= 100
Ví dụ 1:
Cho ma trận 3x2 (m=3, n=2) , ta sẽ có 3 đường đi như sau.
- Sang phải → Đi xuống → Đi xuống
- Đi xuống → Đi xuống → Sang phải
- Đi xuống → Sang phải → Đi xuống
Chương trình trả lại kết quả bằng 3.
Ví dụ 2:
m = 7, n = 3
output = 28
Ví dụ 3:
m = 3, n = 3
output = 6
Lời giải tuần trước:
Chúng ta có thể dùng giải pháp greedy để giải bài toán này như sau: Với mỗi số bắt đầu từ số thứ 2, chúng ta cần tìm số thao tác nhỏ nhất để biến đổi nó thành một số lớn hơn số trước đấy. Lưu ý là khi thêm các chữ số vào phía sau, ta sẽ muốn 1 số nhỏ nhất có thể, qua đó đảm bảo số thao tác là nhỏ nhất.
Giả sử xét 1 cặp Xi và Xi+1, tạm gọi là A và B. Chúng ta cần tìm một số B’ sao cho B’ > A và B là prefix của B’.
Gọi hàm len(Z) là hàm trả về số chữ số của một số nguyên Z.
Bước đầu tiên ta kiểm tra nếu A < B, vậy B’ = B, ta ko cần làm gì và chuyển qua xét cặp số tiếp theo Xi+1 và Xi+2.
Bước thứ 2, nếu A >= B và len(A) = len(B), ta chỉ cần thêm 1 số 0 vào phía sau B để được số B’.
Bước 3, nếu len(A) > len (B), gọi k = len(A) - len(B):
- Ta sẽ thử thêm k số 0 vào phía sau B để được một số B’ nhỏ nhất có thể lớn hơn A. So sánh B’ và A, nếu B’ > A đây là phương án tối ưu.
- Nếu B’ < A. Nếu ta thêm k số 9 vào phía sau B, và vẫn được một số nhỏ hơn A, vậy có nghĩa là B’ sẽ cần nhiều chữ số hơn A. Trong trường hợp này, ta cần thêm k+1 số 0 vào phía sau B để được B’ tối ưu nhất.
- Ngược lại, nếu thêm k số 9 vào phía sau B và ta được một số lớn hơn A, vậy có nghĩa là B’ sẽ có số chữ số = A. Trong trường hợp này, ta chỉ cần lấy B’ = A + 1 sẽ là phương án tối ưu.
Lời giải sau sử dụng python tương đối gọn gàng và cho kết quả chính xác.
Code & Tools
Tin tức khác
Việt Nam giành 4 huy chương Bạc Olympic Tin học quốc tế năm 2021
This Week Sponsors
Discover your career at KMS with many available jobs, especially with a 1-month joining bonus: CLICK HERE.
More surprisingly, your next move could be even greater when referred by your buddies who are working at KMS:
  • One-month joining bonus
  • FULL 13th-month salary
  • Cut off HR screening and phone interview
  • Only 1 all-included interview
  • Employment results within 3 working days
We hope it impresses you in case you’re considering KMS Technology as your next career destination or you know someone who does.
Quotes
A complex system that works is invariably found to have evolved from a simple system that works. The inverse proposition also appears to be true: A complex system designed from scratch never works and cannot be made to work.
John Gall, Systemantics (1975)
Did you enjoy this issue?
If you don't want these updates anymore, please unsubscribe here.
If you were forwarded this newsletter and you like it, you can subscribe here.
Powered by Revue
Charmington La Pointe, 181 Cao Thang, Dist 10, Ho Chi Minh city, Viet Nam