Статьи

Примечания по Oracle Coherence


Oracle Coherence — это распределенный кеш, функционально сопоставимый с
Memcached . Помимо базовой функции API кеша, он имеет некоторые дополнительные возможности, привлекательные для создания крупномасштабных корпоративных приложений.

API основан на интерфейсе Java Map (Hashtable). Он основан на семантике хранилища ключей / значений, где значением может быть любой объект Java Serializable. Согласованность допускает множественный кеш, идентифицируемый уникальным именем (которое они назвали «именованным кешем»).
Приведенные

ниже примеры кода взяты из
замечательной презентации Брайана Оливера из Oracle

. Обычная схема использования — найти кеш по его имени и затем воздействовать на кеш.

Основная функция кеша (Map, JCache)

  • Получить данные по ключу
  • Обновить данные по ключу
  • Удалить данные по ключу
NamedCache nc = CacheFactory.getCache("mine");
Object previous = nc.put("key", "hello world");
Object current = nc.get("key");
int size = nc.size();
Object value = nc.remove("key");
Set keys = nc.keySet();
Set entries = nc.entrySet();
boolean exists = nc.containsKey("key");

Прослушиватель событий модификации кэша (ObservableMap)

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

  • Новый элемент кэша вставлен
  • Существующий элемент кэша удален
  • Существующий элемент кэша обновлен
NamedCache nc = CacheFactory.getCache("stocks");
nc.addMapListener(new MapListener() {
public void onInsert(MapEvent mapEvent) {
...
}
public void onUpdate(MapEvent mapEvent) {
...
}
public void onDelete(MapEvent mapEvent) {
...
}
});

Представление отфильтрованного кэша (QueryMap)

Вы также можете определить «представление» в кеше, предоставив «фильтр», который по сути является логической функцией, в этом представлении будут видны только элементы, оцененные как истинные с помощью этой функции.

NamedCache nc = CacheFactory.getCache("people");

Set keys =
nc.keySet(new LikeFilter("getLastName", "%Stone%"));

Set entries =
nc.entrySet(new EqualsFilter("getAge", 35));

Поддержка непрерывного запроса (ContinuousQueryCache)

Представление также можно использовать как «непрерывный запрос». Все новые поступающие данные, которые удовлетворяют критериям фильтра, будут автоматически включены в представление.

NamedCache nc = CacheFactory.getCache("stocks");

NamedCache expensiveItems =
new ContinuousQueryCache(nc,
new GreaterThan("getPrice", 1000));

Поддержка параллельных запросов (InvocableMap)

Мы также можем выполнить запрос и частичное агрегирование на всех узлах кластера параллельно с последующим финальным агрегированием.

NamedCache nc = CacheFactory.getCache("stocks");

Double total =
(Double)nc.aggregate(AlwaysFilter.INSTANCE,
new DoubleSum("getQuantity"));

Set symbols =
(Set)nc.aggregate(new EqualsFilter("getOwner", "Larry"),
new DistinctValue("getSymbol"));

Поддержка обработки параллельного выполнения (InvocableMap)

Мы также можем выполнять выполнение на всех узлах кластера параллельно

NamedCache nc = CacheFactory.getCache("stocks");

nc.invokeAll(new EqualsFilter("getSymbol", "ORCL"),
new StockSplitProcessor());

class StockSplitProcessor extends AbstractProcessor {
Object process(Entry entry) {
Stock stock = (Stock)entry.getValue();
stock.quantity *= 2;
entry.setValue(stock);
return null;
}
}

Архитектура реализации

Oracle Coherence работает на кластере одинаковых серверных машин, подключенных через сеть. На каждом сервере имеется несколько уровней программного обеспечения, обеспечивающих унифицированную абстракцию для хранения и обработки данных в распределенной среде. Приложение обычно работает и внутри кластера. Кэш-память реализована в виде набора интеллектуальных прокси-серверов данных, которые знают местоположение главной (основной) и подчиненной (резервной) копии данных на основе своего ключа.


Когда клиент «читает» данные из прокси-сервера, он сначала пытается найти данные в локальном кеше (также называемом «ближним кешем» на той же машине). Если он не найден, смарт-прокси найдет распределенный кеш для соответствующей копии (также называемый кеш L2). Так как это чтение, может подойти либо основная, либо подчиненная копия. Если смарт-прокси не найдет данные из распределенного кэша, он будет искать данные из внутренней базы данных. Возвращенные данные затем распространятся обратно к клиенту, и кеш будет заполнен.

Обновление данных (вставка, обновление, удаление) производится в обратном порядке. В архитектуре master / slave все обновления будут передаваться соответствующему главному узлу, которому принадлежит этот фрагмент данных. Согласованность поддержки двух режимов обновления; «Писать» и «Писать позади».» Пишите через«обновит серверную часть БД сразу после обновления главной копии, но перед обновлением ведомой копии и, следовательно, будет постоянно обновлять БД.» Записать сзади «обновит ведомую копию и затем БД в асинхронном режиме. Данные потеряны Это возможно в режиме «позади записи», который имеет более высокую пропускную способность, потому что множественная запись может быть объединена в одну запись, что приводит к меньшему количеству записей.

Хотя извлечение данных из кэша в приложение является типичным способом обработки данных, он не очень масштабируем, когда требуется обрабатывать большой объем данных. Вместо отправки данных в логику обработки, гораздо более эффективный способ — пересылать логику обработки туда, где находятся данные. Именно поэтому Oracle Coherence предоставляет интерфейс invocableMap, где клиент может предоставить класс «процессора», который отправляется на каждый узел, где обработка может быть проведена с локальными данными. Перемещение кода к данным, распределенным по многим узлам, также позволяет выполнять параллельную обработку, поскольку теперь каждый узел может параллельно выполнять локальную обработку.

Логика процессора отправляется в очередь обработки узла выполнения, в котором активный процессор отключает объект процессора и выполняет его. Обратите внимание, что это выполнение выполняется последовательно, другими словами, процессор полностью завершит задание обработки, прежде чем перейти к следующему заданию. Не нужно беспокоиться о многопоточности, нет необходимости использовать блокировки, и, следовательно, не возникает проблем с блокировкой.

С http://horicky.blogspot.com