دریافت یک رویداد از Cloud Pub/Sub در SAP با استفاده از ABAP SDK برای Google Cloud

1. مقدمه

این لبه کد شما را از طریق دریافت جزئیات رویداد از یک موضوع Google Cloud Pub/Sub با استفاده از ABAP SDK برای Google Cloud راهنمایی می‌کند. ما از خدمات Google Cloud زیر استفاده خواهیم کرد:

  • Cloud Pub/Sub
  • پوسته ابری

پیش نیازها

gcloud pubsub topics create PUBSUB_DEMO_TOPIC

چیزی که خواهی ساخت

شما موارد زیر را ایجاد خواهید کرد:

  • یک حساب سرویس با مجوزهای «مشترک» برای تعامل با Pub/Sub API.
  • یک برنامه ABAP برای دریافت و تایید پیام ها از موضوع Pub/Sub شما.

2. الزامات

  • مرورگرهایی مانند Chrome یا Firefox .
  • یک پروژه Google Cloud با فعال کردن صورت‌حساب یا ایجاد یک حساب آزمایشی رایگان 90 روزه برای Google Cloud Platform.
  • SAP GUI (ویندوز یا جاوا) در سیستم شما نصب شده است. اگر SAP GUI قبلاً روی لپ‌تاپ شما نصب شده است، با استفاده از آدرس IP خارجی VM به عنوان IP سرور برنامه، به SAP متصل شوید. اگر در مک هستید، می توانید SAP GUI برای جاوا را نیز در این لینک نصب کنید.

3. قبل از شروع

6757b2fb50ddcc2d.png

  • دستورات زیر را برای احراز هویت برای حساب خود اجرا کنید و پروژه پیش فرض را روی abap-sdk-poc تنظیم کنید. Zone us-west4-b به عنوان مثال استفاده می شود. در صورت نیاز، لطفاً پروژه و منطقه را در دستورات زیر بر اساس اولویت خود تغییر دهید.
gcloud auth login
gcloud config set project abap-sdk-poc
gcloud config set compute/zone us-west4-b

4. یک حساب سرویس برای دسترسی Pub/Sub ایجاد کنید

استفاده از یک حساب سرویس با نقش Subscriber امن ترین راه برای برنامه ABAP شما برای دریافت پیام از Pub/Sub است. این نقش مجوزها را فقط به بازیابی پیام محدود می کند و از آسیب پذیری های امنیتی احتمالی جلوگیری می کند.

حساب سرویس ایجاد کنید

برای ایجاد یک حساب کاربری با نقش مورد نیاز، مراحل زیر را انجام دهید:

  1. دستور زیر را در ترمینال Cloud Shell اجرا کنید:
gcloud iam service-accounts \
create abap-sdk-pubsub-subscriber \
--display-name="Service Account for Pub/Sub Subscriber"
  1. اکنون نقش های مورد نیاز را به حساب سرویس ایجاد شده در مرحله بالا اضافه کنید:
gcloud projects add-iam-policy-binding abap-sdk-poc \
--member='serviceAccount:abap-sdk-pubsub-subscriber@abap-sdk-poc.iam.gserviceaccount.com' \
--role='roles/pubsub.subscriber'

دستور بالا از abap-sdk-poc به عنوان یک مکان نگهدار برای پروژه Google Cloud استفاده می کند. abap-sdk-poc با شناسه پروژه خود جایگزین کنید.

  1. برای تأیید، نقش اضافه شده است، به صفحه IAM بروید. حساب سرویسی که ایجاد کردید باید همراه با نقشی که به آن اختصاص داده شده است، فهرست شود.

5. درک اشتراک های کششی

برای اشتراک کششی، سیستم SAP شما به عنوان مشتری مشترک عمل می‌کند و درخواست‌هایی را به سرور Pub/Sub برای بازیابی پیام‌ها آغاز می‌کند. مشتری مشترک از REST Pull API استفاده می کند.

روش های کلیدی API

Google Cloud Pub/Sub API

  • pull: درخواستی را برای واکشی پیام ها آغاز می کند.
  • تصدیق: به Pub/Sub سیگنال می دهد که یک پیام با موفقیت پردازش شده است.

ABAP SDK برای Google Cloud Equivalents

  • /GOOG/CL_PUBSUB_V1 -> PULL_SUBSCRIPTIONS
  • /GOOG/CL_PUBSUB_V1 -> ACKNOWLEDGE_SUBSCRIPTIONS

