开始新任务的并行处理 - 前端屏幕超时

Parallel Processing with Starting New Task - front end screen timeout

我是 运行 一个处理大量数据的 ABAP 程序。 SAP 文档提供了我应该使用的信息 添加了 STARTING NEW TASK 以处理数据的远程功能模块。

所以我的程序首先选择所有的数据,将数据打包并调用一个带有数据包的功能模块进行进一步处理。

这就是我的伪代码:

Select KEYFIELD from MYSAP_TABLE into table KEY_TABLE package size 500.

 append KEY_TABLE to ALL_KEYS_TABLE.

Endselect.


Loop at ALL_KEYS_TABLE assigning <fs_table> .

  call function 'Z_MASS_PROCESSING'
     starting new TASK 'TEST' destination in group default
       exporting
           IT_DATA = <fs_table> .

Endloop .

但令我惊讶的是,我使用对话框进程而不是后台进程来调用我的功能模块。

所以现在我遇到了一个问题,因为超时,我的一个对话进程在 60 分钟后被杀死。

对我来说,STARTING NEW TASK 似乎不是并行处理海量数据的正确解决方案。

替代方案是什么?

要实现并行处理,您需要做的不仅仅是添加该子句。该信息包含在 this help topic 中。需要投入大量设计工作来确保并行处理的通信和结果合并开销不会抵消并行处理首先获得的性能优势,并且即使在某些情况下也能保持数据的引用完整性并行任务失败。不要低估这项任务的复杂性。

如前所述,这不是一个简单的主题,只需几行代码即可解决。要获得预期收益,您必须以深思熟虑的方式执行的一般步骤是:

1) 获取可用于并行处理的免费工作进程

2) 将您的数据分割成要处理的包

3) 为具有可用工作进程的每个包异步调用启用 RFC 的功能模块。处理等待空闲工作进程,如果包 > 可用进程

4) 异步接收结果

5) 等待一切处理完毕,再次合并数据,确保每个包都得到妥善处理

虽然仅 post 链接是不好的做法,但代码很长,会使这个答案变得非常混乱,因此请查看以下链接:

Example1-aRFC

Example2-aRFC

Example3-aRFC

可以找到其他 RFC 变体(例如 qRFC、tRFC 等)here 并附有简短描述,但遗憾的是无法让您进一步了解它们。

编辑:

Regarding process type of aRFC:

In parallel processing, a job step is started as usual in a background processing work process. (...)While the job itself runs in a background process, the parallel processing tasks that it starts run in dialog work processes. Such dialog work processes may be located on any SAP server.

服务器由 GROUP 指定(默认值:parallel_generators)参见事务 RZ12 并且可以拥有自己的资源,仅用于并行处理。如果您的过程超时,您必须将包分成不同大小。

您可以使用 bgRFC technique。这是SAP 提出的一种新的后台处理方式。

BgRFC 除了已经存在的 IN BACKGROUND TASK 之外,还可以配置和监控所有通过此方法 运行 的调用。

您可以在不同的可能性之间阅读更多文档here。这一切(当然)取决于您的 SAP 版本。

我认为,SAP 中并行处理的最佳方式是 Jagger 提到的银行并行处理框架。不幸的是,它在任何资源中都很少被提及,也没有得到很好的记录。 实际上,我找到的最好的文档是在这本书中

https://www.sap-press.com/abap-performance-tuning_2092/

是的,这很棘手。我花了大约 5 或 6 天的时间才让它继续运行。不过效果还是不错的。

所有内容都位于包 BANK_PP_JOBCTRL 中,您可以使用其名称进行谷歌搜索。

主要思想是将所有工作分成几个步骤(简化):

  1. 准备

  2. 并行处理

    2.1。加工准备

    2.2。加工 (其实还有很多步骤)

第一步未并行化。在这里,您应该准备所有数据以进行并行处理,并将其分配到 'piece' 中,这些数据将被并行处理。 反过来,片段的内容也可以是 ID 或预加载数据。 之后就可以运行并行处理第2步了。 所有这一切的最大好处是,一项并行工作中的错误不会导致所有处理崩溃。 我建议您查看功能组 BANK_API_PP_DEMO

中的演示