【问题标题】:wso2 bps OutOfMemoryError - inefficient event listwso2 bps OutOfMemoryError - 事件列表效率低下
【发布时间】:2023-06-19 14:07:01
【问题描述】:

在使用 WSO2 BPS 3.6.0 时,我们偶尔会遇到 OutOfMemoryError 并且服务器已停止。经过堆分析,我们怀疑:

我们有一些流程会定期查找某些信息(使用 Web 服务),直到业务项目状态未更改。一段时间后,一些流程实例可能有很多事件(数千个,大约 10k 个)。当试图在 carbon 控制台中查看实例信息时,加载的数据(实例活动)能够导致 en OutOfMemoryError 并丢弃服务器(具有 6GB RAM):(

作为一种解决方法 - 我们使用数据库查找:

select ode_event.event_id, ode_event.detail, ode_event.tstamp, ode_event.type,
ode_event.instance_id, ode_event.process_id,
ode_scope.scope_name
from ode_event, ode_scope where ode_event.instance_id=18204 and 
(ode_event.scope_id = ode_scope.scope_id);

虽然我们认为让任何业务用户(甚至是流程所有者)直接访问数据库的想法非常糟糕。

有没有(更好的)方式/查询来查看活动?哪个是放置改进/功能(加载活动分页)的正确 github 项目?

编辑:

查看源代码,这种“行为”继承自 Apache-ODE 实现(急切地将整个范围和事件列表加载到内存中)

【问题讨论】:

    标签: wso2 apache-ode wso2bps


    【解决方案1】:

    这是当前行为。我们可以通过添加分页来改进它。但这就是原因,没有优先考虑。

    如果您检查各个数据库表的大小,您会发现事件表已经占用了大部分空间。这是因为,进程调试级别事件默认启用,它会生成大量事件。这些事件在开发时很有用,但在生产时,您必须禁用它们。否则,您将浪费生产资源(CPS、内存、数据库空间)。它将影响整个 BPS 引擎的性能。

    以下是一些一般性建议。

    如果您有较大且运行时间较长的进程,建议仅对您需要监控的选定范围启用事件。 (如果你没有就更好了。:))

    此外,您还需要不断地清理数据库中的旧数据。 (只需 google BPS Documentation for scripts)否则您的 DBA 会抱怨 DB 在不久的将来没有足够的空间来运行。 :)

    流程执行不需要事件。所以你可以清理它。在您的场景中,是否可以清理活动 BPEL 流程的旧事件?例如:清理事件早于 1/2/7.. 天。 ?.这将在一定程度上解决您的问题。

    【讨论】:

    • 感谢您的回答。恕我直言,审计跟踪是 BPM 领域最有价值的功能之一。显然我们将不得不与事件表分开实施审计/简化事件历史:(至少知道限制是好事