Claude CodeClaude Opus 4.8Code

Sửa lỗi race condition trong hàng đợi job — quy trình debug từng bước

Ẩn danhẨn danh·chia sẻ 4 ngày trước·
176
Học từ cách hỏi

Câu hỏi này hay ở đâu?

1/3
“Job trong hàng đợi thỉnh thoảng chạy hai lần khi tải cao. Mình nghi là race condition ở bước acquire lock. Đọc worker.ts và queue.ts, xác nhận giả thuyết rồi viết test tái hiện trước khi sửa nhé.”

Người hỏi không dán nguyên stack trace rồi hỏi “fix giúp”. Họ mô tả triệu chứng, đưa giả thuyết của mình, và yêu cầu agent kiểm chứng bằng test trước khi vá — biến Claude thành người điều tra chứ không phải máy đoán.

Điểm mạnh của cách đặt câu hỏi
  • Nêu triệu chứng quan sát được (“job chạy hai lần khi tải cao”) kèm điều kiện tái hiện, thay vì chỉ dán lỗi.
  • Đưa giả thuyết riêng để agent xác nhận/bác bỏ — hướng cuộc điều tra thay vì thả trôi.
  • Yêu cầu “viết test tái hiện trước khi sửa” → có bằng chứng thay vì tin lời.
Bạn nên học gì
  • Mô tả triệu chứng + điều kiện tái hiện quan trọng hơn dán nguyên log.
  • Nói ra giả thuyết của bạn: agent sẽ kiểm chứng thay vì đi lạc.
  • Chốt bằng test — “đỏ trước, xanh sau” là cách xác nhận bản vá thật sự hiệu quả.
Hội thoại với Claude Opus 4.8 · Claude Code
Job trong hàng đợi thỉnh thoảng chạy hai lần khi tải cao. Mình nghi là race condition ở bước acquire lock. Đọc worker.ts và queue.ts, xác nhận giả thuyết rồi viết test tái hiện trước khi sửa nhé.

Để tôi đọc hai file bạn nêu và lần theo đường đi của một job từ lúc enqueue tới lúc acquire lock.

1Đọcsrc/queue/worker.ts

Xác nhận giả thuyết của bạn: lock được acquire bằng hai thao tác tách rời (đọc trạng thái rồi ghi), không nguyên tử. Khi hai worker cùng đọc “chưa khoá” trong cùng một khoảnh khắc, cả hai đều tiến hành → job chạy hai lần.

Test tái hiện (đỏ trước)

ts
it("không chạy job hai lần khi hai worker giành cùng lúc", async () => {
  const job = await enqueue({ id: "j1" });
  // hai worker khởi động đồng thời
  const [a, b] = await Promise.all([worker.tick(), worker.tick()]);
  const runs = [a, b].filter((r) => r.ranJobId === "j1");
  expect(runs.length).toBe(1);   // hiện tại = 2 → test đỏ
});

Bản vá: thay cặp đọc-rồi-ghi bằng một lệnh acquire nguyên tử (SET ... NX với TTL). Tôi sẽ áp và chạy lại test cho xanh.

Cùng chủ đề · Code

Hội thoại ngoài khác đáng tham khảo

Xem tất cả
Claude Fable 5

Research toàn bộ về Claude Fable — lợi ích đặc biệt và best practice khi tích hợp

Một câu hỏi “research” mở nhưng có KHUNG rõ ràng: nêu chủ đề, đòi kết luận có chủ đích (lợi ích đặc biệt), và ràng buộc thêm đầu ra (best practice nên dùng). Chính khung này buộc model bật web search, đối chiếu nhiều nguồn chính thức thay vì trả lời từ trí nhớ — và cho ra câu trả lời có cấu trúc.

Ẩn danh214
Claude Sonnet 4.6

Giao Claude tự tổng hợp báo cáo tuần từ nhiều file rồi xuất bản nháp

Thay vì “viết báo cáo tuần”, người hỏi định nghĩa tiêu chí hoàn thành: nguồn nào, độ dài, giọng văn, và “điều gì được coi là xong”. Đây là cách giao việc nền cho một agent — rõ ràng đến mức không cần ngồi canh.

Ẩn danh132
Claude Fable 5

Từ một câu mô tả tới Artifact bấm được — cách brief để lặp nhanh

Người hỏi không đòi “một trang đẹp”. Họ đưa đối tượng người dùng, một hành động chính, ràng buộc thương hiệu, và yêu cầu Artifact bấm được để test — đủ cụ thể để vòng lặp thiết kế cực ngắn.

Ẩn danh118
Claude Opus 4.8

Chọn MCP server đầu tiên nên cài — và vì sao bắt đầu từ Filesystem

Câu hỏi có bối cảnh cá nhân (“mình làm phân tích dữ liệu, chủ yếu đọc file cục bộ”) nên câu trả lời không phải danh sách chung chung mà là một khuyến nghị có lý do, hợp với công việc của người hỏi.

Ẩn danh97
Claude Sonnet 4.6

Giữ Claude bám đúng ý qua một hội thoại dài mười mấy lượt

Người hỏi chủ động quản trị ngữ cảnh: yêu cầu Claude tóm tắt hiểu biết hiện tại trước khi đi tiếp, và đánh dấu rõ mỗi lần đổi hướng. Đây là kỹ thuật giữ mạch mà rất ít người dùng để ý.

Ẩn danh88