-
Trong bộ công cụ devtools chạy trên web của mình có một tool quản lý kết nối PostgreSQL: người dùng dán connection string vào, mình phân tích ra thành từng trường (host, port, database, user, password), hoặc điền các trường rồi sinh ra connection string để mang sang app khác. Nghe thì đơn giản, nhưng có một vấn đề dai dẳng: connection string của Npgsql có nhiều phiên bản, mỗi phiên bản lại lưu theo một kiểu khác nhau — tự chế parser thì không thể “care” hết được. Bài viết này kể cách …
-
Hôm qua bên mình gặp một ca “toang” kinh điển: một khách hàng nặng 600GB dữ liệu, một tuần phát sinh 128k đơn hàng từ sàn Tiktok. Chắc bên đó bán mỹ phẩm và đang chạy sale 8/8 nên lượng đơn tăng đột biến. Hệ quả là queue bị tồn ở Kafka nội bộ, worker xử lý không kịp, message nằm chồng chất trong hàng đợi. Bài viết này là câu chuyện mình vừa xử lý sự cố đó: tại sao message đã vào Kafka rồi thì không thể “lôi ra một phần”, và giải pháp thực tế đã dùng là gì. Để dễ theo dõi, …
-
Làm thế nào để cho phép user tự lập lịch gửi email trong phần mềm — gửi hôm nay, tuần này, tháng này, hoặc lặp lại theo tần suất bất kỳ? Nghe đơn giản, nhưng khi có hàng trăm nghìn user cùng đặt lịch, bài toán “ai sẽ thức dậy đúng giờ để gửi email” không còn đơn giản nữa. Vấn đề với cách làm cũ: cronjob chạy ở tầng worker Trước đây, các cronjob được thiết kế để chạy trực tiếp ở tầng worker — mỗi lịch là một background service được cấu hình tay và cài sẵn trong code. Cách này hoạt …
-
Chào mừng đến với Stories — một nơi tôi lưu lại các blog cá nhân. Về blog này Được dựng bằng Hugo, vì nó đơn giản. Font chữ: Inconsolata, monospace. Không có JavaScript, không tracking, chỉ có nội dung. func main() string { return "Hello World!" } Oke rồi, bạn có thể bắt tay vào đọc các bài viết tiếp theo.