powered by simpleCommunicator - 2.0.30     © 2024 Programmizd 02
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / Вытесняющий кэш для высоконагруженной системы?
21 сообщений из 96, страница 4 из 4
Вытесняющий кэш для высоконагруженной системы?
    #39916271
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp
Твой опыт в шарпе нельзя проецировать на Java.
в шарпе
Код: java
1.
2.
3.
        if(cache.contains(login)){
            return cache.load(login);
        }

разве вернет что-то отличное от мусора? как-то не верится.
...
Рейтинг: 0 / 0
Вытесняющий кэш для высоконагруженной системы?
    #39916274
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Панфилов
PetroNotC Sharp
Твой опыт в шарпе нельзя проецировать на Java.
в шарпе
Код: java
1.
2.
3.
        if(cache.contains(login)){
            return cache.load(login);
        }


разве вернет что-то отличное от мусора? как-то не верится.

Хорошо, давай пойдём дальше:
Код: java
1.
2.
3.
        if(cache.contains(cacheKey)){
            return cache.load(cacheKey);
        }


Так устраивает?
...
Рейтинг: 0 / 0
Вытесняющий кэш для высоконагруженной системы?
    #39916285
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Панфилов,
Вы правы конечно про кусок кода.
Я про его остальные "доказательства" типа: "у меня в шарпе всё работает и машина у меня самая крутая").
Сразу перешел на терминологию "сам ты такой и слив защитан и т.д.
Разговаривать предметно с шарпистами очень тяжело так как ЯП проще чем java. Наши трудятся в свободное время, а они отдыхают)
...
Рейтинг: 0 / 0
Вытесняющий кэш для высоконагруженной системы?
    #39916291
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA
Хорошо, давай пойдём дальше:
Код: java
1.
2.
3.
        if(cache.contains(cacheKey)){
            return cache.load(cacheKey);
        }


Так устраивает?
А что поменялось-то? Сколько спринтов нужно чтобы увидеть ошибку?
...
Рейтинг: 0 / 0
Вытесняющий кэш для высоконагруженной системы?
    #39916297
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Панфилов
skyANA
Хорошо, давай пойдём дальше:
Код: java
1.
2.
3.
        if(cache.contains(cacheKey)){
            return cache.load(cacheKey);
        }



Так устраивает?
А что поменялось-то?

Получили для сущности ключ кэширования, что будет другим, если что-то изменится.
...
Рейтинг: 0 / 0
Вытесняющий кэш для высоконагруженной системы?
    #39916303
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA
Получили для сущности ключ кэширования, что будет другим, если что-то изменится.
Ладно, вот наводящие вопросы для особо одаренных:
  • почему здесь утверждается что API - это get и put?
  • почему здесь мне в голову не пришло использовать containsKey, а вместо этого какой-то стремный Value<?>?
...
Рейтинг: 0 / 0
Вытесняющий кэш для высоконагруженной системы?
    #39916320
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Панфилов
skyANA
Получили для сущности ключ кэширования, что будет другим, если что-то изменится.
Ладно, вот наводящие вопросы для особо одаренных:
  • почему здесь утверждается что API - это get и put?
  • почему здесь мне в голову не пришло использовать containsKey, а вместо этого какой-то стремный Value<?>?
О, наконец-то я понял суть придирки.

Хорошо, буду возвращать некий OperationResult, имеющий статус успешно всё прошло, или ключ не найден, или таймаут, или...
Куча других статусов.

Для вызывающего сервиса-то какая разница?
У него как был интерфейс Repository, что возвращает сущности, так и остался.

О том, что есть некий декоратор, знает только IoC-контейнер.

С другой стороны Cache - это тоже просто интерфейс.
Реализацией может быть кэш в памяти, кэш в Redis, Couchbase, Memcached.
Многоуровневый кэш, являющийся их комбинацией.

И вся ботва с обработкой OperationResult и отображением на сущности будет скрыта внутри реализаций.
...
Рейтинг: 0 / 0
Вытесняющий кэш для высоконагруженной системы?
    #39916327
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA

О, наконец-то я понял суть придирки.
..
И вся ботва с обработкой OperationResult и отображением на сущности будет скрыта внутри реализаций.
Расскажите, в вашем абрикосе все такие "одаренные" или только вы?

Код: java
1.
2.
3.
if(cache.contains(cacheKey)){ // здесь вернулось true, потому что на момент запроса там что-то действительно было
    return cache.load(cacheKey); // тут вернулся null потому что объект успел мутировать
}



Андрей Панфилов
Сколько спринтов нужно чтобы увидеть ошибку?
Итого, за 4 тыканья носом в 3 строчки кода ошибка так и не была локализована, так что у заказчика с нытьем "оно иногда работает как-то не так" вообще нет никаких шансов. аджайл такой аджайл...
...
Рейтинг: 0 / 0
Вытесняющий кэш для высоконагруженной системы?
    #39916331
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Панфилов
skyANA

