Рубрики
Без рубрики

Руководство по GemFire с весенними данными

Узнайте, как использовать GemFire для эффективного управления распределенными данными.

Автор оригинала: baeldung.

1. Обзор

GemFire -это высокопроизводительная распределенная инфраструктура управления данными, которая находится между кластером приложений и внутренними источниками данных.

С помощью GemFire данными можно управлять в памяти, что ускоряет доступ. Spring Data обеспечивает простую настройку и доступ к GemFire из приложения Spring.

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

2. Зависимости Maven

Чтобы использовать поддержку Spring Data GemFire, нам сначала нужно добавить следующую зависимость в ваш pom.xml:


    org.springframework.data
    spring-data-gemfire
    1.9.1.RELEASE

Последнюю версию этой зависимости можно найти здесь .

3. Основные функции GemFire

3.1. Кэш

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

Конфигурация кэша ( cache.xml ) описывает, как данные будут распределены между различными узлами:


    
        
            
                
                ...
                
            
        
    
    ...

3.2. Регионы

Области данных – это логическая группировка в кэше для одного набора данных.

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

Регионы подразделяются на три широкие категории:

  • Реплицированная область содержит полный набор данных на каждом узле. Это обеспечивает высокую производительность чтения. Операции записи выполняются медленнее, так как обновление данных должно распространяться на каждый узел:

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

  • Локальный регион находится на определяющем узле-члене. Связь с другими узлами в кластере отсутствует.

3.3. Запрос кэша

GemFire предоставляет язык запросов, называемый OQL (Object Query Language), который позволяет нам ссылаться на объекты, хранящиеся в областях данных GemFire. Это очень похоже на SQL по синтаксису. Давайте посмотрим, как выглядит очень простой запрос:

ВЫБЕРИТЕ DISTINCT * ИЗ exampleRegion

Gemfire Служба запросов предоставляет методы для создания объекта запроса.

3.4. Сериализация данных

Для управления сериализацией-десериализацией данных GemFire предоставляет опции, отличные от сериализации Java, которые обеспечивают более высокую производительность, обеспечивают большую гибкость для хранения и передачи данных, а также поддержку различных языков.

Имея это в виду, GemFire определила формат данных Portable Data eXchange(PDX). PDX-это межъязыковой формат данных, который обеспечивает более быструю сериализацию и десериализацию, сохраняя данные в именованном поле, к которому можно получить прямой доступ без необходимости полной десериализации объекта.

3.5. Выполнение функций

В GemFire функция может находиться на сервере и может быть вызвана из клиентского приложения или другого сервера без необходимости отправлять сам код функции.

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

3.6. Непрерывные запросы

При непрерывном запросе клиенты подписываются на события на стороне сервера с помощью фильтрации запросов типа SQL. Сервер отправляет все события, которые изменяют результаты запроса. Непрерывная доставка событий запросов использует структуру подписки клиент/сервер.

Синтаксис непрерывного запроса аналогичен базовым запросам, написанным в OQL. Например, запрос, который предоставляет последние данные о запасах из Запаса региона, может быть записан как:

SELECT * from StockRegion s where s.stockStatus='active';

Чтобы получить обновление статуса из этого запроса, реализация CQListener должна быть присоединена к области Stock:


    
            ...
            
                ...
            
        ...
        
    

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 для создания экземпляра кэша GemFire .

Используя GemFire Cache bean, создается экземпляр LocalRegionFatcoryBean , представляющий регион в кэше для экземпляров Employee .

4.2. Сопоставление сущностей

Библиотека обеспечивает поддержку картографирования объектов, которые будут храниться в сетке 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.baeldung.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:

@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.baeldung.spring.data.gemfire.function")
public class GemfireConfiguration {
    // ...
}

5. Заключение

В этой статье мы изучили основные функции GemFire и рассмотрели, как API, предоставляемые Spring Data, облегчают работу с ним.

Полный код этой статьи доступен на GitHub .