Cách đẩy nhanh quá trình phát triển nhân viên hỗ trợ RBM bằng gói thuê bao kéo

Nhân viên hỗ trợ RBM nhận tin nhắn và sự kiện thông qua mối quan hệ xuất bản/đăng ký với Google Cloud Pub/Sub. Khi người dùng trả lời tin nhắn của nhân viên hỗ trợ, nền tảng RBM sẽ phát hành những tin nhắn đó đến một chủ đề duy nhất liên quan đến Pub/Sub mà chỉ nhân viên của bạn mới có quyền truy cập. Nhân viên hỗ trợ của bạn truy cập các tin nhắn và sự kiện đó thông qua một gói đăng ký theo chủ đề dành riêng cho nhân viên hỗ trợ này.

Pub/Sub hỗ trợ hai loại gói thuê bao: pushpull. Với gói thuê bao đẩy, Cloud Pub/Sub sẽ gửi thông báo đến URL webhook mà bạn định cấu hình. Với gói thuê bao kéo, bạn có trách nhiệm viết mã để tạo một trình nghe tin nhắn có thời lượng dài và xác nhận tin nhắn khi nhận được tin nhắn đó.

Cách tiếp cận quen thuộc và phổ biến hơn đối với hầu hết các nhà phát triển là đăng ký đẩy. Nếu bạn đã sử dụng API của bên thứ ba, thì bạn có thể đã làm việc với URL gọi lại/webhook. Mặc dù phương pháp này đơn giản, nhưng yêu cầu phải có URL công khai, buộc nhà phát triển phải triển khai tới máy chủ web công khai mỗi khi họ muốn thử nghiệm thay đổi.

Trong bài viết này, tôi sẽ chỉ cho bạn cách thiết lập gói đăng ký sử dụng dữ liệu để thử nghiệm cục bộ và cách sử dụng gói đăng ký này trong môi trường sản xuất bằng App Engine của Google Cloud.

Định cấu hình Pub/Sub cho gói thuê bao kéo

Nếu bạn chưa định cấu hình Pub/Sub cho đại lý của mình, hãy làm theo hướng dẫn trong Cloud Pub/Sub để tạo gói đăng ký ban đầu.

Sau khi bạn đã tạo đăng ký của mình, việc chuyển từ mô hình đẩy sang mô hình kéo trở nên đơn giản. Chuyển đến Google Cloud Console, sau đó chuyển đến phần Pub/Sub > Gói thuê bao. Nhấp vào trình đơn mục bổ sung bên cạnh gói đăng ký bạn đã tạo cho nhân viên hỗ trợ của mình rồi chọn Chỉnh sửa. Bạn sẽ thấy một màn hình cấu hình tương tự như hình ảnh bên dưới.

Chi tiết đăng ký

Đặt Loại phân phối thành Kéo và nhấp vào Lưu.

Thiết lập trình xử lý đăng ký kéo không đồng bộ

Tiếp theo, bạn cần cập nhật nhân viên hỗ trợ RBM để lấy tin nhắn từ gói thuê bao. Bạn có thể đọc về cách thực hiện việc này bằng nhiều ngôn ngữ lập trình trong phần Kéo không đồng bộ hoặc xem một số mẫu tác nhân RBM, nhiều mẫu trong số đó sử dụng mô hình kéo.

Đoạn mã dưới đây minh hoạ cách thiết lập trình nghe gói thuê bao kéo không đồng bộ trong Node.js:

