Build fault-tolerant network services
—
Controls the frequency of method invocations with configurable time windows, minimum spacing between calls, and different rate limiting algorithms.
Standard rate limiting with time windows and invocation limits.
@RateLimit(
value = 100,
window = 1,
windowUnit = ChronoUnit.MINUTES,
minSpacing = 0,
minSpacingUnit = ChronoUnit.MILLIS,
type = RateLimitType.FIXED
)
public ReturnType rateLimitedMethod();value - Maximum invocations per time window (default: 100)window - Time window length (default: 1)windowUnit - Time unit for window (default: SECONDS)minSpacing - Minimum time between invocations (default: 0)minSpacingUnit - Time unit for min spacing (default: MILLIS)type - Rate limit algorithm type (default: FIXED)FIXED - Fixed time windowsROLLING - Rolling time windowsSMOOTH - Token bucket algorithm@ApplicationScoped
public class ApiController {
// Public API endpoint with rate limiting
@RateLimit(
value = 10,
window = 1,
windowUnit = ChronoUnit.MINUTES,
type = RateLimitType.ROLLING
)
public ApiResponse publicEndpoint(ApiRequest request) {
return apiService.process(request);
}
// Premium API with higher limits
@RateLimit(
value = 100,
window = 1,
windowUnit = ChronoUnit.MINUTES,
type = RateLimitType.SMOOTH
)
public ApiResponse premiumEndpoint(ApiRequest request) {
return premiumApiService.process(request);
}
// Batch operations with spacing
@RateLimit(
value = 5,
window = 10,
windowUnit = ChronoUnit.SECONDS,
minSpacing = 1000,
minSpacingUnit = ChronoUnit.MILLIS
)
public BatchResult processBatch(BatchRequest request) {
return batchProcessor.process(request);
}
}Protecting external API calls from exceeding provider limits.
@ApplicationScoped
public class ExternalServiceClient {
// Third-party API with strict rate limits
@RateLimit(
value = 50,
window = 1,
windowUnit = ChronoUnit.HOURS,
type = RateLimitType.FIXED
)
@Fallback(fallbackMethod = "getCachedData")
public ExternalApiResponse callThirdPartyApi(String query) throws RateLimitException {
return thirdPartyClient.query(query);
}
public ExternalApiResponse getCachedData(String query) {
return cache.get(query, ExternalApiResponse.class)
.orElse(ExternalApiResponse.empty());
}
// Google API with per-minute limits
@RateLimit(
value = 100,
window = 1,
windowUnit = ChronoUnit.MINUTES,
type = RateLimitType.ROLLING
)
@Retry(maxRetries = 3, delay = 5000)
public GoogleApiResponse callGoogleApi(GoogleApiRequest request) {
return googleApiClient.call(request);
}
// Social media API with burst and sustained limits
@RateLimit(
value = 15,
window = 15,
windowUnit = ChronoUnit.MINUTES,
type = RateLimitType.ROLLING
)
public SocialMediaPost postToSocialMedia(PostData data) throws RateLimitException {
return socialMediaClient.post(data);
}
}Rate limiting combined with other fault tolerance patterns.
@RateLimit(value = 20, window = 1, windowUnit = ChronoUnit.MINUTES)
@CircuitBreaker(requestVolumeThreshold = 10, failureRatio = 0.5)
@Retry(maxRetries = 2)
public ReturnType combinedStrategy();@ApplicationScoped
public class NotificationService {
// Email service with rate limiting and circuit breaker
@RateLimit(
value = 200,
window = 1,
windowUnit = ChronoUnit.HOURS,
type = RateLimitType.SMOOTH
)
@CircuitBreaker(requestVolumeThreshold = 15, failureRatio = 0.4)
@Fallback(fallbackMethod = "queueEmail")
public EmailResult sendEmail(EmailMessage message) throws EmailException {
return emailProvider.send(message);
}
public EmailResult queueEmail(EmailMessage message) {
emailQueue.enqueue(message);
return EmailResult.queued(message.getId());
}
// SMS service with strict rate limiting
@RateLimit(
value = 50,
window = 1,
windowUnit = ChronoUnit.MINUTES,
minSpacing = 500,
minSpacingUnit = ChronoUnit.MILLIS
)
@Timeout(10000)
@Retry(maxRetries = 2, delay = 2000)
public SmsResult sendSms(SmsMessage message) throws SmsException {
return smsProvider.send(message);
}
}Rate limiting based on user context or request attributes.
@ApplicationScoped
public class UserApiController {
@Inject
SecurityContext securityContext;
// Basic user operations
@RateLimit(
value = 60,
window = 1,
windowUnit = ChronoUnit.MINUTES,
type = RateLimitType.ROLLING
)
public UserData getUserData(String userId) {
// Rate limit is applied per user context
return userService.getData(userId);
}
// Premium user operations with higher limits
@RateLimit(
value = 500,
window = 1,
windowUnit = ChronoUnit.MINUTES,
type = RateLimitType.SMOOTH
)
public UserData getPremiumUserData(String userId) {
// Higher rate limits for premium users
return premiumUserService.getData(userId);
}
// File upload with size-based rate limiting
@RateLimit(
value = 10,
window = 1,
windowUnit = ChronoUnit.HOURS,
minSpacing = 30000,
minSpacingUnit = ChronoUnit.MILLIS
)
@Bulkhead(value = 3)
public UploadResult uploadFile(FileUploadRequest request) {
return fileUploadService.upload(request);
}
}Rate limiting for background processes and scheduled tasks.
@ApplicationScoped
public class BackgroundTaskService {
// Data synchronization with external system
@RateLimit(
value = 10,
window = 1,
windowUnit = ChronoUnit.MINUTES,
type = RateLimitType.FIXED
)
@Scheduled(every = "30s")
public void synchronizeData() {
dataSyncService.syncWithExternalSystem();
}
// Report generation
@RateLimit(
value = 5,
window = 1,
windowUnit = ChronoUnit.HOURS,
minSpacing = 600000,
minSpacingUnit = ChronoUnit.MILLIS
)
public ReportResult generateReport(ReportRequest request) {
return reportGenerator.generate(request);
}
// Cleanup operations
@RateLimit(
value = 1,
window = 1,
windowUnit = ChronoUnit.HOURS
)
@Scheduled(cron = "0 0 * * * ?")
public void performCleanup() {
cleanupService.cleanupOldData();
}
}// Rate limit algorithm types
enum RateLimitType {
FIXED, // Fixed time windows
ROLLING, // Rolling time windows
SMOOTH // Token bucket algorithm
}
// Rate limit exception
class RateLimitException extends RuntimeException {
public RateLimitException(String message);
public RateLimitException(String message, Throwable cause);
}
// Time units for rate limiting
enum ChronoUnit {
NANOS, MICROS, MILLIS, SECONDS, MINUTES, HOURS, HALF_DAYS, DAYS
}Install with Tessl CLI
npx tessl i tessl/maven-io-quarkus--quarkus-smallrye-fault-tolerance