Nhận một sự kiện từ Cloud Pub/Sub trong SAP bằng cách sử dụng ABAP SDK cho Google Cloud

1. Giới thiệu

Lớp học lập trình này hướng dẫn bạn cách nhận thông tin chi tiết về sự kiện từ một chủ đề Google Cloud Pub/Sub bằng cách sử dụng SDK ABAP cho Google Cloud. Chúng ta sẽ tận dụng các dịch vụ sau đây của Google Cloud:

  • Cloud Pub/Sub
  • Cloud Shell

Điều kiện tiên quyết

gcloud pubsub topics create PUBSUB_DEMO_TOPIC

Sản phẩm bạn sẽ tạo ra

Bạn sẽ tạo các thành phần sau:

  • Một tài khoản dịch vụ có quyền "Người đăng ký" để tương tác với API Pub/Sub.
  • Một chương trình ABAP để nhận và xác nhận tin nhắn từ chủ đề Pub/Sub.

2. Yêu cầu

  • Trình duyệt, chẳng hạn như Chrome hoặc Firefox.
  • Một dự án Google Cloud đã bật tính năng thanh toán hoặc Tạo tài khoản dùng thử miễn phí 90 ngày cho Google Cloud Platform.
  • SAP GUI (Windows hoặc Java) đã được cài đặt trong hệ thống của bạn. Nếu bạn đã cài đặt SAP GUI trên máy tính xách tay, hãy kết nối với SAP bằng địa chỉ IP bên ngoài của máy ảo làm địa chỉ IP của Máy chủ ứng dụng. Nếu đang dùng máy Mac, bạn cũng có thể cài đặt SAP GUI cho Java có trong đường liên kết này.

3. Trước khi bắt đầu

6757b2fb50ddcc2d.png

  • Chạy các lệnh sau để xác thực cho tài khoản của bạn và đặt dự án mặc định thành abap-sdk-poc. Ví dụ: vùng us-west4-b. Nếu cần, vui lòng thay đổi dự án và vùng trong các lệnh sau đây theo lựa chọn ưu tiên của bạn.
gcloud auth login
gcloud config set project abap-sdk-poc
gcloud config set compute/zone us-west4-b

4. Tạo tài khoản dịch vụ để truy cập Pub/Sub

Việc sử dụng tài khoản dịch vụ có vai trò Subscriber là cách an toàn nhất để chương trình ABAP của bạn nhận được thông báo từ Pub/Sub. Vai trò này chỉ giới hạn quyền truy xuất thư, ngăn chặn các lỗ hổng bảo mật tiềm ẩn.

Tạo Tài khoản dịch vụ

Để tạo tài khoản dịch vụ có vai trò bắt buộc, hãy thực hiện các bước sau:

  1. Chạy lệnh sau trong dòng lệnh Cloud Shell:
gcloud iam service-accounts \
create abap-sdk-pubsub-subscriber \
--display-name="Service Account for Pub/Sub Subscriber"
  1. Bây giờ, hãy thêm các vai trò bắt buộc vào tài khoản dịch vụ đã tạo ở bước trên:
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'

Lệnh trên sử dụng abap-sdk-poc làm phần giữ chỗ cho Dự án Google Cloud. Thay thế abap-sdk-poc bằng mã dự án của bạn.

  1. Để xác minh vai trò đã được thêm, hãy chuyển đến trang IAM. Tài khoản dịch vụ mà bạn đã tạo sẽ xuất hiện cùng với vai trò đã được chỉ định cho tài khoản đó.

5. Tìm hiểu về gói thuê bao kéo

Đối với gói thuê bao kéo, hệ thống SAP của bạn đóng vai trò là ứng dụng của người đăng ký và bắt đầu các yêu cầu đến máy chủ Pub/Sub để truy xuất thông báo. Ứng dụng của người đăng ký sử dụng API kéo REST.

Các phương thức API chính

API Google Cloud Pub/Sub

  • pull (kéo): Bắt đầu một yêu cầu tìm nạp tin nhắn.
  • acknowledge: Tín hiệu cho Pub/Sub biết rằng một thông báo đã được xử lý thành công.

SDK ABAP cho các sản phẩm tương đương của Google Cloud

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

Luồng tin nhắn cho gói thuê bao kéo

Hình ảnh sau đây cho thấy quy trình làm việc giữa ứng dụng khách đăng ký và gói thuê bao lấy dữ liệu.

