如何排查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
相关产品推荐
相关产品推荐

