Odbieranie zdarzenia z Cloud Pub/Sub w SAP za pomocą pakietu SDK ABAP dla Google Cloud

1. Wprowadzenie

Ten przewodnik przeprowadzi Cię przez proces odbierania szczegółów zdarzeń z tematu Google Cloud Pub/Sub za pomocą ABAP SDK for Google Cloud. Będziemy korzystać z tych usług Google Cloud:

  • Cloud Pub/Sub
  • Cloud Shell

Wymagania wstępne

gcloud pubsub topics create PUBSUB_DEMO_TOPIC

Co utworzysz

Utworzysz:

  • Konto usługi z uprawnieniami „Subskrybujący” do interakcji z interfejsem Pub/Sub API.
  • Program ABAP do odbierania i potwierdzania wiadomości z tematu Pub/Sub.

2. Wymagania

  • przeglądarki, np. Chrome lub Firefox;
  • Projekt Google Cloud z włączonym rozliczeniem lub utwórz 90-dniowe konto próbne w Google Cloud Platform.
  • SAP GUI (Windows lub Java) zainstalowany w systemie. Jeśli SAP GUI jest już zainstalowany na laptopie, połącz się z SAP, używając zewnętrznego adresu IP maszyny wirtualnej jako adresu IP serwera aplikacji. Jeśli korzystasz z komputera Mac, możesz też zainstalować interfejs SAP GUI dla Javy, który jest dostępny pod tym linkiem.

3. Zanim zaczniesz

6757b2fb50ddcc2d.png

  • Uruchom te polecenia, aby uwierzytelnić się na koncie i ustawić domyślny projekt na abap-sdk-poc. Jako przykładu używamy strefy us-west4-b. W razie potrzeby zmień projekt i strefę w tych poleceniach zgodnie ze swoimi preferencjami.
gcloud auth login
gcloud config set project abap-sdk-poc
gcloud config set compute/zone us-west4-b

4. Tworzenie konta usługi na potrzeby dostępu do Pub/Sub

Używanie konta usługi z rolą Subscriber to najbezpieczniejszy sposób odbierania wiadomości z Pub/Sub przez program ABAP. Ta rola ogranicza uprawnienia tylko do pobierania wiadomości, co zapobiega potencjalnym lukom w zabezpieczeniach.

Tworzenie konta usługi

Aby utworzyć konto usługi z wymaganą rolą, wykonaj te czynności:

  1. Uruchom w terminalu Cloud Shell to polecenie:
gcloud iam service-accounts \
create abap-sdk-pubsub-subscriber \
--display-name="Service Account for Pub/Sub Subscriber"
  1. Teraz dodaj wymagane role do konta usługi utworzonego w powyższym kroku:
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'

W powyższym poleceniu abap-sdk-poc jest symbolem zastępczym projektu Google Cloud. Zastąp abap-sdk-poc identyfikatorem projektu.

  1. Aby sprawdzić, czy rola została dodana, otwórz stronę IAM. Utworzone konto usługi powinno być widoczne wraz z przypisaną do niego rolą.

5. Informacje o subskrypcjach pull

W przypadku subskrypcji pull system SAP działa jako aplikacja subskrybująca i inicjuje żądania do serwera Pub/Sub w celu pobrania wiadomości. Aplikacja subskrybująca używa interfejsu REST Pull API.

Kluczowe metody interfejsu API

Google Cloud Pub/Sub API

  • pull: inicjuje prośbę o pobranie wiadomości.
  • acknowledge: wysyła do Pub/Sub sygnał, że wiadomość została przetworzona.

Odpowiedniki w ABAP SDK for Google Cloud

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

Przepływ wiadomości w przypadku subskrypcji typu pull

Obraz poniżej przedstawia proces wymiany informacji między aplikacją subskrybującą a subskrypcją typu pull.