function initPubsub() {
    let pubsub = new PubSub({
        projectId: REPLACE_WITH_GCP_PROJECT_ID,
        keyFilename: REPLACE_WITH_SERVICE_ACCOUNT_KEY_FILE_LOCATION,
    });

    // references an existing subscription, (e.g. rbm-agent-sub)
    let subscription = pubsub.subscription(PUB_SUB_SUBSCRIPTION_NAME);

    // create an event handler to handle messages
    let messageHandler = (message) => {
        console.log(`Received message ${message.id}:`);
        console.log(`\tData: ${message.data}`);
        console.log(`\tAttributes: ${message.attributes}`);

        let userEvent = JSON.parse(message.data);

        // TODO: process the userEvent to create another RBM message
        // "Ack" (acknowledge receipt of) the message
        message.ack();
    };

    // Listen for new messages
    subscription.on('message', messageHandler);

    return { messageHandler: messageHandler, subscription: subscription };
}

Để thử nghiệm các tác nhân cục bộ, bạn chỉ cần gọi initPubsub khi ứng dụng express của bạn khởi động và bạn sẽ thấy messageHandler phản hồi in trong bảng điều khiển.

Định cấu hình và triển khai cho App Engine của Google

Trong môi trường sản xuất, bạn cần đảm bảo thuê bao luôn khả dụng. Một phương pháp đơn giản là dựa vào công việc định kỳ để khởi chạy lại trình nghe thông báo Pub/Sub theo định kỳ.

Trong App Engine, cron job có thể được sử dụng để lên lịch các tác vụ với các khoảng thời gian khác nhau. Một lệnh cron được định cấu hình bằng một phần mô tả, URL và khoảng thời gian. Trong các ứng dụng Node.js, bạn định cấu hình các tệp này trong tệp cron.yaml. Bạn có thể triển khai tệp này cho App Engine bằng Google Cloud SDK. Bạn có thể đọc về các tùy chọn thiết lập ngôn ngữ khác trong phần Lên lịch công việc bằng cron.yaml.

Vì tác vụ cron cần có URL, bạn cần thêm điểm cuối URL vào bộ định tuyến ứng dụng express để gọi cron. Bộ định tuyến này sẽ gọi phương thức initPubsub từ phần trước để khởi động trình nghe.

router.get('/pubsubCallback', function(req, res, next) {
  let pubsubConfig = initPubsub();

      // Stop listening once the timeout is hit
      setTimeout(() => {
        pubsubConfig.subscription.removeListener('message', pubsubConfig.messageHandler);
      }, CRON_JOB_TIMEOUT * 1000);

  res.status(200).send();
});

Trong lệnh gọi lại, bạn cũng cần xoá trình nghe trước khi thực thi tác vụ đã lên lịch. Ví dụ: nếu lệnh cron chạy mỗi phút, bạn sẽ định cấu hình tham số CRON_JOB_TIMEOUT bằng 60.

Dưới đây là cấu hình tệp cron.yaml để thực thi điểm cuối này mỗi phút.

cron:
- description: "Processing Pub/Sub messages"
  url: /pubsubCallback
  schedule: every 1 mins

Để triển khai các tác vụ cron cho App Engine, hãy chạy lệnh sau:

gcloud app deploy cron.yaml

Sau khi triển khai, App Engine sẽ tự động định cấu hình nhiệm vụ cron và nhiệm vụ này có thể xem được trong App Engine > Cron jobs (Công cụ ứng dụng > Cron jobs) như bên dưới.

Đã định cấu hình lệnh cron

Tóm tắt & TL;DR

Việc sử dụng gói thuê bao kéo giúp bạn thử nghiệm và gỡ lỗi cục bộ, giúp tăng tốc các chu kỳ phát triển và giảm thời gian tạo nhân viên hỗ trợ RBM. Mặc dù mô hình kéo yêu cầu thêm một số cấu hình và mã so với mô hình đẩy, nhưng quá trình thiết lập rất đơn giản và chỉ cần định cấu hình một lần. Công việc Cron là một cách dễ dàng để đảm bảo gói thuê bao kéo luôn có sẵn để xử lý luồng tin nhắn của nhân viên hỗ trợ, đồng thời App Engine giúp thiết lập và bảo trì chi phí rất thấp.

Chúc bạn may mắn và lập trình vui vẻ!