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ủ đề trên Google Cloud Pub/Sub bằng ABAP SDK 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 mục sau:

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

2. Yêu cầu

  • Các 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 SAP GUI đã được cài đặt 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 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 tài khoản của bạn và đặt dự án mặc định thành abap-sdk-poc. Vùng us-west4-b được dùng làm ví dụ. Nếu cần, vui lòng thay đổi dự án và khu vực trong các lệnh sau dựa trên 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

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 tin nhắn 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 một 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 cửa sổ 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ụ mà bạn đã 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 abap-sdk-poc bằng mã dự án của bạn.

  1. Để xác minh rằng 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 sẽ đóng vai trò là ứng dụng khách thuê bao và bắt đầu gửi các yêu cầu đến máy chủ Pub/Sub để truy xuất tin nhắn. Ứng dụng thuê bao sử dụng REST Pull API.

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

API Google Cloud Pub/Sub

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

ABAP SDK cho các dịch vụ tương đương của Google Cloud

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

Luồng thông báo cho một gói thuê bao kéo

Hình ảnh sau đây cho thấy quy trình làm việc giữa một ứng dụng thuê bao và một thuê bao kéo.

f0fc44265192f348.png

  1. Yêu cầu kéo: Hệ thống SAP của bạn (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 kéo: Máy chủ Pub/Sub phản hồi bằng không hoặc nhiều thông báo và mã nhận dạng xác nhận. Phản hồi không có tin nhắn hoặc có lỗi không nhất thiết cho biết rằng không có tin nhắn nào có thể nhận được. 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 ngăn Pub/Sub gử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 là PUBSUB_DEMO_SUBSCRIPTION. Gói này sẽ nhận thông báo từ PUBSUB_DEMO_TOPIC:
gcloud pubsub subscriptions create PUBSUB_DEMO_SUBSCRIPTION \
--topic=PUBSUB_DEMO_TOPIC

Phát hành thông báo

Chọn một trong những cách sau để gửi tin nhắn đến PUBSUB_DEMO_TOPIC:

  • Sử dụng lại chương trình của bạn: Nếu bạn có chương trình từ lớp học lập trình trước để xuất bản, hãy sử dụng chương trình đó.
  • Phát hành trực tiếp: Để kiểm thử nhanh, hãy thử một trong các lựa chọn sau:
  • Cloud Console: Xuất bản ngay 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, sau khi bạn thiết lập các điều kiện tiên quyết trên Google Cloud, chúng ta có thể chuyển sang bước định cấu hình trên SAP.

Đối với cấu hình liên quan đến hoạt động xác thực và kết nối, ABAP SDK cho Google Cloud sẽ 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.
  3. Nhấp vào ABAP SDK for Google Cloud > Basic Settings > Configure Client Key (ABAP SDK cho Google Cloud > Cài đặt cơ bản > Định cấu hình khoá ứng dụng).

25871e639293b9ee.png

  1. Duy trì các giá trị sau đối với 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 là 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ư minh hoạ 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 hoặc cung cấp tên gói nếu thích hợp.
  2. Trong Trình chỉnh sửa ABAP, hãy thêm đoạn 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ư minh hoạ 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 một người đăng ký thông báo. Thao tác này kiểm tra một gói thuê bao cụ thể để tìm tin nhắn mới theo yêu cầu, xử lý các tin nhắn đó, rồi xác nhận đã nhận được để ngăn chặn việc gửi lại trong tương lai.

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

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

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

  • Thao tác này thiết lập một kết nối HTTP đến 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 nơi có gói thuê bao Pub/Sub.
  • Tên gói thuê bao: Chỉ định tên của gói thuê bao mà bạn muốn lấy thông báo (PUBSUB_DEMO_SUBSCRIPTION).
  • Giới hạn số lượng tin nhắn: Đặt số lượng tin nhắn tối đa cần truy xuất trong một lệnh gọi API (trong trường hợp này là 1).

Tìm nạp tin nhắn:

  • 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 một thông báo xác nhận.

Xác nhận đã đọc tin nhắn:

  • Gọi phương thức acknowledge_subscriptions để gửi một thông báo xác nhận đến Pub/Sub cho biết đã nhận được tin nhắn. Điều này ngăn không cho các thông báo đó được gử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 thất bại (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

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

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

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

  • Sử dụng Translation API với ABAP SDK 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 đăng nhập/khoá bí mật từ Secret Manager bằng ABAP SDK 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 với các khoá học lập trình bổ sung liên quan đến ABAP SDK 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á phiên bản điện toán:
gcloud compute instances delete abap-trial-docker
  1. Xoá các quy tắc về 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