f0fc44265192f348.png

  1. Żądanie pull: system SAP (subskrybent) używa metody pull do żądania wiadomości od serwera Pub/Sub.
  2. Pull Response: serwer Pub/Sub odpowiada zerem lub większą liczbą wiadomości i identyfikatorów potwierdzenia. Odpowiedź z zerową liczbą wiadomości lub z błędem nie musi oznaczać, że nie ma wiadomości do odebrania. Ta odpowiedź to PullResponse, jak pokazano na obrazie.
  3. Potwierdzenie: po przetworzeniu wiadomości system SAP używa metody potwierdzenia wraz z otrzymanym identyfikatorem potwierdzenia. Zapobiega to ponownemu dostarczeniu wiadomości przez Pub/Sub.

6. Konfigurowanie subskrypcji i wysyłanie wiadomości

Tworzenie subskrypcji pull

  • Aby utworzyć subskrypcję typu pull o nazwie PUBSUB_DEMO_SUBSCRIPTION, która będzie odbierać wiadomości z PUBSUB_DEMO_TOPIC, wykonaj to polecenie gcloud:
gcloud pubsub subscriptions create PUBSUB_DEMO_SUBSCRIPTION \
--topic=PUBSUB_DEMO_TOPIC

Publikowanie wiadomości

Aby wysłać wiadomości do PUBSUB_DEMO_TOPIC, wybierz jedną z tych metod:

  • Ponowne użycie programu: jeśli masz program z poprzednich warsztatów dotyczących publikowania, użyj go.
  • Bezpośrednie publikowanie: aby szybko przeprowadzić test, wypróbuj jedną z tych opcji:
  • Cloud Console: publikuj bezpośrednio w konsoli Google Cloud. Więcej informacji znajdziesz w dokumentacji Pub/Sub.
  • Polecenie gcloud: uruchom to polecenie:
gcloud pubsub topics publish PUBSUB_DEMO_TOPIC \
--message='{"eventType":"SalesOrderChanged","source":"SAPDEV100","eventTime":"20240207183048","SalesOrder":1000924}'

7. Tworzenie konfiguracji klucza klienta

Po skonfigurowaniu wymagań wstępnych po stronie Google Cloud możemy przejść do konfiguracji po stronie SAP.

W przypadku konfiguracji związanej z uwierzytelnianiem i łącznością pakiet ABAP SDK for Google Cloud korzysta z tabel /GOOG/CLIENT_KEY i /GOOG/SERVIC_MAP..

Aby zachować konfigurację w tabeli /GOOG/CLIENT_KEY, wykonaj te czynności:

  1. W SAP GUI wpisz kod transakcji SPRO.
  2. Kliknij SAP Reference IMG (SAP Reference IMG).
  3. Kliknij ABAP SDK for Google Cloud > Ustawienia podstawowe > Skonfiguruj klucz klienta.

25871e639293b9ee.png

  1. Wpisz w polach te wartości: Pozostaw wszystkie pozostałe pola puste.

Pole

Wartość

Nazwa klucza Google Cloud

PUBSUB_SUBSCRIBER

Nazwa konta usługi Google Cloud

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

Zakres Google Cloud

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

Identyfikator projektu

abap-sdk-poc

Klasa autoryzacji

/GOOG/CL_AUTH_GOOGLE

8. Tworzenie raportu ABAP do odbierania wiadomości z Google Cloud Pub/Sub

  1. Zaloguj się w systemie SAP.
  2. Przejdź do kodu transakcji SE38 i utwórz program raportowania o nazwie ZDEMO_RECEIVE_CPS_EVENTS..
  3. W wyświetlonym okienku podaj szczegóły zgodnie z poniższymi instrukcjami i kliknij Zapisz.

7c739236bedb5bf1.png

  1. W następnym wyskakującym okienku wybierz Local Object (Obiekt lokalny) lub podaj nazwę pakietu.
  2. W edytorze ABAP dodaj ten kod:
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. Zapisz i aktywuj raport.
  2. Wykonaj raport (F8).

Po pomyślnym wykonaniu powinien wyświetlić się raport podobny do tego:

5b76e886ef79d0ba.png

