Asked Feb 13th, 7:51 AM 81 0 0
  • 81 0 0
0

Giải thuật lock 1 xử lý trong bấp đồng bộ NodeJS?

Share
  • 81 0 0

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.

  1. Mình có thiết kế 1 con chatbot telegram để sử dụng.
  2. Trong có co inline button như hìn sau:
  3. 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.
  4. 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;
Nguyễn Hữu Kim @huukimit
Feb 13th, 8:08 AM

nhất nhanh quá nó sẽ gửi nhiều request lên hệ thống.

Ý bạn có phải là: nhấn nhanh quá nó sẽ gửi nhiều request lên hệ thống. :-?

0
| Reply
Share
Phạm Anh Tuấn @tuanbacyen
Feb 13th, 8:18 AM

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ứ ??.

0
| Reply
Share
Đạt Đỗ @ddthanhdat
Feb 13th, 9:01 AM

@huukimit Đã chỉnh lại, cám ơn bạn đã góp ý.

0
| Reply
Share
Đạt Đỗ @ddthanhdat
Feb 13th, 9:02 AM

@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.

0
| Reply
Share
Phạm Anh Tuấn @tuanbacyen
Feb 14th, 1:51 AM

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. 😃

0
| Reply
Share