f0fc44265192f348.png

  1. Yêu cầu kéo: Hệ thống SAP (người đăng ký) sử dụng phương thức kéo để yêu cầu tin nhắn từ máy chủ Pub/Sub.
  2. Phản hồi lệnh kéo: Máy chủ Pub/Sub phản hồi bằng 0 hoặc nhiều thông báo và mã xác nhận. Phản hồi không có thông báo hoặc có lỗi không nhất thiết có nghĩa là không có thông báo nào để nhận. Phản hồi này là PullResponse như trong hình.
  3. Xác nhận: Sau khi xử lý một thông báo, hệ thống SAP của bạn sẽ sử dụng phương thức xác nhận cùng với mã xác nhận đã nhận được. Điều này sẽ ngăn Pub/Sub phân phối lại thông báo.

6. Thiết lập gói thuê bao và gửi tin nhắn

Tạo gói thuê bao kéo

  • Thực thi lệnh gcloud này để tạo một gói thuê bao kéo có tên PUBSUB_DEMO_SUBSCRIPTION. Gói thuê bao này sẽ nhận thông báo từ PUBSUB_DEMO_TOPIC:
gcloud pubsub subscriptions create PUBSUB_DEMO_SUBSCRIPTION \
--topic=PUBSUB_DEMO_TOPIC

Xuất bản thông báo

Chọn một trong các phương thức sau để gửi thông báo đến PUBSUB_DEMO_TOPIC:

  • Sử dụng lại chương trình: Nếu bạn có chương trình từ lớp học lập trình trước để phát hành, hãy sử dụng chương trình đó.
  • Phương thức phát hành trực tiếp: Để kiểm thử nhanh, hãy thử một trong các cách sau:
  • Cloud Console: Phát hành trực tiếp trong Google Cloud Console. Để biết thêm thông tin, hãy xem tài liệu về Pub/Sub.
  • Lệnh gcloud: Chạy lệnh sau:
gcloud pubsub topics publish PUBSUB_DEMO_TOPIC \
--message='{"eventType":"SalesOrderChanged","source":"SAPDEV100","eventTime":"20240207183048","SalesOrder":1000924}'

7. Tạo cấu hình khoá ứng dụng

Giờ đây, khi bạn đã thiết lập các điều kiện tiên quyết ở phía Google Cloud, chúng ta có thể tiếp tục với cấu hình ở phía SAP.

Đối với cấu hình liên quan đến việc xác thực và kết nối, SDK ABAP cho Google Cloud sử dụng các bảng /GOOG/CLIENT_KEY/GOOG/SERVIC_MAP.

Để duy trì cấu hình trong bảng /GOOG/CLIENT_KEY, hãy thực hiện các bước sau:

  1. Trong SAP GUI, hãy nhập mã giao dịch SPRO.
  2. Nhấp vào SAP Reference IMG (Hình ảnh tham chiếu SAP).
  3. Nhấp vào ABAP SDK for Google Cloud (SDK ABAP cho Google Cloud) > Basic Settings (Cài đặt cơ bản) > Configure Client Key (Định cấu hình khoá ứng dụng).

25871e639293b9ee.png

  1. Duy trì các giá trị sau đây cho các trường. Để trống tất cả các trường khác.

Trường

Giá trị

Tên khoá Google Cloud

PUBSUB_SUBSCRIBER

Tên tài khoản dịch vụ Google Cloud

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

Phạm vi Google Cloud

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

Mã dự án

abap-sdk-poc

Lớp uỷ quyền

/GOOG/CL_AUTH_GOOGLE

8. Tạo báo cáo ABAP để nhận thông báo từ Google Cloud Pub/Sub

  1. Đăng nhập vào hệ thống SAP.
  2. Chuyển đến mã giao dịch SE38 và tạo một Chương trình báo cáo có tên ZDEMO_RECEIVE_CPS_EVENTS.
  3. Trong cửa sổ bật lên, hãy cung cấp thông tin chi tiết như bên dưới rồi nhấp vào Lưu.

7c739236bedb5bf1.png

  1. Trong cửa sổ bật lên tiếp theo, hãy chọn Local Object (Đối tượng cục bộ) hoặc cung cấp tên gói phù hợp.
  2. Trong Trình chỉnh sửa ABAP, hãy thêm mã sau:
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. Lưu và kích hoạt Báo cáo.
  2. Thực thi báo cáo (F8).

