feat: `UnknownChatroomException` records shard and owned shards
[demos/kafka/chat] / src / main / java / de / juplo / kafka / chat / backend / persistence / kafka / KafkaChatHome.java
1 package de.juplo.kafka.chat.backend.persistence.kafka;
2
3 import de.juplo.kafka.chat.backend.domain.ChatHome;
4 import de.juplo.kafka.chat.backend.domain.ChatRoom;
5 import de.juplo.kafka.chat.backend.domain.UnknownChatroomException;
6 import lombok.RequiredArgsConstructor;
7 import lombok.extern.slf4j.Slf4j;
8 import org.apache.kafka.common.utils.Utils;
9 import reactor.core.publisher.Flux;
10 import reactor.core.publisher.Mono;
11
12 import java.util.*;
13
14
15 @RequiredArgsConstructor
16 @Slf4j
17 public class KafkaChatHome implements ChatHome
18 {
19   private final int numPartitions;
20   private final ChatRoomChannel chatRoomChannel;
21
22
23   @Override
24   public Mono<ChatRoom> getChatRoom(UUID id)
25   {
26     int shard = selectShard(id);
27     return chatRoomChannel
28         .getChatRoom(shard, id)
29         .switchIfEmpty(Mono.error(() -> new UnknownChatroomException(
30             id,
31             shard,
32             chatRoomChannel.getOwnedShards())));
33   }
34
35   int selectShard(UUID chatRoomId)
36   {
37     byte[] serializedKey = chatRoomId.toString().getBytes();
38     return Utils.toPositive(Utils.murmur2(serializedKey)) % numPartitions;
39   }
40
41   @Override
42   public Flux<ChatRoom> getChatRooms()
43   {
44       return chatRoomChannel.getChatRooms();
45   }
46 }