java - 如何在不丢弃消息的情况下构建可靠的客户端限速器?
问题描述
我正在从我的 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 延迟队列来解决这个问题吗?这个问题有更好的解决方案/架构吗?
解决方案
推荐阅读
- amazon-web-services - 使用 eventbridge 检测 cloudwatch 日志中的错误
- c# - 将 URL 限制为特定数据库用户名 ASP.NET
- linux - 如何在禁用 SMP 支持的情况下运行“invd”指令?
- java - 如何将子类的字段值与超类字段值一起存储到 ArrayList 中?- 爪哇
- javascript - 以编程方式触发 React-Select 以选择/提交顶部选项?
- string - 为什么我无法重新分配这个基本变量值(GODOT 游戏引擎)
- laravel - 如何混合使用 Laravel 路由和 Vue 路由?
- laravel - ID 为空时如何使用 Laravel 的 updateOrCreate() 方法创建实例?
- r - 如何使用 ggpredict 创建图形
- python - 带有迭代的 inf 和 nan 值