共計(jì) 4425 個(gè)字符,預(yù)計(jì)需要花費(fèi) 12 分鐘才能閱讀完成。
本篇內(nèi)容介紹了“ABAP 基礎(chǔ)知識(shí)有哪些”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓丸趣 TV 小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
什么是 ABAP Netweaver 應(yīng)用服務(wù)器?
SAP Netweaver 應(yīng)用服務(wù)器是 SAP ABAP 應(yīng)用開發(fā)和運(yùn)行平臺(tái),ABAP 開發(fā)人員在上面可以專注于具體業(yè)務(wù)邏輯的開發(fā),凡涉及到更底層的基礎(chǔ)設(shè)施相關(guān)任務(wù),比如請(qǐng)求的負(fù)載均衡,進(jìn)程的派生,同步和調(diào)度,內(nèi)存管理,服務(wù)器多實(shí)例間緩存同步等等,統(tǒng)統(tǒng)交由 Netweaver 平臺(tái)本身處理。如此一來,一個(gè) ABAP 開發(fā)人員,即使不具備精深的計(jì)算機(jī)組成原理,操作系統(tǒng),計(jì)算機(jī)網(wǎng)絡(luò)等領(lǐng)域知識(shí),也能勝任 SAP 應(yīng)用的開發(fā)工作。
ABAP Netweaver 應(yīng)用服務(wù)器和 SAP 解決方案的關(guān)系?
本文討論的 SAP 解決方案,僅限于那些基于 ABAP 技術(shù)棧的 SAP 產(chǎn)品。
Google 里根據(jù)關(guān)鍵字 SAP ABAP three layer 搜索,能找到很多基于 ABAP 技術(shù)的 SAP 解決方案的三層經(jīng)典架構(gòu)圖:
隨便點(diǎn)開一張查看:
SAP 客戶位于圖中最上面的展現(xiàn)層(Presentation Layer),通過 SAP GUI 這個(gè)客戶端軟件或者瀏覽器訪問 SAP 系統(tǒng);
SAP 系統(tǒng)的軟件,安裝在 ABAP Netweaver 服務(wù)器上,響應(yīng)用戶請(qǐng)求,完成對(duì)應(yīng)的業(yè)務(wù)邏輯。ABAP Netweaver 服務(wù)器位于上圖中間的應(yīng)用層。
最底層是數(shù)據(jù)庫層,很多 SAP 產(chǎn)品都支持不同類型的數(shù)據(jù)庫,比如 SAP HANA,Oracle 數(shù)據(jù)庫,SQL Server 等。
部分 ABAP 開發(fā)人員覺得,我們既然能夠直接在 ABAP Netweaver 里用 OPEN SQL 對(duì)數(shù)據(jù)庫表進(jìn)行讀寫操作,那么 Netweaver 應(yīng)用服務(wù)器本身就包含了數(shù)據(jù)庫層。這樣理解其實(shí)不正確。我們?cè)?Netweaver SE38 里編寫的 OPEN SQL 代碼,會(huì)通過 Netweaver 內(nèi)部的數(shù)據(jù)庫接口,轉(zhuǎn)換成數(shù)據(jù)庫提供商相關(guān)的原生 SQL 語句在數(shù)據(jù)庫里執(zhí)行,并且從最底層的數(shù)據(jù)庫層,到應(yīng)用層里的 ABAP 程序之間的數(shù)據(jù)傳輸,也是通過數(shù)據(jù)庫接口完成的。
本文討論的 ABAP Netweaver 服務(wù)器的組成部分,位于三層架構(gòu)中的應(yīng)用層。
ABAP Netweaver 服務(wù)器實(shí)例
運(yùn)行在物理機(jī)器上的 ABAP 應(yīng)用服務(wù)器,按照其用途的不同,又可分為兩種實(shí)例:應(yīng)用服務(wù)器實(shí)例和 ABAP SAP 中央服務(wù)實(shí)例(ABAP SAP Central Services instances, 縮寫為 ASCS instances), 也就是下圖兩個(gè)灰色矩形框代表的實(shí)例。
一個(gè)典型的 SAP 系統(tǒng)一般由一到多個(gè)應(yīng)用服務(wù)器實(shí)例和一個(gè) ASCS 實(shí)例組成。
從上圖左邊的矩形框里,能觀察到 ABAP 應(yīng)用服務(wù)器實(shí)例包含的主要組件有:
(1) Internet Communication Manager (ICM)
(2) ABAP dispatcher
(3) 工作進(jìn)程
(4) RFC Gateway
(5) Start Service
下面是對(duì)這些組件的簡要介紹。
Internet Communication Manager (ICM)
ICM 是 Netweaver 服務(wù)器里一個(gè)單獨(dú)的進(jìn)程,由 ABAP Dispatcher 啟動(dòng)并監(jiān)控,負(fù)責(zé) SAP 系統(tǒng)和外部的網(wǎng)絡(luò)通信。基于收到請(qǐng)求 URL 的解析,ICM 會(huì)將請(qǐng)求分發(fā)給具體的 handler 進(jìn)行處理。
ICM 常用的與 Internet 交互的協(xié)議有 HTTP,HTTPS,SMTP 等。
下圖是 ICM 的架構(gòu)圖。
Thread Control:該線程負(fù)責(zé)接收外界請(qǐng)求,從 ICM 線程池中取出空閑的工作線程,將請(qǐng)求的上下文交給工作線程。
工作線程:負(fù)責(zé)請(qǐng)求的具體處理,包含一個(gè) I / O 處理器,可以用來進(jìn)行網(wǎng)絡(luò)的輸入和輸出操作。對(duì)于不同協(xié)議類型的請(qǐng)求,Thread Control 會(huì)調(diào)度包含了對(duì)應(yīng)協(xié)議插件的工作線程。
Watchdog:如果一個(gè)工作線程在任務(wù)處理時(shí)出現(xiàn)了等待某個(gè)響應(yīng)直至超時(shí)的情況,Watchdog 會(huì)將該工作線程釋放,避免其無限期的等待,這樣該工作線程可以服務(wù)于其他請(qǐng)求。而 Watchdog 會(huì)繼續(xù)等待尚未到來的響應(yīng)。其后如果響應(yīng)到達(dá),Watchdog 會(huì)通知 Thread control, 后者會(huì)繼續(xù)調(diào)用新的工作線程來處理。
Signal Handler:處理來自操作系統(tǒng)或者其他進(jìn)程的信號(hào)。
Connection Info: 這張表維護(hù)了每個(gè)連接的狀態(tài)信息,包括內(nèi)存管道等。
Memory Pipes:內(nèi)存管道是基于內(nèi)存的通訊數(shù)據(jù)結(jié)構(gòu),用于將 ICM 接收到的外部請(qǐng)求包含的數(shù)據(jù)轉(zhuǎn)交給工作線程。
Internet Server Cache:服務(wù)器端的緩存,對(duì)于重復(fù)的請(qǐng)求可以加快響應(yīng)速度。
ABAP Dispatcher 和工作進(jìn)程
二者的關(guān)系在下圖體現(xiàn)得很清晰,ABAP 應(yīng)用服務(wù)器上運(yùn)行著許多工作進(jìn)程(Work Process),這些進(jìn)程類型各異,負(fù)責(zé)處理各種類型不同的請(qǐng)求。
事務(wù)碼 SM50 里能看到當(dāng)前應(yīng)用服務(wù)器上的工作進(jìn)程明細(xì),比如下圖顯示用于處理用戶普通事務(wù)請(qǐng)求的對(duì)話 (Dialog) 進(jìn)程有 30 個(gè),其中 29 個(gè)空閑;Update 進(jìn)程負(fù)責(zé)執(zhí)行數(shù)據(jù)庫的更新操作;Background 進(jìn)程處理后臺(tái)作業(yè),Spool 負(fù)責(zé)打印任務(wù)。而 ABAP 里數(shù)據(jù)庫更新的操作有 V1 和 V2 兩種級(jí)別(平時(shí)大家用的默認(rèn)都是 V1 級(jí)別),分別由下圖的 Update 和 Update Task2 兩種類型的工作進(jìn)程完成。
Gateway
這里的 Gateway 和 SAP Fiori 里的 Gateway 系統(tǒng)是兩碼事,后者指代安裝了 SAP_GWFND 這個(gè) Software Component 的 ABAP 應(yīng)用服務(wù)器,而我們現(xiàn)在即將討論的 Gateway,是 ABAP 應(yīng)用服務(wù)器里的一個(gè)組件。
SAP 系統(tǒng)之間,以及 SAP 系統(tǒng)與外部系統(tǒng)間通過基于 TCP/IP 的 RFC(Remote Function Call,遠(yuǎn)程系統(tǒng)調(diào)用)進(jìn)行通信,而 Gateway 作為 RFC 調(diào)用分發(fā)的入口,如下圖所示:
值得一提的是,我們能夠在 SAP 標(biāo)準(zhǔn)程序里看到 CALL FUNCTION XXX DESTINATION NONE 的寫法,這種寫法使得函數(shù) XXX 仍然在調(diào)用它的應(yīng)用服務(wù)器實(shí)例內(nèi)部執(zhí)行,而非在其他服務(wù)器上遠(yuǎn)程執(zhí)行。那么這種寫法不是多此一舉嗎?
SAP 官網(wǎng)對(duì)這種用法的解釋:Destination NONE has the effect that the function module is started on the same application server as the calling program, however through the RFC interface and in its own RFC context.
也就是說,通過這種方式調(diào)用的函數(shù),即便是和調(diào)用者同處一個(gè)應(yīng)用服務(wù)器實(shí)例內(nèi),也會(huì)像遠(yuǎn)程調(diào)用執(zhí)行時(shí)一樣,到 RFC 接口即 Gateway 組件里去走一遭。
付出這種在額外協(xié)議棧上執(zhí)行開銷的代價(jià),有什么收益?那得從 ABAP Netweaver 里不同類型的會(huì)話說起。我們每用 SAP GUI 登錄一次系統(tǒng),會(huì)在服務(wù)器上生成一個(gè)用戶會(huì)話(User Session). 每個(gè) User Session 里通過命令行輸入 / o 可以生成新的 ABAP 會(huì)話,每個(gè) ABAP 會(huì)話內(nèi)的程序調(diào)用生成新的內(nèi)部會(huì)話(Internal Session).
如果直接調(diào)用函數(shù) CALL FUNCTION XXX , 在發(fā)起該函數(shù)調(diào)用的同一 ABAP 會(huì)話內(nèi),會(huì)派生一個(gè)新的內(nèi)部會(huì)話去執(zhí)行函數(shù)體的邏輯。如果用 CALL FUNCTION XXX DESTINATION NONE , 則會(huì)派生一個(gè)全新的用戶會(huì)話,此時(shí)這個(gè)全新的用戶會(huì)話,和發(fā)起函數(shù)調(diào)用的原始用戶會(huì)話是完全隔離的,不共享任何數(shù)據(jù),參數(shù)傳遞也是通過 RFC 標(biāo)準(zhǔn)的參數(shù)傳遞方式進(jìn)行。通過這種方式,能實(shí)現(xiàn)被調(diào)用函數(shù)和原始程序的異步調(diào)用效果,同時(shí)兩個(gè)用戶會(huì)話里的程序執(zhí)行完全隔離,不會(huì)彼此影響。
事務(wù)碼 SM04 能看到 ABAP 應(yīng)用服務(wù)器上所有的用戶會(huì)話。雙擊某一用戶會(huì)話,能看到該用戶會(huì)話派生的所有 ABAP 會(huì)話。

SAP Start Service
該服務(wù)運(yùn)行在部署了 SAP 應(yīng)用服務(wù)器實(shí)例的服務(wù)器上,實(shí)現(xiàn)載體是 Windows 的系統(tǒng)服務(wù) (sapstartsrv.exe) 和 Unix 系統(tǒng)的 Daemon 進(jìn)程(sapstartsrv).
SAP Start Service 實(shí)現(xiàn)的功能有:
(1) 啟動(dòng)和終止 SAP 應(yīng)用服務(wù)器實(shí)例,及其運(yùn)行狀態(tài)的監(jiān)控
(2) 應(yīng)用服務(wù)器日志,跟蹤和配置文件的讀取與管理
ABAP SAP 中央服務(wù)實(shí)例(ABAP SAP Central Services instances, ASCS)
主要包含 Enqueue 服務(wù)器和消息服務(wù)器。
Enqueue Server
數(shù)據(jù)庫層面的鎖由數(shù)據(jù)庫管理,而 ABAP 應(yīng)用程序級(jí)別的鎖,比如鎖一個(gè)訂單,鎖一個(gè)物料主數(shù)據(jù),則通過應(yīng)用程序提出鎖申請(qǐng),由 Enqueue Server 完成和管理鎖。應(yīng)用服務(wù)器實(shí)例上所有用戶當(dāng)前會(huì)話持有的鎖,都維護(hù)在 Enqueue 服務(wù)器的鎖信息管理表中,該表維護(hù)在 Enqueue 服務(wù)器的內(nèi)存中,不會(huì)進(jìn)行持久化,因此 Enqueue 服務(wù)器成為了 ABAP 系統(tǒng)的單點(diǎn)故障源之一:當(dāng) Enqueue 服務(wù)器由于各種原因運(yùn)行時(shí)發(fā)生故障需要重啟時(shí),維護(hù)在內(nèi)存中的鎖信息表的數(shù)據(jù)會(huì)丟失。

