數(shù)據(jù)讀取實戰(zhàn):RFC、ADBC與HANA方案詳解)
1. 項目緣起一個看似簡單卻暗藏玄機的需求在SAP ABAP開發(fā)領(lǐng)域我們經(jīng)常會遇到一個非常實際的需求如何從一個SAP系統(tǒng)我們稱之為源系統(tǒng)直接讀取另一個SAP系統(tǒng)目標系統(tǒng)的數(shù)據(jù)表這個需求聽起來很直接不就是遠程讀個表嘛。但做過的人都知道這背后涉及到的遠不止一個簡單的SELECT語句。它牽扯到系統(tǒng)間的連接、權(quán)限、性能、數(shù)據(jù)一致性以及開發(fā)規(guī)范等一系列問題。我最近就接手了一個這樣的任務(wù)。業(yè)務(wù)部門希望在一個報表程序里直接展示來自另一個生產(chǎn)系統(tǒng)的物料主數(shù)據(jù)而不是通過傳統(tǒng)的中間表、IDoc或者RFC函數(shù)模塊來中轉(zhuǎn)。他們的理由很充分實時性要求高數(shù)據(jù)同步有延遲業(yè)務(wù)邏輯復雜中間層轉(zhuǎn)換容易出錯。這個需求直接把我推到了跨系統(tǒng)數(shù)據(jù)訪問的技術(shù)深水區(qū)。在深入探索之前我們必須明確一點SAP官方并不推薦在生產(chǎn)環(huán)境中頻繁進行跨系統(tǒng)的直接表讀取。原因很簡單這會帶來緊密的系統(tǒng)耦合、網(wǎng)絡(luò)依賴和潛在的性能瓶頸。但在某些特定場景下比如一次性數(shù)據(jù)比對、緊急故障排查、或者構(gòu)建一個輕量級的、實時性要求極高的監(jiān)控看板時這種“直連”方式又顯得非常誘人。今天我就結(jié)合自己的踩坑經(jīng)歷把幾種主流的實現(xiàn)方案、背后的原理、以及那些官方文檔里不會寫的“坑”和技巧系統(tǒng)地梳理一遍。2. 技術(shù)選型不止RFC一種選擇當提到SAP系統(tǒng)間通信大部分人的第一反應(yīng)就是RFCRemote Function Call。這沒錯RFC是SAP體系內(nèi)系統(tǒng)間調(diào)用的基石。但對于“直接讀表”這個具體需求我們有幾種不同的技術(shù)路徑每種都有其適用的場景和代價。2.1 RFC函數(shù)模塊封裝查詢這是最經(jīng)典、最規(guī)范的做法。在目標系統(tǒng)創(chuàng)建一個RFC-enabled的函數(shù)模塊在這個函數(shù)模塊內(nèi)部執(zhí)行SELECT語句將查詢結(jié)果通過導出參數(shù)或表參數(shù)返回給調(diào)用方。為什么這是首選封裝與安全數(shù)據(jù)訪問邏輯被封裝在目標系統(tǒng)內(nèi)調(diào)用方無需知曉表結(jié)構(gòu)細節(jié)??梢栽诤瘮?shù)模塊內(nèi)加入復雜的權(quán)限檢查、數(shù)據(jù)過濾和日志記錄。性能優(yōu)化可以在目標系統(tǒng)側(cè)對查詢進行優(yōu)化比如使用正確的索引避免將大量無效數(shù)據(jù)通過網(wǎng)絡(luò)傳輸。穩(wěn)定性RFC連接具有連接池、錯誤處理和重試機制成熟穩(wěn)定。實操步驟與核心代碼首先在目標系統(tǒng)SE37中創(chuàng)建函數(shù)模塊比如Z_GET_MATERIAL_DATA。FUNCTION Z_GET_MATERIAL_DATA. *---------------------------------------------------------------------- **Local Interface: * IMPORTING * VALUE(IV_MATNR) TYPE MATNR OPTIONAL * VALUE(IV_WERKS) TYPE WERKS_D OPTIONAL * EXPORTING * VALUE(ET_DATA) TYPE ZTT_MAT_DATA * EXCEPTIONS * NO_DATA_FOUND *---------------------------------------------------------------------- SELECT matnr, mbrsh, mtart, matkl, meins FROM mara INTO TABLE et_data WHERE matnr iv_matnr OR iv_matnr IS INITIAL. IF sy-subrc 0. RAISE no_data_found. ENDIF. ENDFUNCTION.然后在源系統(tǒng)調(diào)用DATA: lt_mat_data TYPE TABLE OF zst_mat_data, lv_dest TYPE rfcdest VALUE ‘PRD_CLNT_800‘. “ 定義在SM59中的RFC目標 CALL FUNCTION ‘Z_GET_MATERIAL_DATA‘ DESTINATION lv_dest EXPORTING iv_matnr ‘MAT-001‘ IMPORTING et_data lt_mat_data EXCEPTIONS no_data_found 1 system_failure 2 communication_failure 3 OTHERS 4. IF sy-subrc 0. “ 處理異常 ENDIF.注意DESTINATION關(guān)鍵字是遠程調(diào)用的核心。lv_dest必須在事務(wù)碼SM59中預先配置好定義了目標系統(tǒng)的連接信息應(yīng)用服務(wù)器、系統(tǒng)編號、客戶端等。2.2 使用ABAP Database Connectivity (ADBC)ADBC提供了一種更接近原生SQL的編程接口。通過它我們可以在ABAP中動態(tài)地執(zhí)行SQL語句。對于跨系統(tǒng)我們可以創(chuàng)建ADBC連接指向一個配置好的RFC目標。什么情況下考慮ADBC當你需要執(zhí)行非常動態(tài)的查詢或者查詢邏輯過于復雜難以用一個固定的函數(shù)模塊參數(shù)來封裝時。例如前端用戶自定義了復雜的過濾條件和動態(tài)選擇的字段。核心實現(xiàn)DATA: lo_connection TYPE REF TO cl_sql_connection, lo_statement TYPE REF TO cl_sql_statement, lo_result TYPE REF TO cl_sql_result_set, lv_dest TYPE dbcon-con_name VALUE ‘REMOTE_DB‘. “ 在DBCO中配置的數(shù)據(jù)庫連接 TRY. “ 1. 獲取連接基于DBCO配置背后可能指向一個RFC連接 lo_connection cl_sql_connectionget_connection( lv_dest ). “ 2. 創(chuàng)建語句對象并執(zhí)行遠程查詢 lo_statement lo_connection-create_statement( ). lo_result lo_statement-execute_query( ‘SELECT matnr, mtart FROM mara WHERE ersda lv_date‘ ). “ 3. 獲取結(jié)果集這里需要將結(jié)果集轉(zhuǎn)移到內(nèi)表步驟略復雜 DATA lt_result TYPE TABLE OF mara WITH EMPTY KEY. lo_result-set_param_table( REF #( lt_result ) ). lo_result-next_package( ). “ 4. 關(guān)閉資源 lo_result-close( ). CATCH cx_sql_exception INTO DATA(lx_sql). “ 處理數(shù)據(jù)庫異常 ENDTRY.重要提示使用ADBC進行跨系統(tǒng)訪問通常需要在目標系統(tǒng)將表或視圖暴露為可遠程訪問的數(shù)據(jù)庫對象有時需要DBA配合并且在調(diào)用系統(tǒng)配置數(shù)據(jù)庫連接DBCO。其配置比純RFC更底層也更復雜通常需要 BASIS 團隊介入。2.3 通過SAP HANA Smart Data Access (SDA) 或 SDI如果你的SAP系統(tǒng)架構(gòu)已經(jīng)升級源或目標系統(tǒng)是基于SAP HANA數(shù)據(jù)庫的那么可以探索更現(xiàn)代化的方式Smart Data Access或Smart Data Integration。它們允許在HANA數(shù)據(jù)庫層面建立到遠程數(shù)據(jù)源的虛擬表之后在ABAP中就可以像查詢本地透明表一樣查詢遠程表。這聽起來很美好但門檻很高雙方系統(tǒng)最好是SAP HANA數(shù)據(jù)庫。需要HANA管理員權(quán)限來配置遠程源和創(chuàng)建虛擬表。對網(wǎng)絡(luò)和系統(tǒng)版本有要求。一個簡化的視角HANA管理員在HANA Studio中創(chuàng)建一個到遠程SAP系統(tǒng)的“適配器”和“虛擬表”。之后ABAP開發(fā)人員看到的是一張普通的透明表ZREMOTE_MARA但其數(shù)據(jù)實時來自遠程系統(tǒng)。你的ABAP代碼無需任何特殊處理SELECT * FROM zremote_mara INTO TABLE DATA(lt_data) WHERE matnr lv_matnr.所有的復雜性都被轉(zhuǎn)移到了HANA和BASIS的配置層。這對于構(gòu)建跨系統(tǒng)的實時報表或分析視圖是終極解決方案但前期架構(gòu)和運維成本也最高。3. 深入RFC配置、性能與那些不得不說的“坑”既然RFC是最通用的方案我們就必須把它吃透。很多問題不是出在代碼上而是出在配置和用法上。3.1 SM59配置的魔鬼細節(jié)事務(wù)碼SM59是RFC連接的配置中心。創(chuàng)建一個類型為“3”ABAP連接的目標條目是第一步但下面這些細節(jié)決定了連接的生死。連接類型T(TCP/IP) 是最常見的。確保目標系統(tǒng)應(yīng)用服務(wù)器的IP和端口默認為sapgwXXXX是系統(tǒng)編號正確且網(wǎng)絡(luò)可達。登錄信息這里配置的用戶必須有足夠的權(quán)限訪問目標系統(tǒng)的目標表和函數(shù)模塊。強烈建議使用通信用戶Communication User而非個人賬號。通信用戶專用于系統(tǒng)間對話密碼永不過期權(quán)限可嚴格控制。Unicode選項如果雙方系統(tǒng)都是Unicode系統(tǒng)務(wù)必勾選“Unicode”。字符集不一致會導致中文等字符亂碼。連接池對于高頻調(diào)用設(shè)置“負載均衡”和“連接池”參數(shù)可以顯著提升性能。例如Max. Number of Connections最大連接數(shù)和Idle Timeout空閑超時需要根據(jù)實際并發(fā)量調(diào)整。3.2 性能優(yōu)化減少網(wǎng)絡(luò)往返是關(guān)鍵跨系統(tǒng)調(diào)用的最大開銷是網(wǎng)絡(luò)延遲。一次RFC調(diào)用可能只需要幾十毫秒執(zhí)行SQL但網(wǎng)絡(luò)往返卻要幾百毫秒。優(yōu)化原則就是用最少的調(diào)用次數(shù)傳輸最少的數(shù)據(jù)量。批量操作避免循環(huán)內(nèi)調(diào)用這是最重要的原則。永遠不要在循環(huán)內(nèi)逐條調(diào)用RFC。錯誤示范LOOP AT lt_matnr ASSIGNING FIELD-SYMBOL(fs_mat). CALL FUNCTION ‘Z_GET_MAT_DETAIL‘ DESTINATION lv_dest EXPORTING iv_matnr fs_mat-matnr IMPORTING es_data ls_data. APPEND ls_data TO lt_result. ENDLOOP.正確做法修改函數(shù)模塊使其支持傳入內(nèi)表一次性返回所有結(jié)果。CALL FUNCTION ‘Z_GET_MAT_DETAIL_BATCH‘ DESTINATION lv_dest EXPORTING it_matnr_range lt_matnr_range “ 傳入一個范圍表 IMPORTING et_data lt_result. “ 一次性接收所有結(jié)果精心設(shè)計接口參數(shù)只傳遞必要的篩選條件只返回程序需要的字段。避免使用SELECT *和返回整個表結(jié)構(gòu)。在函數(shù)模塊的接口中使用精確定義的類型而不是直接引用龐大的標準表類型如MARA。使用異步RFCaRFC處理非實時任務(wù)如果業(yè)務(wù)允許對于一些后臺更新或數(shù)據(jù)同步任務(wù)可以使用STARTING NEW TASK發(fā)起異步調(diào)用這樣調(diào)用方無需等待目標系統(tǒng)執(zhí)行完畢就可以繼續(xù)后續(xù)操作。CALL FUNCTION ‘Z_UPDATE_REMOTE_DATA‘ STARTING NEW TASK ‘TASK1‘ DESTINATION lv_dest PERFORMING callback ON END OF TASK EXPORTING it_update_data lt_data. “ 主程序可以繼續(xù)執(zhí)行其他邏輯3.3 異常處理與穩(wěn)定性保障網(wǎng)絡(luò)是不穩(wěn)定的遠程系統(tǒng)可能重啟函數(shù)模塊可能被修改。健壯的程序必須考慮所有失敗場景。全面捕獲異常CALL FUNCTION ... DESTINATION語句會拋出多種異常。必須處理SYSTEM_FAILURE目標系統(tǒng)問題、COMMUNICATION_FAILURE網(wǎng)絡(luò)問題等。CALL FUNCTION ‘...‘ DESTINATION lv_dest EXPORTING ... IMPORTING ... EXCEPTIONS system_failure 1 MESSAGE lv_msg communication_failure 2 MESSAGE lv_msg resource_failure 3 OTHERS 4. CASE sy-subrc. WHEN 1 OR 2. “ 記錄日志發(fā)送警報可能觸發(fā)重試或降級方案如讀取本地緩存 MESSAGE lv_msg TYPE ‘E‘. WHEN OTHERS. “ 處理業(yè)務(wù)邏輯異常 ENDCASE.實現(xiàn)重試機制對于暫時的網(wǎng)絡(luò)抖動簡單的重試可能解決問題??梢苑庋b一個帶有重試邏輯的調(diào)用包裝器。DATA lv_retry TYPE i VALUE 3. WHILE lv_retry 0. CALL FUNCTION ... EXCEPTIONS system_failure 1 ... . IF sy-subrc 0. EXIT. “ 成功則退出循環(huán) ELSEIF sy-subrc 1 OR sy-subrc 2. lv_retry lv_retry - 1. WAIT UP TO 2 SECONDS. “ 等待后重試 ELSE. EXIT. “ 業(yè)務(wù)錯誤無需重試 ENDIF. ENDWHILE.設(shè)置合理的超時在SM59中或通過RFCDES結(jié)構(gòu)設(shè)置rfc_timeout避免一個掛起的調(diào)用阻塞整個程序。4. 權(quán)限與安全看不見的防線直接讀取他系統(tǒng)數(shù)據(jù)安全是重中之重。權(quán)限控制必須從兩個層面考慮調(diào)用方身份和目標對象權(quán)限。調(diào)用方身份SM59中的登錄用戶這個用戶權(quán)限應(yīng)該遵循最小權(quán)限原則。只授予它執(zhí)行特定函數(shù)模塊和讀取特定表的權(quán)限而不是SAP_ALL。通常通過PFCG角色來實現(xiàn)角色中只包含必要的S_TCODE對于函數(shù)模塊執(zhí)行和S_TABU_NAM對于表訪問權(quán)限。目標函數(shù)模塊的權(quán)限檢查在目標系統(tǒng)的函數(shù)模塊內(nèi)部必須加入權(quán)威檢查Authority Check。即使調(diào)用用戶有訪問表的權(quán)限業(yè)務(wù)上也可能不允許。例如只允許查詢特定工廠的數(shù)據(jù)。FUNCTION Z_GET_MAT_DATA. “ 首先進行權(quán)限檢查 AUTHORITY-CHECK OBJECT ‘M_MATE_WRK‘ ID ‘WERKS‘ FIELD iv_werks ID ‘ACTVT‘ FIELD ‘03‘. “ 03代表顯示 IF sy-subrc 0. RAISE no_authority. ENDIF. “ 然后再執(zhí)行數(shù)據(jù)查詢 SELECT ... ENDFUNCTION.數(shù)據(jù)傳輸安全對于敏感數(shù)據(jù)應(yīng)考慮在傳輸層啟用加密SNC - Secure Network Communications確保數(shù)據(jù)在網(wǎng)絡(luò)上傳輸時是加密的。這需要在SM59和系統(tǒng)層面進行配置。5. 實戰(zhàn)案例構(gòu)建一個跨系統(tǒng)物料查詢報表假設(shè)我們需要在開發(fā)系統(tǒng)DEV創(chuàng)建一個報表實時顯示生產(chǎn)系統(tǒng)PRD中特定工廠下最近創(chuàng)建的物料清單。步驟一目標系統(tǒng)PRD開發(fā)創(chuàng)建RFC函數(shù)模塊Z_MM_GET_RECENT_MATS。輸入?yún)?shù)IV_WERKS工廠IV_DAYS最近幾天。內(nèi)部實現(xiàn)進行工廠權(quán)限檢查然后查詢MARA和MARC表按創(chuàng)建日期倒序返回關(guān)鍵字段。激活并發(fā)布該函數(shù)模塊。步驟二源系統(tǒng)DEV配置事務(wù)碼SM59創(chuàng)建新的RFC目標PRD_RFC填寫PRD系統(tǒng)的應(yīng)用服務(wù)器、系統(tǒng)編號、客戶端。登錄信息使用預配好的通信用戶CPIC_USER。測試連接確保狀態(tài)為“連接測試成功”。步驟三源系統(tǒng)DEV程序開發(fā)REPORT zmm_cross_sys_mat_query. PARAMETERS: p_werks TYPE werks_d OBLIGATORY, p_days TYPE i DEFAULT 7. DATA: lt_mat_data TYPE TABLE OF zst_mat_detail, “ 自定義結(jié)構(gòu) lv_dest TYPE rfcdest VALUE ‘PRD_RFC‘. START-OF-SELECTION. “ 調(diào)用遠程函數(shù) CALL FUNCTION ‘Z_MM_GET_RECENT_MATS‘ DESTINATION lv_dest EXPORTING iv_werks p_werks iv_days p_days IMPORTING et_data lt_mat_data EXCEPTIONS system_failure 1 MESSAGE DATA(lv_msg) communication_failure 2 MESSAGE lv_msg no_authority 3 no_data_found 4 OTHERS 5. CASE sy-subrc. WHEN 0. “ 成功用ALV展示lt_mat_data cl_salv_tablefactory( IMPORTING r_salv_table DATA(lo_alv) CHANGING t_table lt_mat_data ). lo_alv-display( ). WHEN 1 OR 2. MESSAGE lv_msg TYPE ‘E‘. WHEN 3. MESSAGE ‘沒有查詢該工廠的權(quán)限‘ TYPE ‘E‘. WHEN 4. MESSAGE ‘未找到符合條件的物料‘ TYPE ‘S‘. WHEN OTHERS. MESSAGE ‘遠程調(diào)用發(fā)生未知錯誤‘ TYPE ‘E‘. ENDCASE.步驟四測試與監(jiān)控在DEV系統(tǒng)運行報表輸入?yún)?shù)查看結(jié)果。在目標系統(tǒng)PRD使用事務(wù)碼SMGW網(wǎng)關(guān)監(jiān)控或ST22ABAP Dump分析查看是否有錯誤日志。在源系統(tǒng)DEV使用事務(wù)碼SM04用戶列表或STAD性能追蹤可以監(jiān)控到RFC調(diào)用會話和耗時。6. 替代方案與邊界思考什么時候不該用直接讀取盡管我們討論了多種直接讀取的技術(shù)但我們必須清醒地認識到這不是銀彈。在以下場景你應(yīng)該堅決尋求替代方案高頻、大數(shù)據(jù)量訪問例如一個每分鐘執(zhí)行一次、每次讀取十萬行數(shù)據(jù)的作業(yè)。這會壓垮網(wǎng)絡(luò)和目標系統(tǒng)。應(yīng)使用數(shù)據(jù)復制/同步機制如SAP Data Services, SLT (Landscape Transformation Replication Server) 或簡單的定時作業(yè)將數(shù)據(jù)批量同步到本地。寫操作直接跨系統(tǒng)更新/插入/刪除數(shù)據(jù)是極其危險的會繞過目標系統(tǒng)所有的業(yè)務(wù)邏輯和增強BADI, User Exit。必須通過發(fā)布/調(diào)用BAPI或IDoc來實現(xiàn)。系統(tǒng)版本或數(shù)據(jù)庫差異巨大例如從SAP ECC直接讀S/4HANA的表表結(jié)構(gòu)可能已發(fā)生根本性變化。強依賴會導致升級時程序崩潰。應(yīng)通過中間件或API如OData Service, SOAP進行解耦。需要復雜關(guān)聯(lián)查詢跨系統(tǒng)進行多表JOIN查詢性能通常是災(zāi)難性的。要么在目標系統(tǒng)創(chuàng)建聚合視圖要么將數(shù)據(jù)同步過來后在本地關(guān)聯(lián)。一個實用的決策流程數(shù)據(jù)量每次請求數(shù)據(jù)是否超過1000行是 - 考慮同步。實時性業(yè)務(wù)能容忍分鐘級延遲嗎能 - 考慮同步。操作類型是讀還是寫寫 - 必須用BAPI/IDoc。查詢復雜度是否涉及多表關(guān)聯(lián)和復雜計算是 - 在目標系統(tǒng)封裝視圖或CDS View通過RFC/OData暴露。如果以上都是“否”那么RFC函數(shù)模塊封裝查詢通常是合適的選擇。7. 調(diào)試與排錯當調(diào)用失敗時怎么辦即使配置無誤跨系統(tǒng)調(diào)用也時常出問題。下面是一個系統(tǒng)化的排查鏈路?,F(xiàn)象RFC調(diào)用失敗SY-SUBRC非零。第一步檢查基礎(chǔ)連接源系統(tǒng)側(cè)SM59測試連接在SM59中選中目標條目點擊“連接測試”。如果失敗錯誤信息會直接顯示。常見錯誤1Destination ... does not exist。檢查目標名稱是否拼寫錯誤或該目標是否被意外刪除。常見錯誤2Connection refused或Host unknown。檢查目標系統(tǒng)的主機名/IP和sapgwXX端口是否可達。聯(lián)系網(wǎng)絡(luò)團隊或BASIS。常見錯誤3Logon failed。檢查SM59中配置的用戶名/密碼是否正確該用戶在目標系統(tǒng)是否被鎖定或密碼過期。第二步檢查遠程函數(shù)模塊目標系統(tǒng)側(cè)SE37檢查狀態(tài)在目標系統(tǒng)用SE37查看被調(diào)用的函數(shù)模塊。確保其已被激活并且是“遠程啟用模塊”Remote-Enabled Module。SU53檢查權(quán)限如果錯誤是NO_AUTHORITY在目標系統(tǒng)用SU53事務(wù)碼查看權(quán)限檢查失敗的具體對象和字段值。調(diào)整調(diào)用用戶或通信用戶的PFCG角色。ST22查看Dump如果函數(shù)模塊執(zhí)行時發(fā)生ABAP運行時錯誤如DUMP在目標系統(tǒng)的ST22中可以根據(jù)日期和用戶找到對應(yīng)的Dump記錄里面會有詳細的錯誤代碼和位置。第三步網(wǎng)絡(luò)與系統(tǒng)層面SMGW檢查網(wǎng)關(guān)在目標系統(tǒng)運行SMGW檢查SAP網(wǎng)關(guān)是否運行正常查看“網(wǎng)關(guān)日志”是否有異常信息。網(wǎng)絡(luò)跟蹤對于復雜的網(wǎng)絡(luò)問題如防火墻攔截可能需要BASIS在操作系統(tǒng)層面使用telnet host port測試端口連通性或使用網(wǎng)絡(luò)抓包工具如Wireshark進行分析。第四步程序邏輯與數(shù)據(jù)問題在目標系統(tǒng)直接調(diào)試如果懷疑是函數(shù)模塊內(nèi)部邏輯問題可以在目標系統(tǒng)SE37中直接測試該函數(shù)使用源系統(tǒng)調(diào)用時傳遞的相同參數(shù)看是否重現(xiàn)錯誤。檢查輸入數(shù)據(jù)確保傳遞給遠程函數(shù)的參數(shù)類型、長度、值域都符合預期。一個常見的坑是傳入的日期或金額格式與目標系統(tǒng)客戶端設(shè)置不符。一個真實的踩坑案例我曾遇到一個場景DEV系統(tǒng)調(diào)用QAS系統(tǒng)的RFC函數(shù)一直報通信失敗。SM59測試連接是成功的。最終排查發(fā)現(xiàn)是QAS系統(tǒng)的防火墻策略最近被更新只允許來自生產(chǎn)網(wǎng)段的特定IP訪問其SAP網(wǎng)關(guān)端口而DEV系統(tǒng)屬于開發(fā)網(wǎng)段不在白名單內(nèi)。解決方案是協(xié)調(diào)網(wǎng)絡(luò)團隊將DEV系統(tǒng)的應(yīng)用服務(wù)器IP加入QAS系統(tǒng)的防火墻白名單。教訓SM59連接測試成功只代表TCP層面的握手和基礎(chǔ)登錄成功不代表實際RFC調(diào)用時的高層協(xié)議通信不會被防火墻策略攔截。8. 經(jīng)驗總結(jié)與最佳實踐經(jīng)過多個項目的錘煉我總結(jié)出幾條關(guān)于SAP跨系統(tǒng)讀取數(shù)據(jù)的“生存法則”封裝優(yōu)于暴露永遠通過函數(shù)模塊或API來暴露數(shù)據(jù)而不是直接開放表訪問。這是控制耦合度和保證安全性的生命線。配置即代碼將RFC目標、通信用戶等配置信息納入變更管理流程。SM59的配置應(yīng)該像傳輸請求一樣被記錄和審核。監(jiān)控不可少對關(guān)鍵的跨系統(tǒng)調(diào)用程序要加入性能監(jiān)控和錯誤告警??梢允褂肧AT性能跟蹤定期分析耗時或通過SAP Solution Manager設(shè)置監(jiān)控點。設(shè)計容錯和降級重要的業(yè)務(wù)程序不能因為一個遠程系統(tǒng)暫時不可用而崩潰??紤]引入本地緩存如集群表/共享內(nèi)存當遠程調(diào)用失敗時使用稍舊的數(shù)據(jù)提供服務(wù)。明確所有權(quán)目標系統(tǒng)的函數(shù)模塊和數(shù)據(jù)表其維護責任屬于目標系統(tǒng)團隊。任何接口變更如增加字段、修改邏輯必須通過正式的變更流程通知所有調(diào)用方。性能測試在上線前必須模擬生產(chǎn)環(huán)境的數(shù)據(jù)量和并發(fā)用戶數(shù)進行壓力測試??缦到y(tǒng)調(diào)用的性能曲線往往是非線性的一個小數(shù)據(jù)量測試成功的接口在大數(shù)據(jù)量下可能完全不可用?;氐阶畛醯哪莻€需求我最終選擇了方案一在目標系統(tǒng)創(chuàng)建了一個高度優(yōu)化、支持批量查詢的RFC函數(shù)模塊并在調(diào)用端實現(xiàn)了帶指數(shù)退避的重試機制和簡易的本地緩存降級。項目上線后運行平穩(wěn)。但更重要的是通過這次深入的探索我徹底理清了在不同約束條件下該如何做出最合適的技術(shù)選型。技術(shù)沒有絕對的好壞只有是否適合當下的場景。