In a microservices architecture, implementing custom filters for Debouncing, Throttling, Rate Limiting, and Exponential Backoff helps in managing traffic efficiently and improving the overall performance of your services. These filters are usually applied at the API gateway or individual microservice level.
Setting up Custom Filters using Debouncing, Throttling,
Rate Limiting, and Exponential Backoff
You can create custom filters in a Spring Boot
microservice and configure them using the application.yml file. These filters
will be applied globally or to specific endpoints to control traffic and manage
retries.
1. Debouncing Filter
Debouncing helps to ensure that multiple quick
successive requests are handled with a delay to avoid overwhelming the service.
It is typically a client-side technique, but server-side, you can
debounce request handling using filters to prevent too frequent handling of the
same type of request.
YAML Setup for Debouncing:
This is uncommon in microservices but can be implemented
using a filter with a configurable delay between similar request types.
You could implement a custom filter that delays
requests and configure it in application.yml.
YAML Configuration:
yaml
debounce: enabled: true delay: 500 # Delay in milliseconds before
handling the next similar request |
Debouncing Filter in Java:
java
@Component public class
DebounceFilter extends OncePerRequestFilter { @Value("${debounce.delay}") private long debounceDelay; private final Map<String, Long>
requestTimestamps = new ConcurrentHashMap<>(); @Override protected void
doFilterInternal(HttpServletRequest request, HttpServletResponse response,
FilterChain filterChain) throws ServletException,
IOException { String key = request.getRemoteAddr()
+ request.getRequestURI(); long currentTime =
System.currentTimeMillis(); if
(requestTimestamps.containsKey(key)) { long lastRequestTime =
requestTimestamps.get(key); if (currentTime - lastRequestTime
< debounceDelay) {
response.setStatus(HttpStatus.TOO_MANY_REQUESTS.value()); return; } } requestTimestamps.put(key,
currentTime); filterChain.doFilter(request,
response); } } |
2. Throttling Filter
Throttling limits the number of requests handled by
the server in a fixed time interval.It controls the frequency of request
handling, ensuring that the server handles only a certain number of requests in
a fixed time window.
YAML Setup for Throttling:
You can configure throttling by setting a fixed request
limit in a specific time window.
yaml
throttle: enabled: true max-requests: 10 # max number of requests time-window: 60s # time window (60 seconds) |
Throttling Filter in Java:
java
@Component public class
ThrottleFilter extends OncePerRequestFilter {
@Value("${throttle.max-requests}") private int maxRequests;
@Value("${throttle.time-window}") private long timeWindow; // in
milliseconds private final Map<String,
List<Long>> requestTimestamps = new ConcurrentHashMap<>(); @Override protected void
doFilterInternal(HttpServletRequest request, HttpServletResponse response,
FilterChain filterChain) throws ServletException,
IOException { String clientIP =
request.getRemoteAddr(); long currentTime =
System.currentTimeMillis(); List<Long> timestamps =
requestTimestamps.getOrDefault(clientIP, new ArrayList<>()); timestamps.removeIf(timestamp ->
currentTime - timestamp > timeWindow); if (timestamps.size() >=
maxRequests) {
response.setStatus(HttpStatus.TOO_MANY_REQUESTS.value()); return; } timestamps.add(currentTime); requestTimestamps.put(clientIP,
timestamps); filterChain.doFilter(request,
response); } } |
3. Rate Limiting Filter
Rate Limiting restricts the number of API requests
that a user or client can send over a specific time window. It allows
you to restrict the number of requests a client can send within a certain
period. It’s often used to prevent abuse of the API by malicious users.
YAML Setup for Rate Limiting:
You can configure rate limiting in application.yml by
defining the maximum number of requests a user can send in a time frame.
yaml
rate-limiting: enabled: true max-requests: 100 # Number of requests allowed time-window: 60s # Time period (e.g., 60 seconds) |
Rate Limiting Filter in Java:
java
@Component public class
RateLimitingFilter extends OncePerRequestFilter {
@Value("${rate-limiting.max-requests}") private int maxRequests;
@Value("${rate-limiting.time-window}") private long timeWindow; // in
milliseconds private final Map<String,
List<Long>> clientRequests = new ConcurrentHashMap<>(); @Override protected void
doFilterInternal(HttpServletRequest request, HttpServletResponse response,
FilterChain filterChain) throws ServletException,
IOException { String clientKey =
request.getRemoteAddr(); long currentTime =
System.currentTimeMillis(); List<Long> timestamps =
clientRequests.getOrDefault(clientKey, new ArrayList<>()); timestamps.removeIf(timestamp ->
currentTime - timestamp > timeWindow); if (timestamps.size() >=
maxRequests) {
response.setStatus(HttpStatus.TOO_MANY_REQUESTS.value()); return; } timestamps.add(currentTime); clientRequests.put(clientKey,
timestamps); filterChain.doFilter(request,
response); } } |
4. Exponential Backoff Filter
Exponential Backoff allows for handling retries by
increasing the delay between retry attempts exponentially. This technique is
often used when a service temporarily fails or is overloaded.
It is a technique used to retry failed requests, but
the retry intervals increase exponentially. This is often used in microservices
to avoid overwhelming the service or server when failures occur.
YAML Setup for Exponential Backoff:
You can configure the initial delay, maximum delay, and the
backoff multiplier in application.yml
yaml
exponential-backoff: enabled: true initial-delay: 1s # Start with 1 second delay max-delay: 64s # Maximum retry delay backoff-multiplier: 2 # Double the delay after each failure |
Exponential Backoff Filter in Java:
java
public class
ExponentialBackoffRetryHandler { private final long initialDelay; private final long maxDelay; private final int backoffMultiplier; public
ExponentialBackoffRetryHandler(long initialDelay, long maxDelay, int
backoffMultiplier) { this.initialDelay = initialDelay; this.maxDelay = maxDelay; this.backoffMultiplier =
backoffMultiplier; } public void executeWithBackoff(Runnable
task) throws InterruptedException { long delay = initialDelay; while (true) { try { task.run(); return; } catch (Exception e) { if (delay > maxDelay) { throw new
RuntimeException("Exceeded max retry attempts"); }
System.out.println("Retrying in " + delay +
"ms..."); Thread.sleep(delay); delay *= backoffMultiplier; } } } } |
Usage Example:
java
public class
BackoffRetryExample { public static void main(String[] args)
throws InterruptedException { ExponentialBackoffRetryHandler
backoff = new ExponentialBackoffRetryHandler(1000, 64000, 2); backoff.executeWithBackoff(() -> { // Your task to retry if (Math.random() > 0.3) { throw new
RuntimeException("Simulated failure"); } System.out.println("Task
succeeded"); }); } } |
Setting Up Filters in Spring Boot with YAML Configuration
- Define
filters as beans or components in your Spring Boot application.
- Use
application.yml to configure the filters dynamically.
- Activate
or deactivate filters based on the configuration settings in application.yml.
Example YAML Configuration:
yaml
filters: debounce: enabled: true delay: 500 throttle: enabled: true max-requests: 10 time-window: 60s rate-limiting: enabled: true max-requests: 100 time-window: 60s exponential-backoff: enabled: true initial-delay: 1s max-delay: 64s backoff-multiplier: 2 |
Conclusion
By implementing custom filters for Debouncing, Throttling, Rate Limiting, and Exponential Backoff in a Spring Boot microservices application, you can manage incoming traffic effectively and prevent your services from being overwhelmed. Using YAML configurations allows you to dynamically adjust the filter settings without modifying the source code. This is particularly useful in production environments where flexibility is essential for maintaining service stability and performance.
For more information, visit
Ø
Microservices:
Custom Filters for Debouncing, Throttling, Rate Limits & Backoff
Ø
Mastering Debouncing, Throttling, Rate Limiting, and Exponential
Backoff.
Ø
Custom
Filters in Microservices
Ø
Spring
Cloud Gateway uses a RewritePath filter
Flowchart of Debouncing, Throttling, Rate Limiting, and Exponential Backoff |
For More Related information, visit
Ø
Mastering
Debounce, Throttle, Rate Limit & Backoff in Java
Ø Deep understand of ThrottlingFilter with RewritePath filter in cloud gateway
Ø Custom
gateway filters in Spring Cloud Gateway
Ø Custom
Filters in Microservices
Ø Mastering
Debounce, Throttle, Rate Limit & Backoff in Java
Ø Microservices:
Custom Filters for Debouncing, Throttling, Rate Limits & Backoff
Ø Spring
Cloud Gateway uses a RewritePath filter
For More DSA Related information, visit
Ø
Bench
mark of compiler using Ackerman function
Ø
To
check if the rows of a matrix are circularly identical in Java
Ø
Frequency
Weaving Logic & Spiral Printing of a Rectangle
Ø
Zig Zag
Matrix print multiple way
Ø
Gready
Algorithm’s or knapsack algorithms
Ø
understanding
recursive method for binary tree
Ø
Dynamic
Programming: Max Square Sub-matrix of 1s in a Matrix
Ø
Previous and
Next Date Palindrome
Ø
Karatsuba's
Algorithm for multiplying two large numbers
Ø
Multiplication
In different Way
Ø
Time
Analysis for Congested Routes Using Shortest Path Algorithms
Ø
Sorting
Of a list multiple attribute wise two technique
Ø
Seat
Arrangement in Sorting Order Like 1A-1E, 3C-3G etc
For More Java Related information, visit
Ø
Streams
Lambdas Collectors and Functional Interfaces in Java 8
Ø
Java
8 support static method or default method or both in the interface
Ø
Serialization
understanding
Ø
Garbage
Collection Under Standing
Ø
How
work Garbage Collection in Java
Ø
Under
Standing Of Mutable and Immutable Class
For Other information, visit
Ø
How
to get the neighbor of binary tree
Ø OWASP
(Open Web Application Security Project)
Ø Mastering
Debounce, Throttle, Rate Limit & Backoff in Java
Ø How
to draw sequence diagram and other diagrams using plantuml
Ø
Molecular
weight of chemistry in Java code
Ø
String
to xml or html Beautifier
Ø
Key
Components of Apache Kafka for Scalable Messaging
Ø
Build
a Video Stream Microservice with Kafka & REST API in Java
Ø
Kafka
general questions and answers
Ø
How
to convert XML to Object and Object to XML
Ø
To
securely obtain employee information utilizing TLS 1.3 or TLS 1.2
Ø
Convert
Floating-Point Values from SQL Server to Oracle in Java
Ø
Mastering
Design Patterns Practical Implementation Tips
Ø
0 Comments