О, наконец-то я понял суть придирки.
..
И вся ботва с обработкой OperationResult и отображением на сущности будет скрыта внутри реализаций.
Расскажите, в вашем абрикосе все такие "одаренные" или только вы?

Код: java
1.
2.
3.
if(cache.contains(cacheKey)){ // здесь вернулось true, потому что на момент запроса там что-то действительно было
    return cache.load(cacheKey); // тут вернулся null потому что объект успел мутировать
}




Андрей Панфилов
Сколько спринтов нужно чтобы увидеть ошибку?
Итого, за 4 тыканья носом в 3 строчки кода ошибка так и не была локализована, так что у заказчика с нытьем "оно иногда работает как-то не так" вообще нет никаких шансов. аджайл такой аджайл...

И зачем быть таким мудаком, интересно )))

Хорошо, пример не кошерный вышел, он был просто иллюстрацией того, что есть декоратор.

Так устроит?
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
var entity = cache.get(id);

if (entity != null) {
    return entity;
}

entity = decorated.get(id);

if (entity != null) {
    cache.set(entity);
}

return entity;
...
Рейтинг: 0 / 0
Вытесняющий кэш для высоконагруженной системы?
    #39916335
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
За исключением нескольких дополнительных проверок у нас работает по сути именно такой код.
За более чем 6 лет его эксплуатации не было ни одного случая "оно иногда работает как-то не так".

Системой пользуется более 26000 организаций на данный момент. Десятки миллионов пользователей ежедневно.
...
Рейтинг: 0 / 0
Вытесняющий кэш для высоконагруженной системы?
    #39916337
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA
И зачем быть таким мудаком, интересно )))
Да я вот тоже ума не приложу как так можно в одном месте распинаться про то как у вас все круто, аджайл во все дыры, а при этом код так себе....

skyANA
Так устроит?
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
var entity = cache.get(id);

if (entity != null) {
    return entity;
}

entity = decorated.get(id);

if (entity != null) {
    cache.set(entity);
}

return entity;

Ошибку сами найдете или тоже придется ткнуть носом?
...
Рейтинг: 0 / 0
Вытесняющий кэш для высоконагруженной системы?
    #39916339
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Панфилов
skyANA
И зачем быть таким мудаком, интересно )))
Да я вот тоже ума не приложу как так можно в одном месте распинаться про то как у вас все круто, аджайл во все дыры, а при этом код так себе....

Код был просто иллюстрацией. Я же не знал, что вы его за продакшн реди сочтёте.
Теперь буду знать :)
...
Рейтинг: 0 / 0
Вытесняющий кэш для высоконагруженной системы?
    #39916340
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Панфилов
skyANA
Так устроит?
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
var entity = cache.get(id);

if (entity != null) {
    return entity;
}

entity = decorated.get(id);

if (entity != null) {
    cache.set(entity);
}

return entity;


Ошибку сами найдете или тоже придется ткнуть носом?

Тыкайте, не стесняйтесь. Это конструктивнее, чем какую-то ахинею про "аджайл во все дыры" нести :)
...
Рейтинг: 0 / 0
Вытесняющий кэш для высоконагруженной системы?
    #39916341
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Панфилов,

почитал на сайте у вас про вашу методологию, тоже итеративная с элементами SCRUM
любопытно, что не так?
...
Рейтинг: 0 / 0
Вытесняющий кэш для высоконагруженной системы?
    #39916344
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA
За исключением нескольких дополнительных проверок у нас работает по сути именно такой код.
За более чем 6 лет его эксплуатации не было ни одного случая "оно иногда работает как-то не так".

Системой пользуется более 26000 организаций на данный момент. Десятки миллионов пользователей ежедневно.

В среднем 750 op. per second (500-1000), 99.8% hit ratio
...
Рейтинг: 0 / 0
Вытесняющий кэш для высоконагруженной системы?
    #39919619
GrossmasteR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уважаемые форумчане, здравствуйте.
Нужен ваш совет.

Я взял реализацию уважаемого Валентина Колесникова,
22054598
Изучил статью, которую посоветовал уважаемый сладкий бубалех
22056341
И добавил в конструктор
Код: java
1.
2.
3.
protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {  
  return size() > MAX_CAPACITY;   
    }


а также завернул в
Код: java
1.
Collections.synchronizedMap();



Получилась вот такая простая реализация Java LRU cache:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Objects;

/**
 * An LRU cache, based on LinkedHashMap
 * This cache has a fixed maximum number of elements (<code>mCapacity</code>).
 * If the cache is full and another entry is added, the LRU (least recently used) entry is dropped.
 *
 * @param <K> the type of the cache keys
 * @param <V> the type of the cache values
 */

