首批通过分布式安全可靠测评,为关键业务系统打造
流量控制
更新时间:2026-02-26 14:40:53
说明
本文档适用于 obcdc V3.2.4.5 之后版本、V4.0 之前以及 V4.2.1 之后的版本。
obcdc 流控能力可以在大部分场景下,将 obcdc 运行过程中使用的内存控制在用户预期附近。您可以通过 memory_limit 配置项调节您预期的 obcdc 内存占用。
obcdc 内部存在多个模块,事务数据在各模块间流转。整体数据生产消费模型可以粗略理解为多个串联起来的生产-消费模型,我们将流控调节分为两个大模块的内存控制:数据消费模块和拉日志模块。
数据消费模块限流
如果用户消费慢,我们会控制数据消费模块的任务下发进度,防止生产大量数据却得不到消费导致内存占用过多的情况。obcdc 根据消费队列和资源回收队列的任务积压情况判断下游消费速度:积压比例超过 pause_redo_dispatch_task_count_threshold/100,且内存占用达到报警阈值(memory_limit * memory_usage_warn_threshold/100),或处理中的 REDO 日志达到一定阈值)时,即判定下游消费速度慢。
您可以通过 NEED_PAUSE_REDO_DISPATCH=1 日志关键字从 libobcdc.log 中获取消费模块限流的日志,其中的 REASON 字段说明了具体的限流原因。
拉日志模块限流
以下情况,obcdc 将触发拉日志流控:
内存占用达到报警阈值(memory_limit * memory_usage_warn_threshold/100)。
内存中活跃事务超过一定阈值,且已经触发了数据消费流控。
定序模块任务积压。
数据持久化任务积压。
您可以通过 NEED_SLOW_DOWN=1 日志关键字从 libobcdc.log 中获取拉日志限流的日志,其中的 REASON 字段说明了具体的限流原因。
上文提到的部分参数说明如下:
| 配置项 | 默认值 | 取值范围 | 说明 |
|---|---|---|---|
| memory_limit | 8G | [2G, +∞) | 期望的 obcdc 的内存占用 |
| memory_usage_warn_threshold | 85 | [0,100] | 开始流控检测的内存占用阈值 |
| pause_redo_dispatch_task_count_threshold | 80 | [0, 100] | 触发消费模块限流的用户消费队列和资源回收队列的积压占比的阈值 |
obcdc 内部还有更多的细粒度的流控调整算法和响应的流控参数,这些参数可以根据您配置的 memory_limit 自适应调整,但很少部分场景下可能需要对这些参数进行微调。这里列出这些参数供参考。但大部分情况下,您不需要调整这些参数。
流控相关的 obcdc 会自动调节的配置项如下,详细介绍可参见 obcdc 配置项说明。
redo_dispatcher_memory_limit
extra_redo_dispatch_memory_size
redo_dispatched_memory_limit_exceed_ratio
part_trans_task_active_count_upper_bound
part_trans_task_reusable_count_upper_bound
ready_to_seq_task_upper_bound
storager_task_count_upper_bound
storager_mem_percentage