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
Преимущества для разработчиков 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.