9. Wyjaśnienie kodu subskrybenta Pub/Sub w ABAP

Ten program ABAP integruje się z Google Cloud Pub/Sub jako subskrybent wiadomości. Sprawdza ona na żądanie, czy w określonej subskrypcji są nowe wiadomości, przetwarza je, a następnie potwierdza ich odbiór, aby zapobiec ponownemu dostarczeniu w przyszłości.

Program wykona te działania:

Szczegółowa analiza

Nawiązywanie połączenia:

  • Nawiązuje połączenie HTTP z usługą Google Cloud Pub/Sub za pomocą klasy /GOOG/CL_PUBSUB_V1.

Ustawianie parametrów:

  • Identyfikator projektu: wyodrębnia odpowiedni identyfikator projektu, w którym znajduje się subskrypcja Pub/Sub.
  • Nazwa subskrypcji: określa nazwę subskrypcji, z której mają być pobierane wiadomości (PUBSUB_DEMO_SUBSCRIPTION).
  • Limit wiadomości: ustawia maksymalną liczbę wiadomości do pobrania w jednym wywołaniu interfejsu API (w tym przypadku 1).

Pobieranie wiadomości:

  • Wywołuje metodę pull_subscriptions, aby pobrać wiadomości z określonej subskrypcji.

Przetwarzanie otrzymanych wiadomości:

  • Jeśli wiadomości istnieją, program dekoduje dane, rejestruje treść i wysyła potwierdzenie.

Potwierdzanie wiadomości:

  • Wywołuje metodę acknowledge_subscriptions, aby wysłać do Pub/Sub potwierdzenie, że wiadomości zostały odebrane. Zapobiega to ponownemu dostarczeniu.

Obsługa sukcesu/błędów:

  • Wyświetla komunikaty o powodzeniu, jeśli wiadomości zostaną odebrane i potwierdzone, oraz komunikaty o błędach w różnych scenariuszach niepowodzenia (brak odebranych wiadomości, błędy interfejsu API itp.).

Zamknij połączenie:

  • Zamyka połączenie HTTP z usługą Pub/Sub.

10. Gratulacje

Świetnie, że udało Ci się ukończyć Codelab „Odbieranie zdarzenia z Cloud Pub/Sub za pomocą pakietu ABAP SDK for Google Cloud”!

Udało Ci się utworzyć pomost między ABAP a Google Cloud Pub/Sub. Ukończenie tego laboratorium pokazuje, że dobrze rozumiesz przesyłanie wiadomości oparte na zdarzeniach i wiesz, jak używać pakietu ABAP SDK for Google Cloud do integracji z usługami Google Cloud. Brawo!

Osiągnięto nowy poziom integracji między ABAP a usługami Google Cloud. Poszerz swoje horyzonty dzięki tym ciekawym opcjom:

  • Korzystanie z interfejsu Translation API za pomocą pakietu ABAP SDK for Google Cloud
  • Przesyłanie dużego obiektu do zasobnika Cloud Storage przy użyciu dzielenia na części
  • Pobieranie danych logowania/obiektów tajnych z usługi Secret Manager za pomocą pakietu ABAP SDK for Google Cloud
  • Wywoływanie funkcji test-bison w Vertex AI z ABAP
  • Wywoływanie BigQuery ML z ABAP

11. Czyszczenie danych

Jeśli nie chcesz kontynuować pracy z dodatkowymi ćwiczeniami dotyczącymi pakietu ABAP SDK do Google Cloud, przejdź do sekcji czyszczenia.

Usuwanie projektu

  • Usuń projekt Google Cloud:
gcloud projects delete abap-sdk-poc

Usuwanie poszczególnych zasobów

  1. Usuń instancję obliczeniową:
gcloud compute instances delete abap-trial-docker
  1. Usuń reguły zapory sieciowej:
gcloud compute firewall-rules delete sapmachine
  1. Usuń konto usługi:
gcloud iam service-accounts delete \
    abap-sdk-pubsub-subscriber@abap-sdk-poc.iam.gserviceaccount.com