批处理器
APISIX 批处理器会先将日志和指标等条目组成批次,再由插件将其发送到目标。在正常负载下,批处理可以减少网络操作次数;有界的待处理条目队列则可避免目标不可用时无限占用工作进程内存。
使用通用批处理器的插件会在配置中公开批处理参数。通过批处理器管理器集成的插件还会在其元数据中公开 max_pending_entries。error-log-logger 插件直接使用批处理器,不会公开此积压限制。
配置批次投递
以下参数用于控制 APISIX 发送批次的时机以及处理投递失败的方式。表中列出大多数使用此处理器的插件所采用的默认值;如有例外,请查阅相应插件的配置参考。
| 参数 | 默认值 | 描述 |
|---|---|---|
batch_max_size | 1000(lago 为 100) | 单个批次中的最大条目数。值为 1 时,每个条目都会立即发送。 |
inactive_timeout | 5(error-log-logger 为 3) | 在发送当前批次前,等待下一个条目的最长时间(秒)。此值应小于 buffer_duration。 |
buffer_duration | 60 | 在 APISIX 发送批次前,最早条目允许存在的最长时间(秒)。 |
max_retry_count | 0 | 投递失败后的最大重试次数。超过重试上限时,APISIX 会丢弃受影响的条目。 |
retry_delay | 1 | 投递失败后再次重试前的延迟时间(秒)。 |
实际批次大小取决于目标和插件。例如,目标可能对请求正文或消息大小设有限制。请选择合适的 batch_max_size,确保序列化后的批次不超过该限制。
配置待处理条目上限
对于通过批处理器管理器集成的插件,每个工作进程都会将待处理条目存储在内存中,直到目标接受这些条目或重试策略将其丢弃。APISIX 默认将积压限制为 8192 个条目。error-log-logger 不支持此限制。若要使用不同的限制,请在插件元数据中配置 max_pending_entries:
curl "http://127.0.0.1:9180/apisix/admin/plugin_metadata/http-logger" -X PUT \
-H "X-API-KEY: ${ADMIN_API_KEY}" \
-d '{
"max_pending_entries": 4096
}'
当积压达到配置的上限时,APISIX 会丢弃新条目,直到待处理任务数量降至该上限以下。APISIX 每秒最多向错误日志写入一次汇总信息:
max pending entries limit exceeded. discarding entry. total_pushed_entries: 12289 total_processed_entries: 4096 max_pending_entries: 8192 discarded_entries: 3172
该限制分别应用于每个工作进程。对于一个插件,可用 max_pending_entries 乘以工作进程数来估算网关的积压条目总数。然后还需考虑每个条目的大小,以及等待投递的所有序列化批次。