Khi thực thi thành công, bạn sẽ thấy kết quả báo cáo như dưới đây:

5b76e886ef79d0ba.png

9. Giải thích mã người đăng ký Pub/Sub ABAP

Về cơ bản, chương trình ABAP này tích hợp với Google Cloud Pub/Sub dưới dạng người đăng ký thông báo. Phương thức này kiểm tra một gói thuê bao cụ thể để tìm thông báo mới theo yêu cầu, xử lý các thông báo đó rồi xác nhận việc nhận thông báo để tránh gửi lại trong tương lai.

Chương trình sẽ thực hiện các hoạt động sau:

Phân tích từng bước

Thiết lập kết nối:

  • Thư viện này thiết lập kết nối HTTP với dịch vụ Google Cloud Pub/Sub bằng cách sử dụng lớp /GOOG/CL_PUBSUB_V1.

Đặt tham số:

  • Mã dự án: Trích xuất Mã dự án có liên quan chứa gói thuê bao Pub/Sub.
  • Subscription Name (Tên gói thuê bao): Chỉ định tên của Gói thuê bao để lấy thông báo (PUBSUB_DEMO_SUBSCRIPTION).
  • Giới hạn tin nhắn: Đặt số lượng tin nhắn tối đa để truy xuất trong một lệnh gọi API (trong trường hợp này là 1).

Tìm nạp thông báo:

  • Gọi phương thức pull_subscriptions để truy xuất thông báo từ gói thuê bao đã chỉ định.

Xử lý tin nhắn đã nhận:

  • Nếu có thông báo, chương trình sẽ giải mã dữ liệu, ghi lại nội dung và gửi thông báo xác nhận.

Xác nhận tin nhắn:

  • Gọi phương thức acknowledge_subscriptions để gửi thông báo xác nhận đến Pub/Sub cho biết đã nhận được tin nhắn thành công. Điều này sẽ ngăn việc phân phối lại.

Xử lý thành công/lỗi:

  • Cung cấp thông báo thành công nếu nhận được và xác nhận thông báo, đồng thời hiển thị thông báo lỗi cho nhiều trường hợp không thành công (không nhận được thông báo, lỗi API, v.v.).

Đóng kết nối:

  • Đóng kết nối HTTP với dịch vụ Pub/Sub.

10. Xin chúc mừng

Xin chúc mừng bạn đã hoàn thành lớp học lập trình "Nhận sự kiện từ Cloud Pub/Sub bằng SDK ABAP cho Google Cloud"!

Bạn đã xây dựng thành công cầu nối giữa ABAP và Google Cloud Pub/Sub! Khi hoàn thành lớp học lập trình này, bạn đã nắm vững cách gửi thông báo dựa trên sự kiện và cách sử dụng SDK ABAP cho Google Cloud để tích hợp với các dịch vụ của Google Cloud. Chính xác!

Bạn đã đạt được một cấp độ tích hợp mới giữa ABAP và Dịch vụ đám mây của Google. Mở rộng tầm nhìn của bạn với những lựa chọn thú vị sau:

  • Sử dụng API Dịch bằng SDK ABAP cho Google Cloud
  • Tải một đối tượng lớn lên bộ chứa Cloud Storage bằng cách phân đoạn
  • Truy xuất thông tin xác thực/bí mật từ Trình quản lý bí mật bằng SDK ABAP cho Google Cloud
  • Gọi Vertex AI test-bison từ ABAP
  • Gọi BigQuery ML từ ABAP

11. Dọn dẹp

Nếu bạn không muốn tiếp tục các lớp học lập trình bổ sung liên quan đến SDK ABAP cho Google Cloud, vui lòng tiến hành dọn dẹp.

Xoá dự án

  • Xoá dự án trên Google Cloud:
gcloud projects delete abap-sdk-poc

Xoá từng tài nguyên

  1. Xoá thực thể máy tính:
gcloud compute instances delete abap-trial-docker
  1. Xoá các quy tắc tường lửa:
gcloud compute firewall-rules delete sapmachine
  1. Xoá tài khoản dịch vụ:
gcloud iam service-accounts delete \
    abap-sdk-pubsub-subscriber@abap-sdk-poc.iam.gserviceaccount.com