public class LruCache<K, V> {
    private static final boolean sSORT_BY_ACCESS = true;
    private static final float sLOAD_FACTOR = 0.75F;
    private final Map<K, V> mLruCacheMap;
    private final int mCapacity;

    /**
     * Constructor
     * <p>
     * If the cache is to be used by multiple threads, the cache must be wrapped with code to synchronize the methods
     *
     * @param capacity the limit of objects that are kept in the cache
     */

    public LruCache(int capacity) {
        this.mCapacity = capacity;
        this.mLruCacheMap = Collections.synchronizedMap(new LinkedHashMap<K, V>(capacity, sLOAD_FACTOR, sSORT_BY_ACCESS) {
            public boolean removeEldestEntry(Map.Entry eldest) {
                return size() > capacity;
            }
        });
    }

    /**
     * Returns the object to which this object cache maps the specified key
     *
     * @param key key with which the specified value is to be associated
     * @return the value to which this object cache maps the specified key, or null if the object cache contains no mapping for the key
     */

    public V get(K key) {
        Objects.requireNonNull(key, "key == null");
        synchronized (this) {
            V value = mLruCacheMap.get(key);
            if (value != null) {
                return value;
            }
        }
        return null;
    }

    /**
     * Associates the specified value with the specified key in this object cache. If the object cache previously contained a mapping for this key, the old value is replaced
     *
     * @param key   key with which the specified value is to be associated
     * @param value value to be associated with the specified key
     */

    public boolean put(K key, V value) {
        boolean exist = false;
        Objects.requireNonNull(key, "key == null");
        Objects.requireNonNull(value, "value == null");
        if (mLruCacheMap.containsKey(key)) {
            exist = true;
            mLruCacheMap.remove(key);
        } else if (mLruCacheMap.size() >= mCapacity) {
            mLruCacheMap.remove(mLruCacheMap.keySet().iterator().next());
        }
        mLruCacheMap.put(key, value);
        return exist;
    }
}



Вопрос, а как мне написать юнит тесты? На что тестировать?
Пробую как-то так:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
@Test
    void get() {
        LruCache<Object, Object> test = new LruCache<>(1);
        {
            assertNull(test.get(1));
        }
        {
            test.put(1, "one");
            assertEquals("one", test.get(1));
        }
    }



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

P.S. И кстати, вопрос, а если я делаю так
Код: java
1.
2.
3.
4.
5.
 this.mLruCacheMap = Collections.synchronizedMap(new LinkedHashMap<K, V>(capacity, sLOAD_FACTOR, sSORT_BY_ACCESS) {
            public boolean removeEldestEntry(Map.Entry eldest) {
                return size() > capacity;
            }
        })



то нужна ли мне вообще логика в методе put?
...
Рейтинг: 0 / 0
Вытесняющий кэш для высоконагруженной системы?
    #39919625
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GrossmasteR, если ты дошел до того что начал делать LRU-кеши - то у тебя видимо есть какая-то перформансная
проблема. Иначе тебе-б LRU был-бы не нужен. Верно?

В этом случае ты делаешь 2 имплементации твоей бизнес-логики. Без LRU. И с использованием LRU.
И в конце просто делаешь некое общее утверждение что время работы стало на 200% быстрее (к примеру).

На этом пожалуй всё. Придумать какие-то синтетические тесты на LRU очень сложно.
...
Рейтинг: 0 / 0
Вытесняющий кэш для высоконагруженной системы?
    #39919633
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
начал делать LRU-кеши - то у тебя....

нехватает памяти
...
Рейтинг: 0 / 0
Вытесняющий кэш для высоконагруженной системы?
    #39919634
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Придумать какие-то синтетические тесты на LRU очень сложно.

банальное: кол-во put и get из разных потоков в секунду

как меряют всякие message queue, получая сотни миллионов сферических мессаджей в секунду )))
...
Рейтинг: 0 / 0
Вытесняющий кэш для высоконагруженной системы?
    #39919639
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev
mayton
начал делать LRU-кеши - то у тебя....

нехватает памяти

Это две стороны одной медали.
...
Рейтинг: 0 / 0
Вытесняющий кэш для высоконагруженной системы?
    #39919643
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev
mayton
Придумать какие-то синтетические тесты на LRU очень сложно.

банальное: кол-во put и get из разных потоков в секунду

как меряют всякие message queue, получая сотни миллионов сферических мессаджей в секунду )))

А с чем сравнивать? Должен быть какой-то baseline. Или какая-то мера.

Иначе как ты примешь решение о том что кеш реализован эффективно?
Просто работает? Correctness - это не наш вопрос. У нас вопрос эффективности.
...
Рейтинг: 0 / 0
21 сообщений из 96, страница 4 из 4
Форумы / Java [игнор отключен] [закрыт для гостей] / Вытесняющий кэш для высоконагруженной системы?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]