X-Git-Url: http://juplo.de/gitweb/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fde%2Fjuplo%2Fkafka%2Fchat%2Fbackend%2Fpersistence%2Finmemory%2FInMemoryChatHomeService.java;h=95a30dbd124045b217e304c735bbbd8a88938182;hb=6eb03cbe4609eea0b7061b574a7e273ecd0c9813;hp=4eea6451f1d04981813d1e0201a6c67cb8545f16;hpb=5970768c9609c7b2b0bd087cef2a88db2eb60752;p=demos%2Fkafka%2Fchat diff --git a/src/main/java/de/juplo/kafka/chat/backend/persistence/inmemory/InMemoryChatHomeService.java b/src/main/java/de/juplo/kafka/chat/backend/persistence/inmemory/InMemoryChatHomeService.java index 4eea6451..95a30dbd 100644 --- a/src/main/java/de/juplo/kafka/chat/backend/persistence/inmemory/InMemoryChatHomeService.java +++ b/src/main/java/de/juplo/kafka/chat/backend/persistence/inmemory/InMemoryChatHomeService.java @@ -2,56 +2,86 @@ package de.juplo.kafka.chat.backend.persistence.inmemory; import de.juplo.kafka.chat.backend.domain.ChatRoom; import de.juplo.kafka.chat.backend.domain.ChatHomeService; +import de.juplo.kafka.chat.backend.domain.ShardingStrategy; import lombok.extern.slf4j.Slf4j; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; -import java.time.Clock; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.Map; -import java.util.UUID; +import java.util.*; @Slf4j -public class InMemoryChatHomeService implements ChatHomeService +public class InMemoryChatHomeService implements ChatHomeService { - private final Map chatrooms; - private final Clock clock; - private final int bufferSize; + private final ShardingStrategy shardingStrategy; + private final Map[] chatrooms; public InMemoryChatHomeService( - Flux chatroomFlux, - Clock clock, - int bufferSize) + ShardingStrategy shardingStrategy, + int numShards, + int[] ownedShards, + Flux chatroomFlux) { - log.debug("Creating InMemoryChatHomeService with buffer-size {} (for created ChatRoom's)", bufferSize); - this.chatrooms = new HashMap<>(); - chatroomFlux.subscribe(chatroom -> chatrooms.put(chatroom.getId(), chatroom)); - this.clock = clock; - this.bufferSize = bufferSize; + log.debug("Creating InMemoryChatHomeService"); + this.shardingStrategy = shardingStrategy; + this.chatrooms = new Map[numShards]; + Set owned = Arrays + .stream(ownedShards) + .collect( + () -> new HashSet<>(), + (set, i) -> set.add(i), + (a, b) -> a.addAll(b)); + for (int shard = 0; shard < numShards; shard++) + { + chatrooms[shard] = owned.contains(shard) + ? new HashMap<>() + : null; + } + chatroomFlux + .filter(chatRoom -> + { + int shard = shardingStrategy.selectShard(chatRoom.getId()); + if (owned.contains(shard)) + { + return true; + } + else + { + log.info("Ignoring not owned chat-room {}", chatRoom); + return false; + } + }) + .toStream() + .forEach(chatRoom -> + { + getChatRoomMapFor(chatRoom).put(chatRoom.getId(), chatRoom); + }); } @Override - public Mono createChatRoom(UUID id, String name) + public Mono putChatRoom(ChatRoom chatRoom) { - InMemoryChatRoomService service = - new InMemoryChatRoomService(new LinkedHashMap<>()); - ChatRoom chatRoom = new ChatRoom(id, name, clock, service, bufferSize); - chatrooms.put(chatRoom.getId(), chatRoom); + getChatRoomMapFor(chatRoom).put(chatRoom.getId(), chatRoom); return Mono.just(chatRoom); } @Override - public Mono getChatRoom(UUID id) + public Mono getChatRoom(int shard, UUID id) { - return Mono.justOrEmpty(chatrooms.get(id)); + return Mono.justOrEmpty(chatrooms[shard].get(id)); } @Override - public Flux getChatRooms() + public Flux getChatRooms(int shard) { - return Flux.fromStream(chatrooms.values().stream()); + return Flux.fromStream(chatrooms[shard].values().stream()); + } + + + private Map getChatRoomMapFor(ChatRoom chatRoom) + { + int shard = shardingStrategy.selectShard(chatRoom.getId()); + return chatrooms[shard]; } }