Статьи

Hazelcast и MongoDB учатся играть красиво

MongoDB — это документально-ориентированная база данных с открытым исходным кодом, разработанная с учетом масштабируемости и гибкости разработчика. Вместо того чтобы хранить данные в таблицах и строках, как в реляционной базе данных, в MongoDB вы храните JSON-подобные документы с динамической схемой. Короче говоря, MongoDB — это хранилище данных NOSQL, в первую очередь занимающееся хранением / сохранением и извлечением данных без схемы.

Hazelcast — это открытый исходный код (лицензия Apache v2), распределенная, высокодоступная и масштабируемая сетка данных в памяти, используемая в качестве хранилища данных в памяти, кеша, брокера сообщений и платформы распределенных вычислений. Hazelcast подчеркивает высокоскоростной доступ к распределенным данным (обычно в виде распределенного кэша), распределенные вычисления и распределенные сообщения.

Hazelcast может действовать как магазин NOSQL . MongoDB имеет некоторые возможности сетки данных / вычислений, но она не оптимизирована. Таким образом, сравнение возможностей и возможностей Hazelcast и MongoDB похоже на сравнение яблок и апельсинов.

Часто Hazelcast и MongoDB работают вместе, а не соревнуются. Hazelcast поддерживает использование MongoDB в качестве внутреннего хранилища данных. Данные Hazelcast легко отобразить в MongoDB для постоянной записи или обратной записи.

Давайте рассмотрим функции Hazelcast и MongoDB, чтобы увидеть, как они могут дополнять друг друга.

Характеристики

Простота

Обе технологии просты в освоении. Я смог запустить MongoDB менее чем за десять минут. Например, на моем Mac я могу установить MongoDВ с помощью команды brew.

brew mongo install

Hazelcast так же легко .

Преимущества для разработчиков Java

Если вы пишете Java-приложение (или любой из различных языков, работающих на JVM), Hazelcast и MongoDB очень хорошо вписываются в вашу экосистему. Для Hazelcast возможность использовать объекты Java непосредственно в кластере, не беспокоясь о слое трансляции данных, является большим бонусом производительности. Работа с MongoDB требует либо использования их структур данных, либо написания / настройки уровня перевода данных.

Библиотека BSON полностью поддерживает BSON, формат хранения данных и сетевой передачи, который MongoDB использует для «документов». BSON, сокращение от Binary JSON, представляет собой двоичную сериализацию JSON-подобных документов.

MongoDB поставляется с драйвером для Java. Кроме того, существует инфраструктура Java Object Document Mapper, которая значительно упрощает перевод документов Mongo в объекты Java и vise-verse.

С точки зрения развертывания и интеграции в приложениях Java, Hazelcast может предоставить вам доступ к данным с очень низкой задержкой с помощью различных механизмов, особенно Near Cache на клиентах Hazelcast и встроенного развертывания участников Hazelcast. С MongoDB сетевая задержка будет ощущаться, поскольку у нее нет локальной кэш-памяти.

Распределенных вычислений

Распределенная вычислительная среда Hazelcast чрезвычайно мощная. Он позволяет выполнять произвольную бизнес-логику с привязкой к месту и распределяться по кластеру для прямой поддержки горизонтального масштабирования. MongoDB поддерживает однопотоковую структуру отображения-сокращения, но не поддерживает выполнение произвольного пользовательского кода.

Поддержка Hazelcast для распределенных вычислений дает возможности, которых MongoDB может не иметь. Распределенные средства параллелизма, такие как блокировки, семафоры и очереди, выполняют короткую работу по координации вычислений на нескольких узлах, что очень трудно реализовать в естественных условиях. Я знаю, что многие люди используют MongoDB в качестве брокера сообщений. Тем не менее, я не могу себе представить, как можно сделать что-то из этого на практике, используя только MongoDB.

Упорство

Hazelcast ориентирован на доступ с малыми задержками к распределенным данным и распределенным вычислениям. По умолчанию он не касается диска или любого другого постоянного хранилища. Hazelcast не является базой данных. MongoDB очень постоянная база данных. У него есть проблемы с постоянством (например, он может быть немного хрупким, поскольку записывает в память и по умолчанию не синхронизируется с файловой системой при каждой записи).

Давайте посмотрим, как мы можем извлечь выгоду из сохранения MongoDB с Hazelcast.

IMap и MapStore

Угловой магазин возможностей Hazelcast для чтения / записи — два интерфейса MapLoaderи MapStore. Разработчик должен реализовать MapLoaderинтерфейс, если требуется только чтение из базы данных.

Интерфейс MapLoader

public interface MapLoader<K, V> {

    V load(K key); (1)

    Map<K, V> loadAll(Collection<K> keys); (2)

    Iterable<K> loadAllKeys(); (3)
}

1 Загружает значение данного ключа. Если распределенная карта не содержит значения для данного ключа, Hazelcast вызовет метод load (key) реализации для получения значения.
2 Загружает данные ключи. Это операция пакетной загрузки, поэтому реализация может оптимизировать несколько нагрузок.
3 Загружает все ключи из магазина.

MapStoreИнтерфейс расширяет MapLoaderи позволяет сохранять IMapзаписи в базе данных.

Интерфейс MapStore

public interface MapStore<K, V> extends MapLoader<K, V> {

    void store(K key, V value); (1)

    void storeAll(Map<K, V> map); (2)

    void delete(K key); (3)

    void deleteAll(Collection<K> keys); (4)
}

1 Хранит пару ключ-значение.
2 Хранит несколько записей. Реализация этого метода может оптимизировать работу хранилища, сохраняя все записи в одном соединении с базой данных.
3 Удаляет запись с данным ключом из магазина.
4 Удаляет несколько записей из магазина.

Чтобы узнать о MapLoaderи MapStore, пожалуйста, проверьте официальную документацию Hazelcast .

Для взаимодействия с MongoDB я собираюсь использовать mongo-java-driver.

Mongo Java Driver зависимость

<dependency>
   <groupId>org.mongodb</groupId>
   <artifactId>mongo-java-driver</artifactId>
   <version>${mongo-java-driver.version}</version>
</dependency>

MongoClient mongoClient = new MongoClient(new MongoClientURI(mongoUrl)); (1)
MongoCollection collection = mongoClient.getDatabase(dbName).getCollection(collectionName); (2)
final Document document = (Document) collection.find(eq("_id", key)).first(); (3)
collection.insertOne(document); (3)

1 Установление соединения с экземпляром MondoDb на основе URI, как mongodb://localhost:27017.
2 MongoClientКласс предоставляет методы для подключения к экземпляру MongoDB, получить доступ к базам данных, коллекций, документов и т.д.
3 MongoCollectionКласс позволяет операций CRUD по документам в коллекции.

Вы можете найти полный исходный код примера приложения в hazelcast-code-samplesрепозитории . В этом хранилище вы можете найти множество полезных примеров Hazelcast.

Резюме

MongoDB и Hazelcast могут обеспечить доступ с низкой задержкой к распределенным данным без схемы. MongoDB больше подходит, если вы просто ищете хранилище данных NOSQL. Распределенные структуры данных и вычислительные возможности Hazelcast предоставляют множество приложений, выходящих за рамки возможностей MongoDB. Они могут использоваться отдельно как решения для различных проблем или вместе как дополнительный набор технологий. Я надеюсь, что в этом посте я ответил на большинство вопросов о Hazelcast v. MongoDB. Если я этого не сделал, пожалуйста, не стесняйтесь спрашивать в комментариях ниже или чирикать нам @Hazelcast.