0
Giải thuật lock 1 xử lý trong bấp đồng bộ NodeJS?
Chào mọi người, Đây là bài post đầu tiên nên có gì mọi người góp ý với nha.
- Mình có thiết kế 1 con chatbot telegram để sử dụng.
- Trong có co inline button như hìn sau:
- Nếu nhiều người dùng khác nhau click nhanh quá nó sẽ gửi nhiều request lên hệ thống.
- Mình đã sáng tạo ra giải thuật lock ở 1 thời điểm chỉ 1 xử lý của 1 người.
Issue: Vẫn có trường hợp 2 người cũng nhất 1 thời điểm bị xử lý sai.
Expert: Mong mọi người góp ý về code ạ.
// 1 phân tích callback_data
// Lấy mã đơn
var res = callback_data.match(/^BOOK_ORDER_(.+)$/i);
var code = res[1];
/////// KHOA DON
if (locks[code] == 1) {
return;
}
locks[code] = 1;
/////// END KHOA DON
// lọc tình trạng 2 bạn cùng lấy đơn
// 6 là trạng thái đơn trong box chung
var order = await Order.get(code);
if (order.stateorder_id != 6) {
locks[code] = 0;
return;
}
var shipper = await Shipper.get(nguoichat_id);
if (!shipper) {
locks[code] = 0;
return;
}
// 3 Lưu lần 1 để đơn chuyển sang trạng thái đã gửi, 2 người cùng lấy đơn
var params = {
SET: {
shipper_id : shipper.shipper_id,
state_order_shipper : "Đã gửi",
state_order_shipper_at : moment().format('YYYY-MM-DD HH:mm:ss'),
stateorder_id : 5,
},
WHERE: {
code
}
};
await Model.update('orderbill', params);
locks[code] = 0;
Ý bạn có phải là: nhấn nhanh quá nó sẽ gửi nhiều request lên hệ thống. :-?
Theo mình việc này đâu cần lock lại nhỉ. Request của bạn chắc cũng không đến con số lớn nên server vẫn cân được hết chứ ??.
@huukimit Đã chỉnh lại, cám ơn bạn đã góp ý.
@tuanbacyen Rất nhanh luôn bạn à, 20 người canh nhất nút đó. Dạng cướp quà, zựt quà chẳng hạn.
Vậy theo mình bạn không nên sử lý hàng đợi trên client làm gì vì nó đang theo kiểu dạng asyn. Mình nghĩ thay vao đó bạn tạo 1 stack ở dưới server rồi sử lý lần lượt cái nào đến trước thì làm trước. Và block việc multiple click đến khi người dùng nhận được đơn thì thôi.