جریان پیام ها برای اشتراک کششی

تصویر زیر گردش کار بین یک مشتری مشترک و یک اشتراک کششی را نشان می دهد.

f0fc44265192f348.png

  1. درخواست کشش: سیستم SAP شما (مشترک) از روش کشش برای درخواست پیام از سرور Pub/Sub استفاده می کند.
  2. Pull Response : سرور Pub/Sub با پیام‌های صفر یا بیشتر و شناسه‌های تایید پاسخ می‌دهد. پاسخ با پیام صفر یا با خطا لزوماً نشان دهنده این نیست که هیچ پیامی برای دریافت وجود ندارد. این پاسخ همان PullResponse است که در تصویر نشان داده شده است.
  3. Acknowledgement: پس از پردازش یک پیام، سیستم SAP شما از روش تایید همراه با شناسه تایید دریافتی استفاده می کند. این از Pub/Sub از ارسال مجدد پیام جلوگیری می کند.

6. راه اندازی اشتراک و ارسال پیام

یک اشتراک کششی ایجاد کنید

  • این دستور gcloud را اجرا کنید تا یک اشتراک کششی به نام PUBSUB_DEMO_SUBSCRIPTION ایجاد کنید که پیام هایی را از PUBSUB_DEMO_TOPIC دریافت می کند:
gcloud pubsub subscriptions create PUBSUB_DEMO_SUBSCRIPTION \
--topic=PUBSUB_DEMO_TOPIC

انتشار پیام ها

یکی از این روش ها را برای ارسال پیام به PUBSUB_DEMO_TOPIC انتخاب کنید:

  • از برنامه خود استفاده مجدد کنید: اگر برنامه را از یک کد آزمایشگاه قبلی برای انتشار دارید، از آن استفاده کنید.
  • انتشار مستقیم : برای آزمایش سریع، یکی از گزینه های زیر را امتحان کنید:
  • Cloud Console: مستقیماً در Google Cloud Console منتشر کنید. برای جزئیات بیشتر، به مستندات Pub/Sub مراجعه کنید.
  • دستور gcloud: دستور زیر را اجرا کنید:
gcloud pubsub topics publish PUBSUB_DEMO_TOPIC \
--message='{"eventType":"SalesOrderChanged","source":"SAPDEV100","eventTime":"20240207183048","SalesOrder":1000924}'

7. پیکربندی کلید مشتری را ایجاد کنید

اکنون که پیش نیازها را در سمت Google Cloud تنظیم کرده‌اید، می‌توانیم با پیکربندی در سمت SAP پیش برویم.

برای احراز هویت و پیکربندی مرتبط با اتصال، ABAP SDK برای Google Cloud از جداول /GOOG/CLIENT_KEY و /GOOG/SERVIC_MAP.

برای حفظ پیکربندی در جدول /GOOG/CLIENT_KEY جدول، مراحل زیر را انجام دهید:

  1. در SAP GUI، کد تراکنش SPRO را وارد کنید.
  2. روی SAP Reference IMG کلیک کنید.
  3. روی ABAP SDK برای Google Cloud > Basic Settings > Configure Client Key کلیک کنید.

25871e639293b9ee.png

  1. مقادیر زیر را در برابر فیلدها حفظ کنید. تمام فیلدهای دیگر را خالی بگذارید.

میدان

ارزش

نام کلید Google Cloud

PUBSUB_SUBSCRIBER

نام حساب سرویس Google Cloud

abap-sdk-pubsub-subscriber@abap-sdk-poc.iam.gserviceaccount.com

Google Cloud Scope

https://www.googleapis.com/auth/cloud-platform

شناسه پروژه

abap-sdk-poc

کلاس مجوز

/GOOG/CL_AUTH_GOOGLE

8. یک گزارش ABAP برای دریافت پیام‌ها از Google Cloud Pub/Sub بسازید

  1. وارد سیستم SAP خود شوید.
  2. به کد تراکنش SE38 بروید و یک گزارش برنامه با نام ZDEMO_RECEIVE_CPS_EVENTS.
  3. در پاپ آپی که باز می شود، جزئیات را مانند شکل زیر ارائه کنید و روی ذخیره کلیک کنید.

