📰Những bài viết hay
Optimizing batch writes to Redis using Pipelining
(by quangle80)
Tại Swiggy (một nền tảng food delivery lớn ở Ấn Độ), mỗi ngày hệ thống DSP (Data Science Platform - một trong những core platform) của họ sẽ có các scheduled ETL jobs cần chạy để xử lý các cập nhật dữ liệu từ danh sách cửa hàng. Riêng đối với những tác vụ yêu cầu độ trễ thấp, đội ngũ sẽ dùng AWS ElastiCache (Redis) để xử lý.
Song để đáp ứng kế hoạch về cắt giảm chi phí hạ tầng của công ty, đội ngũ bắt đầu phân tích và đặt ra mục tiêu đầu tiên của họ chính là cải thiện thời gian ghi dữ liệu vào Redis của các scheduled-jobs trên.
Redis hoạt động theo mô hình client-server (client gửi yêu cầu đến server, server xử lý và trả về kết quả) một cách tuần tự. Với cách tiếp cận đó, một request tốn 100ms để thực thi thì trong 1s có thể xử lý được 10 requests. Vì vậy, để có thể cải thiện hiệu suất xử lý, nhóm đã tận dụng kỹ thuật pipeline của Redis bằng cách gửi một batch requests cùng một lúc, không cần đợi phản hồi của từng request. Với Pipeline, họ có thể giải quyết bài toán về cải thiện throughput cho hệ thống, nhưng cần lưu ý vấn đề về batch size của requests. Sử dụng batch size pipeline càng lớn sẽ gây ra các blocker khác ở phía server cho đến khi request cuối cùng trong batch được thực thi xong vì về lý thuyết Redis là một single-thread server.
Để tìm hiểu chi tiết hơn về kỹ thuật pipeline cũng như kết quả benchmark được cải thiện như thế nào khi họ áp dụng pipeline cho các feature jobs, mời bạn đọc cùng tham khảo bài viết gốc.
How to make difficult technical decisions you and your team won't regret
(by nhij)
Công việc của một kỹ sư phần mềm đòi hỏi chúng ta phải đưa ra các lựa chọn về mặt kĩ thuật hàng ngày. Một số quyết định đơn giản và rõ ràng, nhưng cũng có những quyết định khó khăn, yêu cầu phải suy nghĩ và cân nhắc kỹ lưỡng. Trong bài viết này, tác giả chia sẻ một số kinh nghiệm trong quá trình đưa ra quyết định với các bước như sau:
Liệt kê tất cả các lựa chọn có thể.
Loại bỏ các lựa chọn không phù hợp và ghi chú lại.
Đối với các lựa chọn còn lại, đưa ra các ưu và nhược điểm của mỗi lựa chọn và thảo luận với team.
Nếu bạn vẫn chưa chắc chắn với quyết định của mình, bạn có thể:
Đặt mình vào vị trí của người dùng và đánh giá mỗi lựa chọn dựa trên góc nhìn của người dùng.
Thảo luận riêng với đồng nghiệp ít kinh nghiệm hơn và đồng nghiệp nhiều kinh nghiệm hơn.
Cân nhắc các yếu tố sau: khả năng điều chỉnh và thu hồi quyết định; giá phải trả nếu lựa chọn đó không phù hợp và khả năng mở rộng trong tương lai.
Lessons Learned: The Journey to Real-Time Machine Learning at Instacart
(by dinhnguyen)
Tại Instacart, việc áp dụng mô hình máy học (ML) đóng vai trò quan trọng trong việc nâng cao trải nghiệm người dùng trên nhiều bên liên quan, từ khách hàng, người bán hàng, nhà bán lẻ đến đối tác thương hiệu.
Trong bài viết này, tác giả đã chỉ ra:
Một số hạn chế khi sử dụng batch-oriented ML.
Một vài thách thức và những quyết định quan trọng khi chuyển từ batch đến real-time ML.
Một số bài học từ việc chuyển đổi này.
Một số hạn chế trong các hệ thống batch-oriented ML:
Stale Predictions: Việc dự đoán đã được tính toán trước gây ra trải nghiệm người dùng kém vì chúng cung cấp phản hồi lỗi thời dựa trên sự kiện quá khứ.
Inefficient Resource Usage: Việc tạo dự báo cho tất cả khách hàng hàng ngày dẫn đến lãng phí tài nguyên, vì nhiều khách hàng không tương tác hàng ngày với nền tảng.
Limited Coverage: Tính chất theo batch của quy trình hạn chế khả năng cung cấp dự đoán thời gian thực cho tất cả các tình huống.
Response Lag: Các mô hình ít phản ứng hơn với những thay đổi gần đây do các tính năng thời gian thực
Suboptimal: Chất lượng đầu ra mô hình bị ảnh hưởng bởi độ tươi (freshness) của dữ liệu.
Họ đã áp dụng 2 chuyển đổi quan trọng để kích hoạt real-time ML
Real-time serving: chuyển đổi từ cơ chế tính toán trước kết quả dự đoán (precomputed prediction) sang cơ chế real-time để cải thiện phạm vi bao phủ, tối ưu hóa việc sử dụng tài nguyên cũng như giúp kết quả dự đoán ít bị lạc hậu.
Real-time features: Từ các tính năng batch đến các tính năng real-time để đảm bảo dữ liệu luôn mới và cho phép các mô hình máy học đưa ra được các phán đoán dựa trên các dữ liệu được cập nhật mới nhất có thể.
Chuyển đổi thứ nhất: Từ việc phục vụ dự đoán được tính toán trước đến real-time
Những thách thức bao gồm quản lý độ trễ, đảm bảo tính sẵn có của hệ thống và vượt qua Steep Learning Curve.
Những quyết định quan trọng bao gồm áp dụng một giao diện thống nhất cho kiểm tra và triển khai, và sử dụng RPC framework để giao tiếp giữa các dịch vụ trong Instacart.
Chuyển đổi thứ hai: Phục vụ từ batch features đến real-time features
Những thách thức bao gồm làm việc với các công nghệ streaming phân tán trong những tổ chức khác nhau, đảm bảo những events có tính chất nhất quán và chất lượng và xây dựng những pipeline phức tạp với quy trình phát triển mới.
Những quyết định quan trọng bao gồm triển khai lưu trữ sự kiện tập trung bằng cách sử dụng Kafka và tách biệt event cho lưu trữ và tính toán để tuân thủ nguyên tắc phân tách mối quan tâm, thành lập 1 nhóm làm việc đến từ những team khác nhau.
Bài học từ việc chuyển đổi:
Hạ tầng đóng vai trò quan trọng trong real-time ML.
Việc cải tiến nên đạt được từng bước một.
Áp dụng giải pháp tổng thể và chuyên biệt.
Phát triển hạ tầng song song với phát triển sản phẩm.
Để có thêm thông tin chi tiết hơn, mời bạn đọc tham khảo thêm tại bài viết gốc.
👨💻Góc lập trình
(by ndaadn and phucnh)
Đề ra tuần này: Find the Divisibility Array of a String
Cho một chuỗi word
bao gồm n
số tự nhiên và một số tự nhiên m
.
Trả về kết quả là mảng div
với tính chất như sau:
div[i] = 1
nếu giá trị số học của chuỗiword[0...i]
chia hết chom.
div[i] = 0
nếu ngược lại.
Ví dụ:
Input: word = "998244353"
, m = 3
Output: div = [1,1,0,0,0,1,1,0,0]
Giải thích: có 4 chuỗi con: "9"
, "99"
, "998244"
và "9982443"
thỏa mãn đề bài.
Lời giải tuần trước: Maximize Distance to Closest Person
Gọi K là khoảng cách giữa 2 ghế đã có người ngồi, ta thấy khoảng cách mà đề bài yêu cầu tìm đó là (K + 1) / 2.
Từ đó, ý tưởng để giải bài toán đó là duyệt mảng seats
để tìm tất cả các khoảng K giữa các vị trí đã có người ngồi, tính toán các giá trị (K + 1) / 2 và trả về giá trị lớn nhất tìm được.
Sau đây là cài đặt tham khảo bằng ngôn ngữ Java.
public class Solution {
public int maxDistToClosest(int[] seats) {
int maxDistance = 0;
int distance = 0;
int n = seats.length;
// Trường hợp từ đầu hàng đến ghế đầu tiên có người ngồi
int i = 0;
while (seats[i] == 0) {
distance++;
i++;
}
maxDistance = distance;
// Tìm khoảng cách giữa các ghế trống
while (i < n) {
if (seats[i] == 0) {
distance++;
} else {
maxDistance = Math.max(maxDistance, (distance + 1) / 2);
distance = 0;
}
i++;
}
// Trường hợp từ ghế cuối có người ngồi đến cuối hàng
maxDistance = Math.max(maxDistance, distance);
return maxDistance;
}
}
Độ phức tạp thuật toán của giải thuật là O(N), với N là độ dài hàng ghế đã cho.
Quotes
Learn from yesterday, live for today, hope for tomorrow. The important thing is not to stop questioning.
Albert Einstein
bài Góc lập trình, đề bài bị dịch sai, với nội dung tiếng Việt đó sẽ hiểu hoàn toàn khác, chỉ khi nhìn ví dụ tôi mới cảm thấy nghi ngờ, click vào link tới leetcode thì thấy nội dung tiếng Anh khác hoàn toàn. Không hiểu "thánh" nào "tinh dịch".