SAP中的不同RFC类型,包括同步RFC(sRFC),异步RFC(aRFC),并行RFC(pRFC),事务RFC(tRFC),队列RFC(qRFC),后台RFC(bgRFC)以及本地数据队列(LDQ)。每种类型都有其特定的使用场景和优缺点,例如tRFC保证ExactlyOnce执行,而bgRFC提供了解耦和并行化的能力。此外,还解释了SM59远程连接的不同类型,如ABAP连接、R/2连接和逻辑目标等。
一、RFC类型
1. 同步sRFC
-
同步RFC(sRFC,synchronous RFC)是RFC最原始版本,是最基本的RFC形式,其执行基于同步通信模式,远程调用时,通信双方系统必须处于可用状态,调用程序等待远程功能处理结束并返回结果。在SRFC调用中,调用这会等待远程被调用者的处理过程。
- 语法形式:
CALL FUNCTION 'rfm_name'
DESTINATION dest
EXPORTING
...
IMPORTING
...
CHANGING
...
TABLES
...
EXCEPTIONS
...
2. 异步aRFC
异步RFC(aRFC,asynchronous RFC)执行并不依赖RFC服务器系统的可用性,被调用的远程功能启动之后,调用程序继续运行,远程功能和调用程序处理互不影响,独立运行。远程功能调用结构可以稍后接收(在做并行aRFC时一定要考虑负载性能)
PERFORMING frm_return_proc ON END OF TASK
可用于接收远程模块返回结果或异常,并通过指定的FORM处理
WAIT UNTIL log_exp [UP TO sec SECONDS]
用于异步RFC调用中等待结果的返回,并必须搭配 PERFORMING语句
KEEPING TASK 用于相同任务名称的异步RFC启用时保持远程上下文,即使用相同的TASK
异步aRFC类似于tRFC,用户在继续调用会话之前,不需要等待它们的完成。
aRFC和tRFC之间也存在几点不同的地方:
当调用者开始一个aRFC的时候,被调用的服务器必须可以接收请求。aRFC的参数不会记录在数据库中,而是直接发送给对方服务器。
aRFC允许用户与远程系统进行交互式对话。
调用程序可以从aRFC接收结果。
- 语法形式:
CALL FUNCTION 'rfm_name'
DESTINATION dest
STARTING NEW TASK taskname
PERFORMING frm_return_proc ON END OF TASK "接收远程模块返回结果或异常
EXPORTING
...
CHANGING
...
TABLES
...
EXCEPTIONS
...
...
WAIT UNTIL log_exp [up to sec seconds]. "挂起进程等待
...
FORM frm_return_proc USING taskname. "处理函数
...
RECEIVE RESULTS FROM FUNCTION 'rfm_name' "获取返回参数
KEEPING TASK "保持远程上下文
IMPORTING
...
TABLES
...
EXCEPTIONS
...
...
ENDFORM.
3. 并行pRFC
-
并行RFC(pRFC,parallel RFC)本质上也属于异步RFC,功能上可实现多个SAP系统或者单个SAP系统内部不同应用服务器间或者应用服务器内部各应用进程间的并行处理
-
通过SM59->RFC组对现有应用服务器分组
RFC调用时则可指定执行的RFC应用服务器组,关键字DESTINATION IN GROUP '组名'.
还可以使用 DEFAULT 关键字,系统将从全部可能的应用服务器中选择一个来执行RFC调用.
- 为了并行处理,SAP服务器至少有3个空闲的Dialog工作过程;同时需要满足调度器队列(dispatcer queue)必须低于10%负载,否则将触发RESOUCE_FAILURE异常
- 并行RFC同样适用 PERFORMING WAIT UNTIL KEEPING TASK 等异步RFC语法
- 语法形式:
CALL FUNCTION 'rfm_name'
DESTINATION IN GROUP 'group_name' "group_name OR default
STARTING NEW TASK taskname
EXPORTING
...
TABLES
...
EXCEPTIONS
RESOURCE_FAILURE = 3
...
4. 事务tRFC
在使用事务RFC( transactional RFC,tRFC)的时候,被调用的函数模块在被调用系统中正好运行一次(Exactly Once)。
系统可用性:如果远程系统不可用,SAP系统会将报表RSARFCSE计划为后台作业,并将相关的事务ID作为变式,再进行处理。这个报表程序会重复地被调用,直到它成功地连接对方系统为止。
tRFC的缺点:
tRFC独立地处理所有LUW。根据激活的tRFC数量,程序有可能会显著地降低调用系统和被调用系统的性能。
此外,在应用中定义的LUW的调用顺序是不能得到保持的。因此无法保证事务会按照应用期望的顺序运行。tRFC唯一能保证的只有:所有LUW都会或早或晚地被传输。
5. 队列qRFC
队列RFC(queued Remote Function Call,qRFC)是tRFC的一个扩展。它允许你将多个tRFC调用序列化为一个队列。
qRFC调用会首先被函数模块TRFC_SET_QUEUE_NAME进行序列化处理,然后这些调用被一个tRFC进行实际上的dispatch。
qRFC可以作为外向队列(由调用系统序列化)处理,或者是内向队列(由被调用系统序列化)。
6. 后台bgRFC
bgRFC(Background Remote Function Call)允许被调用程序稍晚一些接收数据,而不是同步接收。接收数据的时候,需要保证数据只出现一次且无序( transactional) 、或者只出现一次且有序(queued)。
后台RFC(bgRFC,Background RFC) 允许应用程序记录稍后由被调用应用程序接收的数据。接收到数据后,您必须确保数据仅以任意顺序( 事务性)传输一次或仅以创建顺序( 排队)传输一次。
ABAP 710开始,bgRFC 是对原来 tRFC 和 qRFC的重新设计,理论上性能更优;NW RFC SDK 也支持 bgRFC(NW RFC SDK 本身将 bgRFC 调用视为 tRFC 调用,实际处理并任何差异)
Reference:bgRFC Programming
bgRFC之tRFC(tRFC,Transaction RFC)
事务性RFC(tRFC,transactional RFC)广义上也属于异步RFC,调用程序不接受调用结果而继续执行,但不立即启动远程调用功能;关联的RFC被捆绑为一个事务,然后通过事务性处理;被捆绑的Task整体提交处理,其中一个失败,则全部取消;全部成功则提交处理;保证了数据一致性
ABAP 7.0 以后可用面向对象的调用方式 ref_obj参照接口 IF_BGRFC_UNIT实现类的对象
多LUW处理
- 每个tRFC调用都有一个独特的事务ID(Transactional ID,TID)存储于本地数据表ARFCSSTATE ARFCSDATA
- SM58->tRFC 状态(ARFCSSTATE) LUW执行状态查看
语法形式:
CALL FUNCTION 'rfm_name'
IN BACKGROUND TASK
[DESTINATION dest]
EXPORTING
...
TABLES
...
[AS SEPARATE UNIT]
或者:
CALL FUNCTION 'rfm_name'
IN BACKGROUND UNIT ref_obj
EXPORTING
...
TABLES
...
bgRFC之qRFC(qRFC,queued RFC)
队列RFC(qRFC,queued RFC)是事务性RFC功能上的进一步扩展。事务性RFC中,存在多个LUW时,LUW执行次序无法确定。如果需要LUW按照指定顺序执行,可通过队列RFC对事务性RFC进行序列化
Reference:qRFC Programming
语法形式:
CALL FUNCTION 'TRFC_SET_QUEUE_NAME'
EXPORTING
qname = 'ZRFC_QUEUE01'
EXCEPTIONS
invalid_queue_name = 1
OTHERS = 2.
CALL FUNCTION 'rfc_name1'
IN BACKGROUND TASK
DESTINATION dest
EXPORTING
...
TABLES
...
CHANGING
...
EXCEPTIONS
...
CALL FUNCTION 'TRFC_SET_QUEUE_NAME'
EXPORTING
qname = 'ZRFC_QUEUE02'
EXCEPTIONS
invalid_queue_name = 1
OTHERS = 2.
CALL FUNCTION 'rfc_name2'
IN BACKGROUND TASK
DESTINATION dest
EXPORTING
...
TABLES
...
CHANGING
...
EXCEPTIONS
...
...
COMMIT WORK.
...
使用bgRFC进行异步调用,会有如下优势:
在同一个SAP系统内(同一个系统ID,同一个client):解耦,同时提供了并行化能力。负载会分布在该系统的可用的应用服务器上。这个bgRFC场景被看作一个内向程序。
在两个远程SAP系统间:解耦,并且由此可以实现应用或业务场景的物理细分。异步调用的结果是,调用者和被调用者的应用服务器的关键特性差异可以得到平衡。记录工作在调用系统中完成。这个场景是一个外向程序。
两个程序结合为外-内程序:该方式可以获得全部优化选项的优势。不过,如果你选择了这样做,数据会被记录两次,一次是调用者(外向处理)、一次是被调用应用( 内向程序的特殊类型)。这导致数据库、应用服务器会有额外的负担。
bgRFC使用队列组织不同的调用。当一个调用同时被放置在多个队列的时候,系统会为这些队列创建依赖。这带来了一个同步点(synchronization point),类似于锁。
如果一个调用处于依赖队列中,那么当且仅当它位于依赖队列的最上层时,它才会被处理。
对于同一个destination,不可以将bgRFC和tRFC、qRFC结合起来使用。不过,对于不同的destination,你可以定义你想使用的通讯类型。
7. 本地数据队列LDQ
本地数据队列(Local Data Queue )是一种特别的RFC通信。在这种应用情况下,系统不会主动发送数据。相反,根据拉取规则,系统会把数据存储在本地,直到被外部系统调用(比如移动设备)。
LDQ可以代替先前由qRFC在不发送场景下提供的功能(qRFC No Send)。相比之下它提供了更有效率的数据模型。
二、SM59远程连接(RFC connection)类型含义
类型I(内部连接):与当前系统连接到同一数据库的ABAP系统,需要填入hostname。这种类型的条目都是预定义的且无法修改。条目名称与事务SM51中所显示的应用服务器名相同。
比如同一个测试QAS系统对应同一套环境
类型3(ABAP连接或称R/3连接):创建时必须给出主机名和通信服务。如果需要,也可以指定登录信息。还可以选择负载平衡选项。
类型2(R/2连接):只需给出主机名,所有通信信息都已在存储在SAP网关的sideinfo表中,如果需要,也可以指定登录信息
类型T:定义通过TCP/IP并使用RFC库或SAP连接器的外部程序连接。该类型分为启动和注册两种连接模式。如果设为启动模式,必须指定要启动的主机名和程序路径名;如果设为注册模式,则需要指定一个RFC服务器程序(RFC 注册程序)。
类型L(逻辑目标):该条目不指定连接,而是参照物理目标生成。也可以参照其他逻辑目标生成。这类条目通常除包含所参照的条目中的信息外,还添加额外信息。一般情况下,所参照的条目会给出主机信息,类型L的条目本身给出登录数据。(通常工作流系统定制过程中需配置的RFC目标即为该类型的逻辑目标)
类型S:定义通过SNA或APPC启动的外部程序连接。
类型X:指定安装了特殊ABAP设备驱动程序的系统。在创建类型X条目时,必须给出ABAP设备驱动程序名。
类型M:定义通过CMC(即协议X.400)到ABAP系统中异步RFC连接。
类型H:定义ABAP系统到本地的HTTP连接
类型G:定义外部系统到本地的HTTP连接
比如:SAP与PI服务器的连接配置
三. 本地调用的远程功能
使用 DESTINATION ‘NONE’ 关键字,调用将会以远程的方式调用,但是调用的功能位于当前应用系统中
当使用 DESTINATION SPACE 关键字,此关键字被忽略,即使用常规本地调用
语法形式:
CALL FUNCTION 'rfc_name'
IN BACKGROUND TASK
DESTINATION 'NONE'
EXPORTING
...
TABLES
...
CHANGING
...
EXCEPTIONS
...
四. 远程回调功能
使用 DESTINATION ‘BACK’ 关键字,将开启远程回调功能;即被调用方可通过已建立的Session调用调用方系统内部的Function
当使用 DESTINATION SPACE 关键字,此关键字被忽略,即使用常规本地调用
语法形式:
CALL FUNCTION 'rfc_name'
IN BACKGROUND TASK
DESTINATION 'NONE'
EXPORTING
...
TABLES
...
CHANGING
...
EXCEPTIONS
...