Tại sao lại lấy giờ ở quá khứ nếu không set giờ trên server lùi lại. Giờ nên đẩy bài toán về tương lai để xử lý.
Mình thấy sao lại đẩy vấn đề đi xa quá về quá khứ làm gì, càng đọc càng rối rắm thế nhỉ? Để mình diễn vầy bạn xem thử có đúng không nhé.
Giả sử khách hàng (có các dòng) đặt hàng vào lúc:
7:02:14
7:03:20
7:04:01
của ngày 28/07/2021 nhé, ta sẽ đổi sang timestamp theo Unix Epoch (tính theo giây chứ không mili giây làm gì) lần lượt là:
1627430534
1627430600
1627430641
Như vậy, các đơn hàng sẽ “tự hủy” vào thời điểm:
7:32:14 => 1627430534 + 30p = 1627432334 (a)
7:33:20 => 1627430600 + 30p = 1627432400 (b)
7:34:01 => 1627430641 + 30p = 1627432441 ( c )
Vào phút thứ 25 theo block 30 phút ta chơi trò “đe dọa hủy đơn hàng”, tức là kém 5 phút so với thời điểm “xử trảm”, ta sẽ gửi notify, vậy timestamp thời điểm đó là:
1627430534 + 25p => tự tính (1)
1627430600 + 25p => tự tính (2)
1627430641 + 25p => tự tính (3)
(Không cần bàn gì về quá khứ, muốn thử nghiệm thì cho phút ngắn lại tránh ngồi đợi cả tháng :D)
Ta chạy cron trên server và đổi nó ra timestamp nó lệch giờ so với 30p, 25p cọc cạch về giây so với đơn hàng chẳng thành vấn đề vì ở đây ta không nhân chia cần bội số làm gì nên nó chệch về giây không ảnh hưởng nhiều lắm, chỉ cần đúng đến phút xem như OK.
Vậy thì khi chạy cron, ta lấy current timestamp lúc ấy rồi so sánh timestamp xem nó có lớn hơn hoặc bằng timestamp ở các ví dụ (1), (2), (3) kể trên hay chưa, nếu vừa lớn hơn 1 phát thì gửi notify ngay, và tìm ngay cái thằng timestamp nhỏ hơn có trong CSDL đánh dấu xóa (hoặc không làm gì cả, vì cron sẽ tự làm vào lần đúng thời điểm 30p)
Vào thời điểm 30p (tức cộng thêm 5 phút từ lúc gửi notify ở phút 25) thì cron chạy, nó có timestamp = N, nói cách khác, khi chạy cron mà thấy có dòng đơn hàng hàng nào nhỏ hơn timestamp ở (a), (b), © thì xóa nó đi.
Nếu hệ quản trị cơ sở dữ liệu DBMS có hỗ trợ trigger và/ hoặc stored procedure thì dùng cái đó cho nhanh thay vì phải viết shell script hoặc phải chạy phần mềm tiện ích be bé do ta viết để xóa.
Không rõ có phải chủ topic muốn giải bài toán như mình vừa diễn không?
Ý của bạn Thư viện La biblioteca @library thế nào?