You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何排查WSO2 API Manager请求中介延迟过高的问题?

问题:WSO2 APIM 4.0.0网关请求延迟异常排查

测试WSO2 APIM 4.0.0时发现,直接调用后端端点速度正常,但通过APIM网关调用时额外增加1000-15000ms延迟,系统此前运行正常。查看wso2carbon日志发现,请求中介延迟偶尔会达到1000-15000ms。

额外背景:按照官方文档配置将分析数据发送至RabbitMQ,使用自定义类收集指标,代码如下:

自定义指标收集类

public class LogCounterMetric implements CounterMetric {

private static final Logger log = LoggerFactory.getLogger(LogCounterMetric.class);
private String name;
private MetricSchema schema;

public LogCounterMetric(String name, MetricSchema schema) {
    this.name = name;
    this.schema = schema;
}

@Override
public int incrementCount(MetricEventBuilder metricEventBuilder) throws MetricReportingException {
    Map<String, Object> properties = metricEventBuilder.build();
    String metricValue=properties.toString().replaceAll("[\\r\\n]", "");
    log.info("Metric Name: " + name.replaceAll("[\\r\\n]", "") + " Metric Value: "
            + metricValue);

    try {
        MessageSender messageSender=new MessageSender();
        messageSender.send(metricValue);
    } catch (IOException e) {
        e.printStackTrace();
        return 0;
    } catch (TimeoutException e) {
        e.printStackTrace();
        return 0;
    }
    return 0;
}
// other methods ommitted

}

RabbitMQ消息发送类

public class MessageSender {
private final static String EXCHANGE_NAME = "analytics_pipe_exchange";
private final static String PRIMARY_QUEUE_NAME = "analytics_pipe";
private final static String PRIMARY_ROUTING_KEY = "analytics.pipe_key";

public void send(String message) throws IOException, TimeoutException {
    ConnectionFactory factory = new ConnectionFactory();
    factory.setHost("host");
    factory.setUsername("user");
    factory.setPassword("user");
    try (Connection connection = factory.newConnection();
         Channel channel = connection.createChannel()) {
        channel.queueDeclare(PRIMARY_QUEUE_NAME, true, false, false, null);
        channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.TOPIC, true);
        channel.queueBind(PRIMARY_QUEUE_NAME, EXCHANGE_NAME, "analytics.*");
        channel.basicPublish(EXCHANGE_NAME, PRIMARY_ROUTING_KEY, null, message.getBytes());
    }
}

环境补充:RabbitMQ中的分析数据由自定义应用持久化至PostgreSQL;网关为双实例部署,前端通过Nginx负载均衡。


排查指引与建议

1. 优先排查自定义指标上报逻辑

  • RabbitMQ连接复用问题:当前MessageSender.send()方法每次发送消息都新建连接和通道,连接建立属于高耗时操作,高并发下会直接导致请求延迟突增。需改为复用连接池,初始化时创建单例连接/通道,避免每次请求重建资源。
  • 同步日志阻塞:incrementCount()方法中用log.info()打印大量指标内容,同步IO日志会阻塞请求处理线程。建议改为异步日志框架或降低日志级别。
  • 同步执行指标上报:指标发送逻辑在请求处理主线程中同步执行,若RabbitMQ响应慢或网络波动,会直接拖慢网关请求。需改为异步执行,比如用线程池异步提交发送任务,不阻塞主线程。

2. 网关层面排查

  • JVM性能问题:检查APIM网关的JVM参数配置,查看GC日志是否存在频繁GC或Full GC停顿,内存不足会导致请求延迟飙升。
  • 中介流复杂度:排查网关的中介流配置,是否存在复杂的转换、路由、限流逻辑,或自定义中介扩展存在性能瓶颈。
  • 负载均衡合理性:检查Nginx的负载均衡策略,确认是否存在请求分配不均导致单网关实例过载的情况。

3. 依赖服务排查

  • RabbitMQ状态:检查RabbitMQ是否存在消息堆积、连接数超限、磁盘IO过高的情况,这些问题会直接导致消息发送延迟。
  • PostgreSQL写入性能:下游持久化应用若处理缓慢,会导致RabbitMQ队列堆积,进而反向影响上游网关的消息发送效率。

4. 监控与日志补充

  • 分布式追踪:启用APIM的分布式追踪功能,追踪请求在网关各环节的耗时,精准定位延迟发生点。
  • 资源监控:实时监控网关实例的CPU、内存、网络IO指标,查看延迟发生时的资源使用情况。
  • RabbitMQ监控:增加RabbitMQ的消息发送耗时、成功率、队列长度等指标监控,确认消息链路是否存在瓶颈。

内容的提问来源于stack exchange,提问作者Frank

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 16:30:44