我们在多个节点上部署了RESTful服务,我们希望限制每个客户端来自我们服务的呼叫数量,每个客户端每分钟有不同的配额。 我们的堆栈:Jboss应用服务器,Java / Spring RESTful服务。
实现这一目标的可能技术是什么?
答案 0 :(得分:5)
有时我读过a good article where the same theme was highlighted。 我的想法是将这个逻辑转移到负载平衡代理中,这里有一些很好的理由:
消除技术债务 - 如果您已将速率限制逻辑与应用逻辑相结合,那么您将获得不需要的技术债务。你可以解除和转移债务
效率提升 - 您正在卸载上游逻辑,这意味着您的所有计算资源都专用于计算。你可以更好地预测
安全性 - 众所周知,应用层(请求 - 响应)攻击正在增加,包括拒绝服务。通过利用具有更大连接容量的上游代理,您可以阻止这些攻击,因为它们永远不会到达实际服务器附近。
答案 1 :(得分:0)
如果访问您的API的唯一方法是通过您管理的UI客户端,那么您可以添加对客户端代码的检查(在Web应用程序的情况下为javascript),仅在未超过限制时才拨打电话那个用户。否则没有办法,因为用户总是可以访问您的API,而您在服务器级别唯一能做的就是检查是否发送错误或有效结果作为API响应的一部分。
答案 2 :(得分:-1)
要限制堆栈,这意味着您需要保持状态,至少基于某些特定的客户端标识。这可能要求您维护一个中央计数器,例如db(cassandra),它允许您每分钟查找当前请求计数,然后在java过滤器中,您可以根据需要限制请求计数。
或者,如果您可以跟踪客户端的会话,那么您可以跟踪然后使用粘性会话,强制客户端在客户端会话期间使用特定节点,因此您可以在java过滤器中进行跟踪,每个客户端的请求数量,以及发送503代码或更相关的内容。