«1. Обзор
GemFire — это высокопроизводительная распределенная инфраструктура управления данными, расположенная между кластером приложений и внутренними источниками данных.
GemFire позволяет управлять данными в памяти, что ускоряет доступ. Spring Data обеспечивает простую настройку и доступ к GemFire из приложения Spring.
В этой статье мы рассмотрим, как мы можем использовать GemFire для удовлетворения требований кэширования нашего приложения.
2. Зависимости Maven
Чтобы использовать поддержку Spring Data GemFire, нам сначала нужно добавить следующую зависимость в наш pom.xml:
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-gemfire</artifactId>
<version>1.9.1.RELEASE</version>
</dependency>
Последнюю версию этой зависимости можно найти здесь. .
3. Основные функции GemFire
3.1. Кэш
Кэш в GemFire предоставляет основные службы управления данными, а также управляет подключением к другим узлам.
Конфигурация кэша (cache.xml) описывает, как данные будут распределяться между различными узлами:
<cache>
<region name="region">
<region-attributes>
<cache-listener>
<class-name>
...
</class-name>
</cache-listener>
</region-attributes>
</region>
...
</cache>
3.2. Области
Области данных — это логическая группа в кэше для одного набора данных.
Проще говоря, регион позволяет нам хранить данные на нескольких виртуальных машинах в системе, независимо от того, на каком узле хранятся данные в кластере.
Регионы подразделяются на три широкие категории:
-
Реплицированный регион содержит полный набор данных на каждом узле. Это дает высокую производительность чтения. Операции записи выполняются медленнее, поскольку обновление данных необходимо распространять на каждый узел: \u003cregion name=\»myRegion\» refid=\»REPLICATE\»/\u003e Разделенная область распределяет данные таким образом, что каждый узел сохраняет только часть содержимого области. Копия данных хранится на одном из других узлов. Он обеспечивает хорошую производительность записи. \u003cregion name=\»myRegion\» refid=\»PARTITION\»/\u003e Локальный регион находится на определяющем узле-члене. Связь с другими узлами внутри кластера отсутствует. \u003cregion name=\»myRegion\» refid=\»LOCAL\»/\u003e
3.3. Запросите кэш
GemFire предоставляет язык запросов под названием OQL (язык объектных запросов), который позволяет нам обращаться к объектам, хранящимся в областях данных GemFire. Синтаксис очень похож на SQL. Давайте посмотрим, как выглядит очень простой запрос:
SELECT 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:
<cache>
<region name="StockRegion>
<region-attributes refid="REPLICATE">
...
<cache-listener>
<class-name>...</class-name>
</cache-listener>
...
</region-attributes>
</region>
</cache>
~ ~~ 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<String, Employee> getEmployee(final GemFireCache cache) {
LocalRegionFactoryBean<String, Employee> employeeRegion = new LocalRegionFactoryBean();
employeeRegion.setCache(cache);
employeeRegion.setName("employee");
// ...
return employeeRegion;
}
}
«
«Чтобы настроить кеш и регион GemFire, мы должны сначала настроить несколько конкретных свойств. Здесь mcast-port установлен равным нулю, что указывает на то, что этот узел GemFire отключен для многоадресного обнаружения и распространения. Затем эти свойства передаются в CacheFactoryBean для создания экземпляра GemFireCache.
Используя bean-компонент GemFireCache, создается экземпляр LocalRegionFatcoryBean, который представляет регион в кэше для экземпляров Employee.
4.2. Отображение объектов
@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
}
Библиотека обеспечивает поддержку отображения объектов, которые будут храниться в сетке GemFire. Метаданные сопоставления определяются с помощью аннотаций в классах предметной области:
-
В приведенном выше примере мы использовали следующие аннотации:
@Region, чтобы указать экземпляр региона класса Employee @Id, чтобы аннотировать свойство, которое должно использоваться в качестве ключа кэша @PersistenceConstructor, которое помогает пометить один конструктор, который будет использоваться для создания сущностей, в случае, если доступно несколько конструкторов
4.3. Репозитории GemFire
@Configuration
@EnableGemfireRepositories(basePackages
= "com.baeldung.spring.data.gemfire.repository")
public class GemfireConfiguration {
@Autowired
EmployeeRepository employeeRepository;
// ...
}
Далее давайте посмотрим на центральный компонент Spring Data — репозиторий:
4.4. Поддержка запросов Oql
@Repository
public interface EmployeeRepository extends
CrudRepository<Employee, String> {
Employee findByName(String name);
Iterable<Employee> findBySalaryGreaterThan(double salary);
Iterable<Employee> findBySalaryLessThan(double salary);
Iterable<Employee>
findBySalaryGreaterThanAndSalaryLessThan(double salary1, double salary2);
}
Репозитории позволяют определять методы запросов для эффективного выполнения запросов OQL к региону, с которым сопоставлен управляемый объект:
4.5. Поддержка выполнения функций
У нас также есть поддержка аннотаций — для упрощения работы с выполнением функций GemFire.
Есть две проблемы, которые необходимо решить, когда мы используем функции: реализацию и выполнение.
@Component
public class FunctionImpl {
@GemfireFunction
public void greeting(String message){
// some logic
}
// ...
}
Давайте посмотрим, как POJO может быть представлен как функция GemFire с использованием аннотаций Spring Data:
@Configuration
@EnableGemfireFunctions
public class GemfireConfiguration {
// ...
}
Нам нужно явно активировать обработку аннотаций для работы @GemfireFunction:
@OnRegion(region="employee")
public interface FunctionExecution {
@FunctionId("greeting")
public void execute(String message);
// ...
}
Для выполнения функции процесс, вызывающий удаленную функцию, должен предоставить аргументы вызова, идентификатор функции, цель выполнения (onServer, onRegion, onMember и т. д.):
@Configuration
@EnableGemfireFunctionExecutions(
basePackages = "com.baeldung.spring.data.gemfire.function")
public class GemfireConfiguration {
// ...
}
Чтобы включить обработку аннотации выполнения функции, нам нужно добавить для активации это с использованием возможностей сканирования компонентов Spring:
5. Заключение
В этой статье мы рассмотрели основные функции GemFire и рассмотрели, как предоставляемые Spring Data API упрощают работу с ним.