GuiceとSitebricksを使用して独自の動的レート制限を作成するのは非常に簡単です。メソッド インターセプターを使用すると、サーブレットごとの IP アドレスごとのリクエスト数をカウントできます。これらのカウンターはmemcacheに保存でき、独自のルールに基づいてリクエストを迅速に失敗させるために使用できます。それらは完全にアプリケーション固有のものです。
@Service
class Servlet {
@Get
@At("/your/servlet")
@IpRateLimited
public Reply<?> foo(Request request) {
return Reply.with("Hello World");
}
}
class IpBasedRateLimiter implements MethodInterceptor {
public Object invoke(final MethodInvocation invocation) throws Throwable {
// Inspect the request argument on the invoked method to get the IP address
if (isDenialOfServiceAttempt(invocation)) {
// Fail the request
return Reply.saying().error();
} else {
// Continue executing the original request
return invocation.proceed();
}
}
}
...
bindInterceptor(Matchers.any(), Matchers.annotatedWith(IpRateLimited.class),
new IpBasedRateLimiter());
...
DOS の試みを検出するために使用される CPU 時間に対しては、依然として料金を支払う必要があります。ただし、アルゴリズムが十分に積極的である限り、これらのコストは最小限に抑えられます。たとえば、1 回の memcache の取得と状態のチェックです。これは、GAE が独自の動的 DOS 保護を提供するまで、私が行うことです。