From 50d7dbe4dea37848fc1c2b35a088e03617f170b2 Mon Sep 17 00:00:00 2001 From: Deepanshu Rastogi Date: Fri, 8 Sep 2017 16:15:31 +0200 Subject: [PATCH] Seperated timer class and created Callscount class --- throttling/README.md | 4 +- throttling/etc/throttling-patern.png | Bin 67436 -> 0 bytes throttling/etc/throttling-pattern.png | Bin 0 -> 60408 bytes .../com/iluwatar/{tls => throttling}/App.java | 53 +++++++------ .../{tls => throttling}/B2BService.java | 50 ++++-------- .../com/iluwatar/throttling/CallsCount.java | 72 ++++++++++++++++++ .../iluwatar/{tls => throttling}/Tenant.java | 11 +-- .../throttling/timer/ThrottleTimerImpl.java | 58 ++++++++++++++ .../iluwatar/throttling/timer/Throttler.java | 36 +++++++++ .../java/com/iluwatar/throttling/AppTest.java | 37 +++++++++ .../{tls => throttling}/B2BServiceTest.java | 30 ++++---- .../{tls => throttling}/TenantTest.java | 4 +- 12 files changed, 266 insertions(+), 89 deletions(-) delete mode 100644 throttling/etc/throttling-patern.png create mode 100644 throttling/etc/throttling-pattern.png rename throttling/src/main/java/com/iluwatar/{tls => throttling}/App.java (64%) rename throttling/src/main/java/com/iluwatar/{tls => throttling}/B2BService.java (60%) create mode 100644 throttling/src/main/java/com/iluwatar/throttling/CallsCount.java rename throttling/src/main/java/com/iluwatar/{tls => throttling}/Tenant.java (90%) create mode 100644 throttling/src/main/java/com/iluwatar/throttling/timer/ThrottleTimerImpl.java create mode 100644 throttling/src/main/java/com/iluwatar/throttling/timer/Throttler.java create mode 100644 throttling/src/test/java/com/iluwatar/throttling/AppTest.java rename throttling/src/test/java/com/iluwatar/{tls => throttling}/B2BServiceTest.java (70%) rename throttling/src/test/java/com/iluwatar/{tls => throttling}/TenantTest.java (95%) diff --git a/throttling/README.md b/throttling/README.md index f31779573..efc966d04 100644 --- a/throttling/README.md +++ b/throttling/README.md @@ -10,11 +10,11 @@ tags: --- ## Intent -Ensure that a given tenant is not able to access resources more than the assigned limit. +Ensure that a given client is not able to access service resources more than the assigned limit. ![alt text](./etc/throttling-patern.png "Throttling pattern") ## Applicability The Throttling pattern should be used: * when a service access needs to be restricted to not have high impacts on the performance of the service. -* when multiple tenants are consuming the same resources and restriction has to be made according to the usage per tenant. +* when multiple clients are consuming the same service resources and restriction has to be made according to the usage per client. diff --git a/throttling/etc/throttling-patern.png b/throttling/etc/throttling-patern.png deleted file mode 100644 index baa03816d849fff6d1e2769bc3f3f0624bc1b4b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 67436 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 VXUB^NKM4W+hzrXI6$|M4{x8c4K?DE* diff --git a/throttling/etc/throttling-pattern.png b/throttling/etc/throttling-pattern.png new file mode 100644 index 0000000000000000000000000000000000000000..a31aa54cea121c248b0246f3b3245c7e9cba5551 GIT binary patch literal 60408 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 bmK}$}uk%ekN%DTE{} makeServiceCalls(adidasService); - Runnable nikeTask = () -> makeServiceCalls(nikeService); - - new Thread(adidasTask).start(); - new Thread(nikeTask).start(); + ExecutorService executorService = Executors.newFixedThreadPool(2); + + executorService.execute(() -> makeServiceCalls(adidas)); + executorService.execute(() -> makeServiceCalls(nike)); + + executorService.shutdown(); + try { + executorService.awaitTermination(10, TimeUnit.SECONDS); + } catch (InterruptedException e) { + LOGGER.error("Executor Service terminated: {}", e.getMessage()); + } } /** * Make calls to the B2BService dummy API * @param service an instance of B2BService */ - private static void makeServiceCalls(B2BService service) { - for (int i = 0; i < 500; i++) { + private static void makeServiceCalls(Tenant tenant) { + Throttler timer = new ThrottleTimerImpl(10); + B2BService service = new B2BService(timer); + for (int i = 0; i < 20; i++) { + service.dummyCustomerApi(tenant); +// Sleep is introduced to keep the output in check and easy to view and analyze the results. try { - service.dummyCustomerApi(); -// This block is introduced to keep the output in check and easy to view and analyze the results. - try { - Thread.sleep(10); - } catch (InterruptedException e) { - e.printStackTrace(); - } -// It can be removed if required. - } catch (AccessDeniedException e) { - LOGGER.error("### {} ###", e.getMessage()); + Thread.sleep(1); + } catch (InterruptedException e) { + LOGGER.error("Thread interrupted: {}", e.getMessage()); } } } diff --git a/throttling/src/main/java/com/iluwatar/tls/B2BService.java b/throttling/src/main/java/com/iluwatar/throttling/B2BService.java similarity index 60% rename from throttling/src/main/java/com/iluwatar/tls/B2BService.java rename to throttling/src/main/java/com/iluwatar/throttling/B2BService.java index e05a50583..c9acd4b73 100644 --- a/throttling/src/main/java/com/iluwatar/tls/B2BService.java +++ b/throttling/src/main/java/com/iluwatar/throttling/B2BService.java @@ -20,14 +20,13 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -package com.iluwatar.tls; +package com.iluwatar.throttling; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.nio.file.AccessDeniedException; -import java.util.Timer; -import java.util.TimerTask; +import com.iluwatar.throttling.timer.Throttler; + import java.util.concurrent.ThreadLocalRandom; /** @@ -35,52 +34,29 @@ import java.util.concurrent.ThreadLocalRandom; */ class B2BService { - private Tenant tenant; - private int callsCounter; - private static final Logger LOGGER = LoggerFactory.getLogger(B2BService.class); - /** - * A timer is initiated as soon as the Service is initiated. The timer runs every minute and resets the - * counter. - * @param tenant the Tenant which will consume the service. - */ - public B2BService(Tenant tenant) { - this.tenant = tenant; - Timer timer = new Timer(true); - - timer.schedule(new TimerTask() { - @Override - public void run() { - callsCounter = 0; - } - }, 0, 1000); + public B2BService(Throttler timer) { + timer.start(); } /** * * @return customer id which is randomly generated - * @throws AccessDeniedException when the limit is reached */ - public int dummyCustomerApi() throws AccessDeniedException { - LOGGER.debug("Counter for {} : {} ", tenant.getName(), callsCounter); - - if (callsCounter >= tenant.getAllowedCallsPerSecond()) { - throw new AccessDeniedException("API access per second limit reached for: " + tenant.getName()); + public int dummyCustomerApi(Tenant tenant) { + String tenantName = tenant.getName(); + int count = CallsCount.getCount(tenantName); + LOGGER.debug("Counter for {} : {} ", tenant.getName(), count); + if (count >= tenant.getAllowedCallsPerSecond()) { + LOGGER.error("API access per second limit reached for: {}", tenantName); + return -1; } - callsCounter++; + CallsCount.incrementCount(tenantName); return getRandomCustomerId(); } private int getRandomCustomerId() { return ThreadLocalRandom.current().nextInt(1, 10000); } - - /** - * - * @return current count of the calls made. - */ - public int getCurrentCallsCount() { - return callsCounter; - } } diff --git a/throttling/src/main/java/com/iluwatar/throttling/CallsCount.java b/throttling/src/main/java/com/iluwatar/throttling/CallsCount.java new file mode 100644 index 000000000..81195b074 --- /dev/null +++ b/throttling/src/main/java/com/iluwatar/throttling/CallsCount.java @@ -0,0 +1,72 @@ +/** + * The MIT License + * Copyright (c) 2014 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package com.iluwatar.throttling; + +import java.util.Map; +import java.util.Map.Entry; +import java.util.concurrent.ConcurrentHashMap; + +/** + * A class to keep track of the counter of different Tenants + * @author drastogi + * + */ +public final class CallsCount { + private static Map tenantCallsCount = new ConcurrentHashMap<>(); + + /** + * Add a new tenant to the map. + * @param tenantName name of the tenant. + */ + public static void addTenant(String tenantName) { + if (!tenantCallsCount.containsKey(tenantName)) { + tenantCallsCount.put(tenantName, 0); + } + } + + /** + * Increment the count of the specified tenant. + * @param tenantName name of the tenant. + */ + public static void incrementCount(String tenantName) { + tenantCallsCount.put(tenantName, tenantCallsCount.get(tenantName) + 1); + } + + /** + * + * @param tenantName name of the tenant. + * @return the count of the tenant. + */ + public static int getCount(String tenantName) { + return tenantCallsCount.get(tenantName); + } + + /** + * Resets the count of all the tenants in the map. + */ + public static void reset() { + for (Entry e : tenantCallsCount.entrySet()) { + tenantCallsCount.put(e.getKey(), 0); + } + } +} diff --git a/throttling/src/main/java/com/iluwatar/tls/Tenant.java b/throttling/src/main/java/com/iluwatar/throttling/Tenant.java similarity index 90% rename from throttling/src/main/java/com/iluwatar/tls/Tenant.java rename to throttling/src/main/java/com/iluwatar/throttling/Tenant.java index 33d97a51e..a720e154b 100644 --- a/throttling/src/main/java/com/iluwatar/tls/Tenant.java +++ b/throttling/src/main/java/com/iluwatar/throttling/Tenant.java @@ -20,7 +20,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -package com.iluwatar.tls; +package com.iluwatar.throttling; import java.security.InvalidParameterException; @@ -44,21 +44,14 @@ public class Tenant { } this.name = name; this.allowedCallsPerSecond = allowedCallsPerSecond; + CallsCount.addTenant(name); } public String getName() { return name; } - public void setName(String name) { - this.name = name; - } - public int getAllowedCallsPerSecond() { return allowedCallsPerSecond; } - - public void setAllowedCallsPerSecond(int allowedCallsPerSecond) { - this.allowedCallsPerSecond = allowedCallsPerSecond; - } } diff --git a/throttling/src/main/java/com/iluwatar/throttling/timer/ThrottleTimerImpl.java b/throttling/src/main/java/com/iluwatar/throttling/timer/ThrottleTimerImpl.java new file mode 100644 index 000000000..51c5e3c28 --- /dev/null +++ b/throttling/src/main/java/com/iluwatar/throttling/timer/ThrottleTimerImpl.java @@ -0,0 +1,58 @@ +/** + * The MIT License + * Copyright (c) 2014 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +/** + * + */ +package com.iluwatar.throttling.timer; + +import java.util.Timer; +import java.util.TimerTask; + +import com.iluwatar.throttling.CallsCount; + +/** + * Implementation of throttler interface. This class resets the counter every second. + * @author drastogi + * + */ +public class ThrottleTimerImpl implements Throttler{ + + private int throttlePeriod; + + public ThrottleTimerImpl(int throttlePeriod) { + this.throttlePeriod = throttlePeriod; + } + + /** + * A timer is initiated with this method. The timer runs every second and resets the + * counter. + */ + public void start() { + new Timer(true).schedule(new TimerTask() { + @Override + public void run() { + CallsCount.reset(); + } + }, 0, throttlePeriod); + } +} diff --git a/throttling/src/main/java/com/iluwatar/throttling/timer/Throttler.java b/throttling/src/main/java/com/iluwatar/throttling/timer/Throttler.java new file mode 100644 index 000000000..24b73d92f --- /dev/null +++ b/throttling/src/main/java/com/iluwatar/throttling/timer/Throttler.java @@ -0,0 +1,36 @@ +/** + * The MIT License + * Copyright (c) 2014 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +/** + * + */ +package com.iluwatar.throttling.timer; + +/** + * An interface for defining the structure of different types of throttling ways. + * @author drastogi + * + */ +public interface Throttler { + + void start(); +} diff --git a/throttling/src/test/java/com/iluwatar/throttling/AppTest.java b/throttling/src/test/java/com/iluwatar/throttling/AppTest.java new file mode 100644 index 000000000..37c8e75ec --- /dev/null +++ b/throttling/src/test/java/com/iluwatar/throttling/AppTest.java @@ -0,0 +1,37 @@ +/** + * The MIT License + * Copyright (c) 2014 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package com.iluwatar.throttling; + +import org.junit.Test; + +/** + * Application test + */ +public class AppTest { + + @Test + public void test() { + final String[] args = {}; + App.main(args); + } +} diff --git a/throttling/src/test/java/com/iluwatar/tls/B2BServiceTest.java b/throttling/src/test/java/com/iluwatar/throttling/B2BServiceTest.java similarity index 70% rename from throttling/src/test/java/com/iluwatar/tls/B2BServiceTest.java rename to throttling/src/test/java/com/iluwatar/throttling/B2BServiceTest.java index a9e043a95..b9ca1a1d8 100644 --- a/throttling/src/test/java/com/iluwatar/tls/B2BServiceTest.java +++ b/throttling/src/test/java/com/iluwatar/throttling/B2BServiceTest.java @@ -20,32 +20,30 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -package com.iluwatar.tls; +package com.iluwatar.throttling; import org.junit.Assert; import org.junit.Test; -import java.nio.file.AccessDeniedException; +import com.iluwatar.throttling.timer.ThrottleTimerImpl; +import com.iluwatar.throttling.timer.Throttler; /** * B2BServiceTest class to test the B2BService */ public class B2BServiceTest { - + @Test - public void counterResetTest() throws AccessDeniedException { - Tenant tenant = new Tenant("testTenant", 100); - B2BService service = new B2BService(tenant); - - for (int i = 0; i < 20; i++) { - service.dummyCustomerApi(); - try { - Thread.sleep(100); - } catch (InterruptedException e) { - e.printStackTrace(); - } + public void dummyCustomerApiTest() { + Tenant tenant = new Tenant("testTenant", 2); + Throttler timer = new ThrottleTimerImpl(10); + B2BService service = new B2BService(timer); + + for (int i = 0; i < 5; i++) { + service.dummyCustomerApi(tenant); } - int counter = service.getCurrentCallsCount(); - Assert.assertTrue("", counter < 11); + + int counter = CallsCount.getCount(tenant.getName()); + Assert.assertTrue("Counter limit must be reached", counter == 2); } } diff --git a/throttling/src/test/java/com/iluwatar/tls/TenantTest.java b/throttling/src/test/java/com/iluwatar/throttling/TenantTest.java similarity index 95% rename from throttling/src/test/java/com/iluwatar/tls/TenantTest.java rename to throttling/src/test/java/com/iluwatar/throttling/TenantTest.java index d29152e83..2f0b5cf12 100644 --- a/throttling/src/test/java/com/iluwatar/tls/TenantTest.java +++ b/throttling/src/test/java/com/iluwatar/throttling/TenantTest.java @@ -20,10 +20,12 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -package com.iluwatar.tls; +package com.iluwatar.throttling; import org.junit.Test; +import com.iluwatar.throttling.Tenant; + import java.security.InvalidParameterException; /**