Примечание куратора: содержание этой статьи было первоначально написано Роберто В. Зикари в его блоге, ODBMS Industry Watch
«Учитывая недавний взрыв хранилищ данных NoSQL, мы увидели необходимость в общей абстракции доступа к данным, чтобы упростить разработку с хранилищами NoSQL. Поэтому была создана команда Spring Data ». –Давид Туранский.
Я хотел узнать больше о проекте Spring Data. Я взял интервью у Дэвида Турански , старшего инженера-программиста в SpringSource , подразделении VMWare .
РВЗ
Q1. Что такое Spring Framework?
Дэвид Турански: Spring — широко распространенная среда разработки приложений с открытым исходным кодом для корпоративной Java, используемая миллионами разработчиков. Версия 1.0 была выпущена в 2004 году как легкая альтернатива Enterprise Java Beans (EJB). С тех пор Spring охватил многие другие области корпоративного развития, такие как корпоративная интеграция (Spring Integration), пакетная обработка (Spring Batch), веб-разработка (Spring MVC, Spring Webflow), безопасность (Spring Security). Spring продолжает расширять возможности для мобильных приложений (Spring Mobile), социальных сетей (Spring Social), многофункциональных веб-приложений (Spring MVC, библиотеки s2js Javascript) и доступа к данным NoSQL (Spring Data).
Q2. В скольких проектах Spring source Spring активно участвует VMware?
Дэвид Турански: Трудно дать точное число. Spring очень модульный дизайн, поэтому, если вы посмотрите на страницу SpringSource на github , есть буквально десятки проектов. По моим оценкам, около 20 проектов Spring активно поддерживаются VMware.
Q3. Что такое проект Spring Data?
Дэвид Турански: Проект Spring Data начался в 2010 году, когда Род Джонсон (изобретатель Spring Framework) и Эмиль Эйфрем (основатель Neo Technologies) пытались интегрировать Spring с графической базой данных Neo4j. Spring всегда предоставлял отличную поддержку для работы с RDBMS и средами ORM, такими как Hibernate. Однако, учитывая недавний взрыв хранилищ данных NoSQL, мы увидели необходимость в общей абстракции доступа к данным, чтобы упростить разработку с хранилищами NoSQL. Поэтому команда Spring Data была создана с целью:
«… Предоставить знакомую и согласованную модель программирования на основе Spring для NoSQL и реляционных хранилищ, сохраняя при этом специфичные для магазина функции и возможности».
Последний бит является значимым. Это означает, что мы не используем подход наименьшего общего знаменателя. Мы хотим предоставить полный набор возможностей, будь то JPA / Hibernate, MongoDB, Neo4j, Redis, Hadoop, GemFire и т. Д.
Q4. Не могли бы вы дать нам пример того, как вы создаете приложения на платформе Spring, которые используют хранилища данных NOSQL (например, Redis, MongoDB, Neo4j, HBase)
Дэвид Турански: Spring Data предоставляет абстракцию для шаблона Repository для доступа к данным. Репозиторий похож на объект доступа к данным и предоставляет интерфейс для управления постоянными объектами. Это включает в себя стандартные операции CRUD , но также включает специфичные для домена операции запроса. Например, если у вас есть объект Person:
Person { int id; int age; String firstName; String lastName; }
Возможно, вы захотите выполнить запросы, такие как findByFirstNameAndLastName, findByLastNameStartsWith, findByFirstNameContains, findByAgeLessThan и т. Д. Традиционно вам потребуется написать код для реализации каждого из этих методов. В Spring Data вы просто объявляете интерфейс Java для определения необходимых операций. Используя соглашения об именах методов, как показано выше, Spring Data создает динамический прокси для реализации интерфейса поверх любого хранилища данных, настроенного для приложения. Интерфейс репозитория в этом случае выглядит следующим образом:
public interface PersonRepository extends CrudRepository { Person findByFirstNameAndLastName(String firstName, String lastName); Person findByLastNameStartsWith(String lastName); Persion findByAgeLessThan(int age); ... }
Кроме того, репозитории Spring Data предоставляют декларативную поддержку разбиения на страницы и сортировки.
Затем, используя возможности внедрения зависимостей Spring, вы просто подключаете репозиторий к своему приложению. Например:
public class PersonApp { @Autowired PersonRepository personRepository; public Person findPerson(String lastName, String firstName) { return personRepository.findByFirstNameAndLastName(firstName, lastName); } }
По сути, вам не нужно писать код доступа к данным! Однако вы должны предоставить аннотации Java в своем доменном классе, чтобы настроить сопоставление сущностей с хранилищем данных. Например, если вы используете MongoDB, вы должны связать класс домена с документом:
@Document Person { int id; int age; String firstName; String lastName; }
Обратите внимание, что аннотации сопоставления сущностей зависят от магазина. Кроме того, вам необходимо предоставить некоторую конфигурацию Spring, чтобы сообщить вашему приложению, как подключаться к хранилищу данных, в каком пакете (ах) искать интерфейсы репозитория и тому подобное.
Команда Spring Data написала отличную книгу, включающую множество примеров кода. Spring Data Modern Data Acces для корпоративной Java, недавно опубликованный O’Reilly. Кроме того, на веб-сайте проекта есть много ресурсов, которые помогут вам начать использовать Spring Data.
Q5 А для карт-уменьшить рамки?
Дэвид Турански: Spring Data предоставляет отличную поддержку для разработки приложений с использованием Apache Hadoop, а также Pig и / или Hive . Однако в приложениях Hadoop обычно используется сложный конвейер данных, который может включать загрузку данных из нескольких источников, предварительную обработку и анализ в реальном времени при загрузке данных в HDFS, очистку данных, реализацию рабочего процесса для координации нескольких этапов анализа данных и, наконец, публикацию данных. от HDFS до или более реляционных данных приложений или хранилищ данных NoSQL.
Полный конвейер может быть реализован с использованием Spring для Apache Hadoop вместе с Spring Integration и Spring Batch. Однако у Hadoop есть свой собственный набор проблем, для решения которых предназначен проект Spring for Apache Hadoop. Как и все проекты Spring, он использует Spring Framework для обеспечения согласованной структуры и упрощения написания приложений Hadoop. Например, приложения Hadoop сильно зависят от инструментов командной оболочки. Таким образом, приложения оказываются мешаниной в Perl, Python, Ruby и bash-скриптах. Spring for Apache Hadoop предоставляет специальное пространство имен XML для настройки заданий Hadoop со встроенными функциями сценариев и поддержкой Hive и Pig. Кроме того, Spring for Apache Hadoop позволяет вам воспользоваться преимуществами основных функций Spring Framework, таких как планирование задач, интеграция с Quartz,и заполнители свойств для сокращения строк кода, улучшения тестируемости и удобства обслуживания и упрощения процесса разработки.
Q6. А как насчет облачных услуг передачи данных? и поддержка технологий реляционных баз данных или объектно-реляционных картографов?
Дэвид Турански: Хотя в настоящее время нет планов поддержки облачных сервисов, таких как Amazon 3S , Spring Data предоставляет гибкую архитектуру, на которой они могут быть реализованы. Реляционные технологии и ORM поддерживаются через Spring Data JPA. Spring всегда предоставлял первоклассную поддержку для базы данных Relation через JdbcTemplate, используя предоставленный поставщиком драйвер JDBC. Для ORM Spring поддерживает Hibernate, любого поставщика JPA и Ibatis. Кроме того, Spring предоставляет отличную поддержку для декларативных транзакций.
С Spring Data все становится еще проще. В традиционном приложении Spring, поддерживаемом JDBC, вы должны вручную кодировать репозитории или объекты доступа к данным. В Spring Data JPA слой доступа к данным генерируется платформой, в то время как постоянные объекты используют стандартные аннотации JPA.
Q7. Как можно использовать Spring для выполнения:
— приема данных из различных источников данных в Hadoop,
— организации рабочего процесса анализа на основе Hadoop,
— экспорта данных из Hadoop в реляционные и нереляционные базы данных
Дэвид Турански: Как упоминалось ранее, для полного конвейера обработки больших данных, включающего все эти этапы, потребуется Spring для Apache Hadoop в сочетании с Spring Integration и Spring Batch .
Spring Integration значительно упрощает задачи корпоративной интеграции, предоставляя облегченную среду обмена сообщениями, основанную на хорошо известных шаблонах корпоративной интеграции Hohpe и Woolf . Иногда называемый «анти-ESB», Spring Integration не требует никакого компонента времени выполнения, кроме контейнера Spring, и встроен в процесс вашего приложения для обработки загрузки данных из различных распределенных источников, передачи, преобразования и распространения данных.
Spring Batch обеспечивает надежную среду для пакетной обработки любого типа и используется для настройки и выполнения запланированных заданий, состоящих из этапов крупномасштабной обработки. Отдельные шаги могут быть реализованы в виде потоков сообщений Spring Integration или заданий Hadoop.
Q8. Что такое проект Spring Data GemFire?
Дэвид Турански: Spring Data GemFire начал свою жизнь как отдельный проект от Spring Data после приобретения VMWare GemStone и его коммерческой распределенной сетки данных GemFire .
Первоначально его целью было упростить разработку приложений GemFire и настройку кэшей GemFire, областей данных и связанных компонентов. Хотя этот проект разрабатывался и продолжает разрабатываться независимо как проект Spring с открытым исходным кодом, команда разработчиков GemFire осознала ценность для своих клиентов разработки с Spring и увеличила свою приверженность Spring Data GemFire. Начиная с последнего выпуска GemFire 7.0, Spring Data GemFireрекламируется как рекомендуемый способ разработки приложений GemFire для Java. В то же время проект был перенесен под зонтик Spring Data. Мы внедрили репозиторий GemFire и продолжим предоставлять первоклассную поддержку GemFire.
Q9. Не могли бы вы привести технический пример того, как упростить разработку приложений с высокой степенью масштабируемости?
Дэвид Турански: GemFire - довольно зрелая распределенная, ориентированная на память сетка данных, используемая для создания приложений с высокой степенью масштабируемости. Как следствие, при настройке элементов кэша и хранилищ данных, известных как регионы, существует сложность (область примерно аналогична таблице в реляционной базе данных). GemFire поддерживает одноранговые и клиент-серверные топологии, а регионы могут быть локальными, реплицированными или разделенными. Кроме того, GemFire предоставляет ряд расширенных функций для обработки событий, удаленного выполнения функций и так далее.
До появления Spring Data GemFire конфигурация GemFire выполнялась преимущественно через встроенную поддержку XML. Это работает хорошо, но относительно ограниченно с точки зрения гибкости. Сегодня конфигурирование основных компонентов может быть выполнено полностью в Spring, что делает простые вещи простыми, а сложные — возможными.
В сценарии клиент-сервер разработчик приложения может иметь дело только с доступом к данным. В GemFire клиентское приложение получает доступ к данным через клиентский кеш и клиентскую область, которые действуют как прокси для обеспечения доступа к сетке. Такие компоненты легко настраиваются с помощью Spring, и код приложения остается неизменным, независимо от того, распределяются ли данные по ста серверам или кэшируются локально. К счастью, это позволяет разработчикам воспользоваться преимуществами профилей среды Spring, чтобы легко переключаться на локальный кэш и область, подходящие для модульных интеграционных тестов, которые автономны и могут выполняться где угодно, в том числе в средах автоматической сборки. Ресурсы кеша настраиваются в Spring XML:
<beans> </beans><beans profile="test"> <gfe:cache /> <gfe:local -region name="Person"/> </beans> <beans profile="default"> <context:property-placeholder location="cache.properties"/> <gfe:client-cache/> <gfe:client-region name="Person"/> <gfe:pool> <gfe:locator host="${locator.host}" port="${locator.port}"/> </gfe:pool> </beans> </beans>
Здесь мы видим, что развернутое приложение (профиль по умолчанию) зависит от удаленного процесса локатора GemFire. По умолчанию клиентский регион не хранит данные локально, а подключен к доступному серверу кэша через локатор. Область распределяется между сервером кеша и его одноранговыми узлами и может быть разделена или реплицирована. Профиль тестирования устанавливает автономную область в локальной памяти, подходящую для тестирования модульной интеграции.
Кроме того, приложения могут быть еще более упрощены с помощью поддерживаемого GemFire репозитория данных Spring. Основное отличие от приведенного выше примера состоит в том, что аннотации сопоставления сущностей заменяются аннотациями, специфичными для GemFire:
@Region Person { int id; int age; String firstName; String lastName; }
Аннотация @Region отображает тип Person в существующую область с тем же именем. Аннотация Region предоставляет атрибут для указания имени региона, если это необходимо.
В10. Проект использует GemFire в качестве распределенной платформы управления данными. Почему используется платформа управления данными в памяти, а не хранилище данных NoSQL или NewSQL?
Дэвид Турански: Клиенты выбирают GemFire прежде всего для производительности. Как и в сетке памяти , доступ к данным может быть на порядок быстрее, чем на дисковых хранилищах. Многие дисковые системы также кэшируют данные в памяти для повышения производительности. Однако ваш пробег может варьироваться в зависимости от конкретной операции и когда требуется дисковый ввод-вывод. В отличие от этого, производительность GemFire очень стабильна. Это является основным преимуществом для определенного класса распределенных систем с большим объемом и низкой задержкой. Кроме того, GemFire чрезвычайно надежен, обеспечивая резервное копирование и восстановление на основе дисков.
GemFire также создает расширенные функции, которые обычно не встречаются в пространстве NoSQL. Это включает в себя ряд расширенных параметров настройки для баланса производительности и надежности, синхронную или асинхронную репликацию, расширенные функции сериализации объектов, гибкое разбиение данных с настраиваемым размещением данных, поддержку шлюза WAN, непрерывные запросы, совместимость .Net и выполнение удаленных функций.
Q11. Является ли GemFire полноценной системой управления распределенными базами данных? или еще?
Дэвид Турански: Учитывая все его возможности и проверенный послужной список поддержки многих критически важных систем, я бы определенно охарактеризовал GemFire как таковой.
————
Дэвид Турански — старший инженер-программист в SpringSource , подразделении VMWare . Дэвид является членом команды Spring Data и руководителем проекта Spring Data GemFire. Он также является участником проекта Spring Integration. Дэвид имеет большой опыт работы разработчиком, архитектором и консультантом в различных отраслях. Кроме того, он обучил сотни разработчиков эффективному использованию Spring Framework.