Pull aboneliği ile RBM temsilcisi gelişimini hızlandırma

RBM temsilcileri, mesajları ve etkinlikleri Google Cloud Pub/Sub ile yayınlama/abone olma ilişkisi üzerinden alır. Bir kullanıcı temsilcinizin mesajlarına yanıt verdiğinde RBM platformu bu mesajları yalnızca temsilcinizin erişebildiği benzersiz bir Pub/Sub konusunda yayınlar. Temsilciniz bu mesajlara ve etkinliklere benzersiz bir konuya abone olarak erişir.

Pub/Sub iki tür aboneliği destekler: push ve pull. Push aboneliğiyle Cloud Pub/Sub, yapılandırdığınız bir webhook URL'sine mesaj gönderir. Alınan aboneliklerde, uzun süreli bir mesaj dinleyicisi oluşturmak için kod yazmak ve mesajları aldıkça onaylamak sizin sorumluluğunuzdadır.

Çoğu geliştirici için en tanıdık ve popüler yaklaşım, push aboneliğidir. Üçüncü taraf API'leri kullandıysanız muhtemelen geri çağırma/webhook URL'leriyle çalışmışsınızdır. Bu yaklaşım basit olsa da, geliştiricilerin bir değişikliği test etmek istediklerinde herkese açık web sunucularına dağıtım yapmalarını gerektiren bir URL gerektirir.

Bu makalede, yerel test için pull aboneliğinin nasıl ayarlanacağı ve bu aboneliği Google Cloud'un App Engine ile bir üretim ortamında nasıl kullanabileceğiniz gösterilmektedir.

Pull aboneliği için Pub/Sub'ı yapılandırma

Temsilciniz için Pub/Sub'ı henüz yapılandırmadıysanız ilk aboneliğinizi oluşturmak için Cloud Pub/Sub'daki talimatları uygulayın.

Aboneliğinizi oluşturduktan sonra, itme işleminden pull modeline geçmek kolaydır. Google Cloud Console'a, ardından Pub/Sub > Abonelikler bölümüne gidin. Temsilciniz için oluşturduğunuz aboneliğin yanındaki taşma menüsünü tıklayıp Düzenle'yi seçin. Aşağıdaki resme benzer bir yapılandırma ekranı görürsünüz.

Abonelik ayrıntıları

Teslim Türü'nü Pull olarak ayarlayın ve Kaydet'i tıklayın.

Eşzamansız pull aboneliği işleyicisi oluşturma

Ardından, abonelikten mesaj almak için RBM temsilcinizi güncellemeniz gerekir. Eşzamansız çekilme bölümünde bunu çeşitli programlama dilleriyle nasıl yapacağınızı öğrenebilir veya çoğunda pull modelinin kullanıldığı RBM aracısı örneklerinden bazılarına göz atabilirsiniz.

Aşağıdaki kod, Node.js'de eşzamansız bir pull aboneliği dinleyicisi oluşturmayı gösterir:

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 };
}

Temsilcileri yerel olarak test etmek için ekspres uygulamanız başladığında initPubsub numaralı telefonu aramanız yeterlidir. Konsolunuzda messageHandler yazdırma yanıtlarını görürsünüz.

Google'ın App Engine'ini yapılandırma ve dağıtma

Üretim ortamında aboneliğin her zaman kullanılabilir olduğundan emin olmanız gerekir. Basit bir yaklaşım, Pub/Sub mesaj dinleyicisini düzenli olarak yeniden başlatmak için bir cron işi kullanmaktır.

App Engine'de cron işleri, farklı aralıklara sahip görevleri planlamak için kullanılabilir. Bir cron işi açıklama, URL ve aralıkla yapılandırılır. Node.js uygulamalarında, bunları bir cron.yaml dosyasında yapılandırırsınız. Bu dosyayı Google Cloud SDK'yı kullanarak App Engine'e dağıtabilirsiniz. cron.yaml ile işleri planlama bölümünde diğer dil yapılandırma ayarları hakkında bilgi edinebilirsiniz.

Cron görevi bir URL'ye ihtiyaç duyduğundan cron tarafından çağrılması için ekspres uygulama yönlendiricisine bir URL uç noktası eklemeniz gerekir. Bu sayede dinleyiciyi başlatmak için önceki bölümden initPubsub yöntemi çağrılır.

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();
});

Geri çağırma içinde, planlanan görev tekrar çalıştırılmadan önce dinleyiciyi kaldırmanız gerekir. Örneğin, cron işi her dakika çalışıyorsa CRON_JOB_TIMEOUT parametresini 60 değerine eşit olacak şekilde yapılandırırsınız.

Bu uç noktayı her dakika yürütmek için cron.yaml dosya yapılandırması aşağıdadır.

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

Cron görevlerini App Engine'e dağıtmak için aşağıdaki komutu çalıştırın:

gcloud app deploy cron.yaml

Dağıtımdan sonra App Engine, cron görevini otomatik olarak yapılandırır ve görev, aşağıda gösterildiği gibi App Engine > Cron işleri altında görüntülenebilir.

Yapılandırılmış cron işi

Özet ve TL

Pull aboneliği'ni kullanmak, yerel olarak test etmenize ve hata ayıklamanıza olanak tanır. Bu sayede geliştirme döngülerini hızlandırabilir ve RBM temsilcileri oluşturmak için gereken süreyi azaltabilirsiniz. Pull modeli, push modeline kıyasla bazı ek yapılandırmalar ve kodlar gerektirse de kurulum basittir ve yalnızca bir kez yapılandırılması gerekir. Cron işleri, temsilcinizin mesaj akışını yönetmek için pull aboneliğinizin her zaman mevcut olduğundan emin olmanın kolay bir yoludur. App Engine, kurulum ve bakım süreçlerinin çok düşük maliyetli olmasını sağlar.

İyi şanslar ve mutlu kodlamalar!