Руководство по GemFire с данными Spring
1. обзор
GemFire - это высокопроизводительная инфраструктура распределенного управления данными, которая находится между кластером приложений и внутренними источниками данных.
С GemFire данными можно управлять в оперативной памяти, что ускоряет доступ. Spring Data provides an easy configuration and access to GemFire from Spring application.с
В этой статье мы рассмотрим, как мы можем использовать GemFire для удовлетворения требований к кэшированию нашего приложения.
2. Maven Зависимости
Чтобы использовать поддержку Spring Data GemFire, нам сначала нужно добавить следующую зависимость в нашpom.xml:
org.springframework.data
spring-data-gemfire
1.9.1.RELEASE
Последнюю версию этой зависимости можно найти вhere.
3. Основные функции GemFire
3.1. кэш
Кэш в GemFire предоставляет основные службы управления данными, а также управляет подключением к другим узлам.
Конфигурация кеша (cache.xml) описывает, как данные будут распределяться между разными узлами:
...
...
3.2. районы
Области данных - это логическая группировка в кэше для одного набора данных.
Проще говоря,a region lets us store data in multiple VMs in the system без учета того, на каком узле хранятся данные в кластере.
Регионы делятся на три большие категории:
-
Replicated region содержит полный набор данных о каждом узле. Это дает высокую производительность чтения. Операции записи выполняются медленнее, поскольку обновление данных необходимо распространять на каждый узел:
-
Partitioned region распределяет данные так, что каждый узел хранит только часть содержимого региона. Копия данных хранится на одном из других узлов. Это обеспечивает хорошую производительность записи.
-
Local region находится на определяющем узле-члене. Нет связи с другими узлами в кластере.
3.3. Запросить кеш
GemFire предоставляет язык запросов OQL (Object Query Language), который позволяет нам обращаться к объектам, хранящимся в областях данных GemFire. Это очень похоже на SQL в синтаксисе. Давайте посмотрим, как выглядит очень простой запрос:
ВЫБЕРИТЕ DISTINCT * FROM exampleRegion
QueryService в GemFire предоставляет методы для создания объекта запроса.
3.4. Сериализация данных
Для управления сериализацией-десериализацией данных GemFire предоставляет опции, отличные от сериализации Java, которые обеспечивают более высокую производительность, обеспечивают большую гибкость для хранения и передачи данных, а также поддерживают различные языки.
Имея это в виду, GemFire определил формат данных Portable Data eXchange (PDX). PDX - это многоязычный формат данных, который обеспечивает более быструю сериализацию и десериализацию, сохраняя данные в именованном поле, к которому можно получить прямой доступ без необходимости полной десериализации объекта.
3.5. Выполнение функции
В GemFire функция может находиться на сервере и может вызываться из клиентского приложения или другого сервера без необходимости отправлять сам код функции.
Вызывающий может направить зависимую от данных функцию для работы с конкретным набором данных или может заставить независимую функцию данных работать на конкретном сервере, члене или группе участников.
3.6. Непрерывный запрос
При непрерывных запросах клиенты подписываются на события на стороне сервера с помощью фильтрации запросов типа SQL. Сервер отправляет все события, которые изменяют результаты запроса. Для доставки событий при непрерывном запросе используется структура подписки клиент / сервер.
Синтаксис для непрерывного запроса аналогичен базовым запросам, написанным на OQL. Например, запрос, который предоставляет последние данные о запасах из регионаStock, может быть записан как:
SELECT * from StockRegion s where s.stockStatus='active';
Чтобы получить обновление статуса из этого запроса, реализацияCQListener должна быть присоединена сStockRegion:
...
...
...
4. Поддержка Spring Data GemFire
4.1. Конфигурация Java
Чтобы упростить настройку, Spring Data GemFire предоставляет различные аннотации для настройки основных компонентов GemFire:
@Configuration
public class GemfireConfiguration {
@Bean
Properties gemfireProperties() {
Properties gemfireProperties = new Properties();
gemfireProperties.setProperty("name","SpringDataGemFireApplication");
gemfireProperties.setProperty("mcast-port", "0");
gemfireProperties.setProperty("log-level", "config");
return gemfireProperties;
}
@Bean
CacheFactoryBean gemfireCache() {
CacheFactoryBean gemfireCache = new CacheFactoryBean();
gemfireCache.setClose(true);
gemfireCache.setProperties(gemfireProperties());
return gemfireCache;
}
@Bean(name="employee")
LocalRegionFactoryBean getEmployee(final GemFireCache cache) {
LocalRegionFactoryBean employeeRegion = new LocalRegionFactoryBean();
employeeRegion.setCache(cache);
employeeRegion.setName("employee");
// ...
return employeeRegion;
}
}
Чтобы настроить кэш GemFire и регион, нам нужно сначала настроить несколько конкретных свойств. Здесьmcast-port установлено в ноль, что означает, что этот узел GemFire отключен для многоадресного обнаружения и распространения. Затем эти свойства передаютсяCacheFactoryBean для создания экземпляраGemFireCache.
Используя bean-компонентGemFireCache, создается экземплярLocalRegionFatcoryBean, который представляет область в кэше для экземпляровEmployee.
4.2. Entity Mapping
Библиотека обеспечивает поддержку объектов карты, которые будут храниться в сетке GemFire. Метаданные сопоставления определяются с помощью аннотаций в классах домена:
@Region("employee")
public class Employee {
@Id
public String name;
public double salary;
@PersistenceConstructor
public Employee(String name, double salary) {
this.name = name;
this.salary = salary;
}
// standard getters/setters
}
В приведенном выше примере мы использовали следующие аннотации:
-
@*Region*,, чтобы указать экземпляр региона классаEmployee
-
@Id, для аннотирования свойства, которое будет использоваться в качестве ключа кеша
-
@PersistenceConstructor,, который помогает пометить один конструктор, который будет использоваться для создания сущностей, если доступно несколько конструкторов
4.3. Репозитории GemFire
Затем давайте посмотрим на центральный компонент Spring Data - репозиторий:
@Configuration
@EnableGemfireRepositories(basePackages
= "com.example.spring.data.gemfire.repository")
public class GemfireConfiguration {
@Autowired
EmployeeRepository employeeRepository;
// ...
}
4.4. Поддержка запросов Oql
Репозитории позволяют определять методы запросов для эффективного выполнения запросов OQL в области, в которую отображается управляемый объект:
@Repository
public interface EmployeeRepository extends
CrudRepository {
Employee findByName(String name);
Iterable findBySalaryGreaterThan(double salary);
Iterable findBySalaryLessThan(double salary);
Iterable
findBySalaryGreaterThanAndSalaryLessThan(double salary1, double salary2);
}
4.5. Поддержка выполнения функций
У нас также есть поддержка аннотаций - чтобы упростить работу с выполнением функции GemFire.
Есть две проблемы, которые нужно учитывать, когда мы используем функции, реализацию и выполнение.
Давайте посмотрим, как POJO может быть представлен как функция GemFire с использованием аннотаций Spring Data:
@Component
public class FunctionImpl {
@GemfireFunction
public void greeting(String message){
// some logic
}
// ...
}
Чтобы@GemfireFunction работал, нам нужно явно активировать обработку аннотаций:
@Configuration
@EnableGemfireFunctions
public class GemfireConfiguration {
// ...
}
Для выполнения функции процесс, вызывающий удаленную функцию, должен предоставить вызывающие аргументы, функциюid, цель выполнения (onServer,onRegion,onMember и т. Д.):
@OnRegion(region="employee")
public interface FunctionExecution {
@FunctionId("greeting")
public void execute(String message);
// ...
}
Чтобы включить обработку аннотации выполнения функции, нам нужно добавить, чтобы активировать ее с помощью возможностей сканирования компонентов Spring:
@Configuration
@EnableGemfireFunctionExecutions(
basePackages = "com.example.spring.data.gemfire.function")
public class GemfireConfiguration {
// ...
}
5. Заключение
В этой статье мы рассмотрели основные функции GemFire и выяснили, как предоставляемые Spring Data API упрощают работу с ним.
Полный код этой статьи доступенover on GitHub.