Advertisement
mokaddeshrashid

loadbalancer

Jul 17th, 2025
157
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 2.73 KB | Source Code | 0 0
  1. package com.mokaddesh.ratelimtier.service;
  2.  
  3. import com.mokaddesh.ratelimtier.model.Server;
  4.  
  5. import java.util.ArrayList;
  6. import java.util.List;
  7. import java.util.concurrent.CopyOnWriteArrayList;
  8. import java.util.concurrent.Executors;
  9. import java.util.concurrent.ScheduledExecutorService;
  10. import java.util.concurrent.TimeUnit;
  11. import java.util.concurrent.atomic.AtomicInteger;
  12. import java.util.concurrent.locks.ReentrantReadWriteLock;
  13.  
  14. public class LoadBalancerImpl implements LoadBalancer {
  15.  
  16.     private final List<Server> servers = new ArrayList<>();
  17.     private final AtomicInteger lastUsedIndex = new AtomicInteger();
  18.     private final ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1);
  19.     private final HealthMonitoring healthMonitoring;
  20.     private final ReentrantReadWriteLock reentrantReadWriteLock = new ReentrantReadWriteLock();
  21.  
  22.     public LoadBalancerImpl(HealthMonitoring healthMonitoring) {
  23.         this.healthMonitoring = healthMonitoring;
  24.     }
  25.  
  26.     @Override
  27.     public void addServer(Server server) {
  28.         executeWriteLockOperation(() -> servers.add(server));
  29.     }
  30.  
  31.     @Override
  32.     public void removeServer(Server server) {
  33.         executeWriteLockOperation(() -> servers.remove(server));
  34.     }
  35.  
  36.     @Override
  37.     public Server getServer() {
  38.  
  39.         reentrantReadWriteLock.readLock().lock();
  40.         try {
  41.             if (servers.isEmpty()) {
  42.                 throw new RuntimeException("No server");
  43.             }
  44.             int attempt = servers.size();
  45.  
  46.             while (attempt > 0) {
  47.                 int currentNodeIdx = (lastUsedIndex.addAndGet(1)) % servers.size();
  48.                 if (servers.get(currentNodeIdx).isActive()) {
  49.                     return servers.get(currentNodeIdx);
  50.                 }
  51.                 attempt--;
  52.             }
  53.  
  54.             throw new RuntimeException("No active server");
  55.         } finally {
  56.             reentrantReadWriteLock.readLock().unlock();
  57.         }
  58.     }
  59.  
  60.     @Override
  61.     public List<Server> getAllServer() {
  62.         return servers;
  63.     }
  64.  
  65.     @Override
  66.     public void performHealthCheck() {
  67.         scheduledExecutorService.schedule(
  68.                 () -> {
  69.                     executeWriteLockOperation(() ->
  70.                             servers.forEach(server ->
  71.                                     server.setActive(healthMonitoring.checkHealth(server)
  72.                     )));
  73.                 }, 500, TimeUnit.MILLISECONDS
  74.         );
  75.     }
  76.  
  77.     private void executeWriteLockOperation(Runnable runnable) {
  78.         reentrantReadWriteLock.writeLock().lock();
  79.         try {
  80.             runnable.run();
  81.         } finally {
  82.             reentrantReadWriteLock.writeLock().unlock();
  83.         }
  84.     }
  85. }
  86.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement