diff --git a/src/main/java/ru/dragonestia/loadbalancer/model/Bucket.java b/src/main/java/ru/dragonestia/loadbalancer/model/Bucket.java new file mode 100644 index 0000000..8299228 --- /dev/null +++ b/src/main/java/ru/dragonestia/loadbalancer/model/Bucket.java @@ -0,0 +1,26 @@ +package ru.dragonestia.loadbalancer.model; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import ru.dragonestia.loadbalancer.model.type.SlotLimit; + +@Getter +@RequiredArgsConstructor +public class Bucket { + + private final String identifier; + private final String nodeIdentifier; + private final SlotLimit slots; + private final String payload; + private boolean locked = false; + + public void setLocked(boolean value) { + locked = value; + } + + public boolean isAvailable(int usedSlots, int requiredSlots) { + if (locked) return false; + if (slots.isUnlimited()) return true; + return slots.getSlots() >= usedSlots + requiredSlots; + } +} diff --git a/src/main/java/ru/dragonestia/loadbalancer/model/Node.java b/src/main/java/ru/dragonestia/loadbalancer/model/Node.java new file mode 100644 index 0000000..6ecc450 --- /dev/null +++ b/src/main/java/ru/dragonestia/loadbalancer/model/Node.java @@ -0,0 +1,6 @@ +package ru.dragonestia.loadbalancer.model; + +import lombok.NonNull; +import ru.dragonestia.loadbalancer.model.type.LoadBalancingMethod; + +public record Node(@NonNull String identifier, @NonNull LoadBalancingMethod method) {} diff --git a/src/main/java/ru/dragonestia/loadbalancer/model/User.java b/src/main/java/ru/dragonestia/loadbalancer/model/User.java new file mode 100644 index 0000000..3014a28 --- /dev/null +++ b/src/main/java/ru/dragonestia/loadbalancer/model/User.java @@ -0,0 +1,5 @@ +package ru.dragonestia.loadbalancer.model; + +import lombok.NonNull; + +public record User(@NonNull String identifier) {} diff --git a/src/main/java/ru/dragonestia/loadbalancer/model/type/LoadBalancingMethod.java b/src/main/java/ru/dragonestia/loadbalancer/model/type/LoadBalancingMethod.java new file mode 100644 index 0000000..682cc28 --- /dev/null +++ b/src/main/java/ru/dragonestia/loadbalancer/model/type/LoadBalancingMethod.java @@ -0,0 +1,7 @@ +package ru.dragonestia.loadbalancer.model.type; + +public enum LoadBalancingMethod { + SEQUENTIAL_FILLING, + ROUND_ROBIN, + LEAST_PICKED, +} diff --git a/src/main/java/ru/dragonestia/loadbalancer/model/type/SlotLimit.java b/src/main/java/ru/dragonestia/loadbalancer/model/type/SlotLimit.java new file mode 100644 index 0000000..7d6a6a9 --- /dev/null +++ b/src/main/java/ru/dragonestia/loadbalancer/model/type/SlotLimit.java @@ -0,0 +1,27 @@ +package ru.dragonestia.loadbalancer.model.type; + +import lombok.Getter; + +@Getter +public class SlotLimit { + + private final static int UNLIMITED_VALUE = -1; + + private final int slots; + + private SlotLimit(int slots) { + this.slots = slots; + } + + public static SlotLimit unlimited() { + return new SlotLimit(UNLIMITED_VALUE); + } + + public static SlotLimit of(int slots) { + return new SlotLimit(slots); + } + + public boolean isUnlimited() { + return slots == UNLIMITED_VALUE; + } +} diff --git a/src/main/java/ru/dragonestia/loadbalancer/service/BucketService.java b/src/main/java/ru/dragonestia/loadbalancer/service/BucketService.java new file mode 100644 index 0000000..20926c7 --- /dev/null +++ b/src/main/java/ru/dragonestia/loadbalancer/service/BucketService.java @@ -0,0 +1,22 @@ +package ru.dragonestia.loadbalancer.service; + +import ru.dragonestia.loadbalancer.model.Bucket; +import ru.dragonestia.loadbalancer.model.Node; +import ru.dragonestia.loadbalancer.model.User; + +import java.util.List; + +public interface BucketService { + + void createBucket(Node node, Bucket lobby); + + void removeBucket(Node node, Bucket lobby); + + List allBuckets(Node node); + + int countAvailableBuckets(Node node); + + Bucket pickAvailableBucket(Node node, List users); + + void freeBucket(Node node, List users); +} diff --git a/src/main/java/ru/dragonestia/loadbalancer/service/NodeService.java b/src/main/java/ru/dragonestia/loadbalancer/service/NodeService.java new file mode 100644 index 0000000..db04204 --- /dev/null +++ b/src/main/java/ru/dragonestia/loadbalancer/service/NodeService.java @@ -0,0 +1,14 @@ +package ru.dragonestia.loadbalancer.service; + +import ru.dragonestia.loadbalancer.model.Node; + +import java.util.List; + +public interface NodeService { + + void createNode(Node node); + + void removeNode(Node node); + + List allNodes(); +} diff --git a/src/main/java/ru/dragonestia/loadbalancer/service/UserService.java b/src/main/java/ru/dragonestia/loadbalancer/service/UserService.java new file mode 100644 index 0000000..e2b748e --- /dev/null +++ b/src/main/java/ru/dragonestia/loadbalancer/service/UserService.java @@ -0,0 +1,11 @@ +package ru.dragonestia.loadbalancer.service; + +import ru.dragonestia.loadbalancer.model.Bucket; +import ru.dragonestia.loadbalancer.model.User; + +import java.util.List; + +public interface UserService { + + List getUserBuckets(User user); +}