因此為了確保 Enqueue 服務(wù)器的高可用性,通常將其放到單獨(dú)的物理主機(jī)上部署,甚至引入遵循主從機(jī)制的多臺(tái) Enqueue 服務(wù)器,將 Master Enqueue 服務(wù)器上的鎖信息管理表同步到其他 Enqueue 服務(wù)器上。

事務(wù)碼 SM12 查看某個(gè)用戶持有的應(yīng)用鎖:

SE11 里打開任意一個(gè)鎖對(duì)象,點(diǎn)擊 Lock Modules,進(jìn)入自動(dòng)生成的 ABAP 函數(shù)內(nèi)部,就可以了解鎖請(qǐng)求是如何從應(yīng)用服務(wù)器發(fā)送到 Enqueue 服務(wù)器的。

SAP Message Server
每個(gè) SAP 系統(tǒng)只能包含一個(gè)消息服務(wù)器,該組件負(fù)責(zé)完成以下任務(wù):
(1) 作為 SAP 系統(tǒng)內(nèi)多個(gè)應(yīng)用服務(wù)器實(shí)例間通訊的中央渠道
(2) 對(duì)來自客戶端通過 SAP GUI 和 SAP RFC 登錄請(qǐng)求的負(fù)載分發(fā)
當(dāng)一個(gè)應(yīng)用服務(wù)器實(shí)例啟動(dòng)后,其 Dispatcher 進(jìn)程就會(huì)聯(lián)系消息服務(wù)器,向其報(bào)告自己能夠提供的服務(wù)類型。
SAP 系統(tǒng)的消息服務(wù)器地址,可以在 SAP GUI 里維護(hù)該系統(tǒng)登錄信息的 Message Server 字段里查詢到。

上圖我登錄的 AG3 系統(tǒng)有多個(gè)應(yīng)用服務(wù)器實(shí)例,我登錄的實(shí)例編號(hào)為 54,使用事務(wù)碼 SM53 發(fā)現(xiàn)這個(gè)系統(tǒng)還有另外兩個(gè)實(shí)例,編號(hào)為 55 和 56.

忽視 SAP 系統(tǒng)可以由多個(gè)應(yīng)用服務(wù)器實(shí)例組成這一點(diǎn),有時(shí)候可能會(huì)遇到一些無法按照自己期望工作的場(chǎng)景. 比如數(shù)據(jù)庫性能測(cè)量工具 ST05,如果在實(shí)例 A 上打開跟蹤,而業(yè)務(wù)代碼實(shí)際執(zhí)行在實(shí)例 B 上,那么待分析性能的應(yīng)用執(zhí)行完畢后,在實(shí)例 A 上關(guān)閉跟蹤后,當(dāng)然看不到性能數(shù)據(jù)。這種情況下,最保險(xiǎn)的做法就是,在激活跟蹤時(shí),選擇“在所有實(shí)例上”打開跟蹤開關(guān)。

“ABAP 基礎(chǔ)知識(shí)有哪些”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注丸趣 TV 網(wǎng)站,丸趣 TV 小編將為大家輸出更多高質(zhì)量的實(shí)用文章!