مشغِّلات النشر/الاشتراك


Pub/Sub من Google Cloud هو حافلة رسائل موزّعة على مستوى العالم يتم توسيع نطاقها تلقائيًا حسب الحاجة. يمكنك إنشاء دالة تعالج أحداث Pub/Sub باستخدام functions.pubsub.

بدء دالة "النشر/الاشتراك"

يمكنك بدء وظيفة عند إرسال رسالة Pub/Sub جديدة إلى موضوع معيّن. يجب تحديد اسم Pub/Sub الموضوع الذي تريد بدء وظيفتك من خلاله، وضبط الحدث ضمن معالج الحدث onPublish():

exports.helloPubSub = functions.pubsub.topic('topic-name').onPublish((message) => {
  // ...
});

الوصول إلى الحمولة في رسالة Pub/Sub‏ {:#access-pub/sub}

يمكن الوصول إلى الحمولة لرسالة Pub/Sub من العنصر Message الذي يتم إرجاعه إلى دالتك. بالنسبة إلى الرسائل التي تحتوي على تنسيق JSON في Pub/Sub الرسالة، تحتوي حزمة SDK الخاصة بتطبيق Firebase على Cloud Functions خاصية مساعدة لفك ترميز الرسالة. على سبيل المثال، في ما يلي رسالة تم نشرها باستخدام حمولة JSON بسيطة:

gcloud pubsub topics publish topic-name --message '{"name":"Xenia"}'

يمكنك الوصول إلى حِمل بيانات JSON على النحو التالي من خلال السمة json:

  // Get the `name` attribute of the PubSub message JSON body.
  let name = null;
  try {
    name = message.json.name;
  } catch (e) {
    functions.logger.error('PubSub message was not JSON', e);
  }

يتم تضمين الحمولات الأخرى غير JSON في رسالة Pub/Sub على شكل سلاسل مُشفَّرة بترميز base64 في عنصر الرسالة. لقراءة رسالة مثل الرسالة التالية، يجب فك ترميز السلسلة المشفّرة بترميز base64 كما هو موضّح:

gcloud pubsub topics publish topic-name --message 'MyMessage'

// Decode the PubSub Message body.
const messageBody = message.data ? Buffer.from(message.data, 'base64').toString() : null;

الوصول إلى سمات الرسالة {:#access-message}

يمكن إرسال رسالة Pub/Sub مع سمات البيانات التي تم ضبطها في الأمر publish. على سبيل المثال، يمكنك نشر رسالة تتضمّن سمة name:

gcloud pubsub topics publish topic-name --attribute name=Xenia

يمكنك قراءة هذه السمات من Message.attributes:

// Get the `name` attribute of the message.
const name = message.attributes.name;

قد تلاحظ أنّ بعض البيانات الأساسية، مثل رقم تعريف الرسالة أو وقت نشر الرسالة، لا تتوفّر في Message.attributes. لحلّ هذه المشكلة، يمكنك الوصول إلى هذه التفاصيل في EventContext للحدث المشغِّل. على سبيل المثال:

exports.myFunction = functions.pubsub.topic('topic1').onPublish((message, context) => {
    console.log('The function was triggered at ', context.timestamp);
    console.log('The unique ID for the event is', context.eventId);
});