首页 > 解决方案 > 如何在不丢弃消息的情况下构建可靠的客户端限速器?

问题描述

我正在从我的 java 代码调用外部 REST API 服务,以防止该外部 API 过载,我需要确保每秒对服务 S 的调用不超过 N 次。并且需要确保没有一个函数调用被丢弃

我的功能看起来像

public callXXXAPI(JSONObject message){

formatData(message);

//GET
//REST API
JSONObject response = getDataFromexternalAPI(message);

contineNextProcess(response);

}

此方法 callXXXAPI 将从 Kafka 消费者异步调用。

我需要控制调用外部 api 的次数。

即假设消息在 Kafka 中高速消耗(每秒 1000000 条消息),但我需要每秒调用外部服务 1000 次(可配置)。我不想拒绝其他消息。

我无法解决 Google Guava 的速率限制器的问题,因为当更多的消息被消耗并且更多的线程将等待下一秒并且它会溢出时。我应该使用任何外部 JMS 延迟队列来解决这个问题吗?这个问题有更好的解决方案/架构吗?

标签: javaspringapache-kafkajms

解决方案


推荐阅读