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

Руководство по 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.