7c739236bedb5bf1.png

  1. در پاپ آپ بعدی، یا Local Object را انتخاب کنید یا یک نام بسته را در صورت لزوم وارد کنید.
  2. در ویرایشگر ABAP کد زیر را اضافه کنید:
REPORT zdemo_receive_cps_events.

TYPES: BEGIN OF ty_event_message,
         event_time  TYPE timestamp,
         event_type  TYPE char30,
         source      TYPE char30,
         sales_order TYPE vbeln,
       END OF ty_event_message.

DATA: ls_input     TYPE /goog/cl_pubsub_v1=>ty_026,
      ls_input_ack TYPE /goog/cl_pubsub_v1=>ty_001,
      ls_event_msg TYPE ty_event_message.

TRY.

    "Open HTTP Connection
    DATA(lo_client) = NEW /goog/cl_pubsub_v1( iv_key_name = 'PUBSUB_SUBSCRIBER' ).

    "Populate relevant parameters
    " Derive project id from the client object
    DATA(lv_p_projects_id) = CONV string( lo_client->gv_project_id ).
    " Name of the subscription from where we want to pull data
    DATA(lv_p_subscriptions_id) = CONV string( 'PUBSUB_DEMO_SUBSCRIPTION' ).
    " Max number of messages that will be received in 1 API call
    ls_input-max_messages = 1.

    "Call API method: pubsub.projects.subscriptions.pull
    lo_client->pull_subscriptions(
      EXPORTING
        iv_p_projects_id      = lv_p_projects_id
        iv_p_subscriptions_id = lv_p_subscriptions_id
        is_input              = ls_input
      IMPORTING
        es_output             = DATA(ls_output)
        ev_ret_code           = DATA(lv_ret_code)
        ev_err_text           = DATA(lv_err_text)
        es_err_resp           = DATA(ls_err_resp) ).

    IF lo_client->is_success( lv_ret_code ).
      DATA(ls_received_msg) = VALUE #( ls_output-received_messages[ 1 ] OPTIONAL ).
      IF ls_received_msg IS NOT INITIAL.
        "Messages published to Pub/Sub should be base-64 encoded, hence in order to get the exact message, we need to decode the data field.
        "However, attributes published to Pub/Sub should be accessible as data references.
        DATA(lv_msg) = |{ cl_http_utility=>decode_base64( encoded = ls_received_msg-message-data ) }|.
        /ui2/cl_json=>deserialize( EXPORTING json          = lv_msg
                                             pretty_name   = /ui2/cl_json=>pretty_mode-extended
                                   CHANGING  data          = ls_event_msg ).

        cl_demo_output=>new( )->begin_section( |Receive Events from Cloud Pubsub using ABAP SDK for Google Cloud|
        )->write_text( |The below event was successfully received with message ID { ls_received_msg-message-MESSAGE_ID }|
        )->write_data( ls_event_msg
        )->end_section(
        )->display( ).

        ls_input_ack-ack_ids = VALUE #( ( ls_received_msg-ack_id ) ).

        "Call API method: pubsub.projects.subscriptions.acknowledge
        "Acknowledge the messages so it is not pulled again.
        lo_client->acknowledge_subscriptions(
          EXPORTING
            iv_p_projects_id      = lv_p_projects_id
            iv_p_subscriptions_id = lv_p_subscriptions_id
            is_input              = ls_input_ack
          IMPORTING
            es_output             = DATA(ls_output_ack)
            ev_ret_code           = lv_ret_code
            ev_err_text           = lv_err_text
            es_err_resp           = ls_err_resp ).

        IF lo_client->is_success( lv_ret_code ).
          MESSAGE lv_msg TYPE 'S'.
        ELSE.
          MESSAGE lv_err_text TYPE 'E'.
        ENDIF.
      ELSE.
        MESSAGE 'No Messages were received!' TYPE 'S'.
      ENDIF.
    ELSE.
      MESSAGE lv_err_text TYPE 'E'.
    ENDIF.

    "Close HTTP Connection
    lo_client->close( ).

  CATCH /goog/cx_sdk INTO DATA(lo_exception).
    MESSAGE lo_exception->get_text( ) TYPE 'E'.
ENDTRY.
  1. گزارش را ذخیره و فعال کنید.
  2. گزارش را اجرا کنید (F8).

در اجرای موفقیت آمیز باید خروجی گزارش را مطابق شکل زیر مشاهده کنید:

