Как осквернить сет? - PullRequest
       51

Как осквернить сет?

0 голосов
/ 26 декабря 2018

Не могли бы вы помочь мне с одной вещью?Представьте, что у меня есть простой микросервер RESTful с одним GET методом, который просто отвечает случайным образом String.

Я собираю все строки в ConcurrentHashSet<String>, который содержит все ответы.

Ниже приведена небрежная реализация, главное, что Set<String> является отказоустойчивым и может быть изменен одновременно.

@RestController
public class Controller {

    private final StringService stringService;

    private final CacheService cacheService;

    public Controller(final StringService stringService, final CacheService cacheService) {
        this.stringService = stringService;
        this.cacheService = cacheService;
    }

    @GetMapping
    public String get() {
        final String str = stringService.random();
        cacheService.add(str);
        return str;
    }

}


public class CacheService {

    private final Set<String> set = ConcurrentHashMap.newKeySet();

    public void add(final String str) {
        set.add(str);
    }

}

Пока вы читаете эту строку, моя конечная точка используется на 1 миллиардлюди.Я хочу осквернить кеш.Поскольку моя система сильно загружена, я не могу хранить все строки на одном сервере.Я хочу иметь 256 серверов / экземпляров и равномерно распределить свой кэш, используя функцию str.hashCode()%256, чтобы определить на каждом сервере / экземпляре, должна ли храниться строка.

Не могли бы вы сказать, что мне делать дальше?Предположим, что в настоящее время я запускаю только приложение Spring Boot локально.

Ответы [ 3 ]

0 голосов
/ 26 декабря 2018

Вы должны проверить Hazelcast , это с открытым исходным кодом и оказалось полезным для меня в случае, когда я хотел обмениваться данными между несколькими экземплярами моего приложения.Сетка данных в памяти, предоставляемая hazelcast, может быть именно тем, что вы ищете.

0 голосов
/ 28 декабря 2018

Я согласен с Вики, для этого и создан Hazelcast.Это один jar, пара строк кода и вместо HashMap у вас есть IMap, который является расширением HashMap, и вы готовы к работе.Все распространение, шардинг, параллелизм и т. Д. Сделаны для вас.Выезд:

https://docs.hazelcast.org/docs/3.11.1/manual/html-single/index.html#map

0 голосов
/ 26 декабря 2018

Попробуйте следовать кодам. Но это плохой способ, лучше всего использовать Map для кэширования данных в одном экземпляре. Если вам нужно создать распределенное приложение, попробуйте распределенный сервис catche, такой как Redis.

class CacheService {

        /**
         * assume read operation is more frequently than write operation
         */
        private final static List<Set<String>> sets = new CopyOnWriteArrayList<>();

        static {
            for (int i = 0; i < 256; i++) {
                sets.add(ConcurrentHashMap.newKeySet());
            }
        }

        public void add(final String str) {
            int insertIndex = str.hashCode() % 256;
            sets.get(insertIndex).add(str);
        }

    }
...