5b76e886ef79d0ba.png

9. کد مشترک ABAP Pub/Sub توضیح داده شده است

در اصل، این برنامه ABAP با Google Cloud Pub/Sub به عنوان مشترک پیام ادغام می شود. یک اشتراک مشخص شده را برای پیام‌های جدید در صورت تقاضا بررسی می‌کند، آنها را پردازش می‌کند و سپس دریافت آنها را تأیید می‌کند تا از تحویل مجدد در آینده جلوگیری کند.

این برنامه فعالیت های زیر را انجام خواهد داد:

تجزیه گام به گام

برقراری ارتباط:

  • با استفاده از کلاس /GOOG/CL_PUBSUB_V1 یک اتصال HTTP به سرویس Google Cloud Pub/Sub برقرار می کند.

تنظیم پارامترها:

  • شناسه پروژه : شناسه پروژه مربوطه را که اشتراک Pub/Sub در آن قرار دارد استخراج می کند.
  • نام اشتراک: نام اشتراکی را مشخص می‌کند که از آن پیام‌ها گرفته می‌شود ( PUBSUB_DEMO_SUBSCRIPTION ).
  • محدودیت پیام : حداکثر تعداد پیام‌ها را برای بازیابی در یک تماس API تنظیم می‌کند (در این مورد، 1).

واکشی پیام ها:

  • روش pull_subscriptions را برای بازیابی پیام ها از اشتراک مشخص شده فراخوانی می کند.

فرآیند پیام های دریافتی:

  • اگر پیام‌هایی وجود داشته باشد، برنامه داده‌ها را رمزگشایی می‌کند، محتوا را ثبت می‌کند و یک تأییدیه ارسال می‌کند.

تایید پیام ها:

  • متد acknowledge_subscriptions را فراخوانی می‌کند تا یک تأییدیه به Pub/Sub ارسال کند که نشان‌دهنده دریافت موفقیت‌آمیز پیام‌ها است. این از تحویل مجدد آنها جلوگیری می کند.

مدیریت موفقیت / خطاها:

  • پیام های موفقیت آمیز را در صورت دریافت و تایید پیام ها ارائه می دهد و پیام های خطا را برای سناریوهای مختلف خرابی (بدون دریافت پیام، خطاهای API و غیره) نمایش می دهد.

بستن اتصال:

  • اتصال HTTP به سرویس Pub/Sub را می‌بندد.

10. تبریک می گویم

کار بسیار عالی برای تکمیل Codelab "دریافت یک رویداد از Cloud Pub/Sub با استفاده از ABAP SDK for Google Cloud"!

شما با موفقیت پلی بین ABAP و Google Cloud Pub/Sub ایجاد کردید! تکمیل آزمایشگاه کد شما درک کاملی از پیام‌های رویداد محور و نحوه استفاده از ABAP SDK برای Google Cloud برای ادغام با سرویس‌های Google Cloud را نشان می‌دهد. آفرین!

سطح جدیدی از ادغام بین ABAP و Google Cloud Services را باز کرده اید. افق های خود را با این گزینه های هیجان انگیز گسترش دهید:

  • استفاده از Translation API با ABAP SDK برای Google Cloud
  • یک شی بزرگ را با استفاده از تکه کردن در یک سطل فضای ذخیره سازی ابری آپلود کنید
  • بازیابی اعتبارنامه/اسرار از Secret Manager با ABAP SDK برای Google Cloud
  • Vertex AI test-bison را از ABAP فراخوانی کنید
  • با BigQuery ML از ABAP تماس بگیرید

11. پاکسازی کنید

اگر نمی‌خواهید با کدهای اضافی مرتبط با ABAP SDK برای Google Cloud ادامه دهید، لطفاً به پاکسازی ادامه دهید.

پروژه را حذف کنید

  • پروژه Google Cloud را حذف کنید:
gcloud projects delete abap-sdk-poc

منابع فردی را حذف کنید

  1. نمونه محاسباتی را حذف کنید:
gcloud compute instances delete abap-trial-docker
  1. قوانین فایروال را حذف کنید:
gcloud compute firewall-rules delete sapmachine
  1. حساب سرویس را حذف کنید:
gcloud iam service-accounts delete \
    abap-sdk-pubsub-subscriber@abap-sdk-poc.iam.gserviceaccount.com