Очереди и множества (Queue и Set)#
Кроме стандартного хранения ключей и значений в виде отображения (map), DataGrid обеспечивает реализацию быстрой распределенной блокирующей очереди (Distributed Blocking Queue) и распределенного множества (Distributed Set).
В DataGrid есть интерфейсы IgniteQueue и IgniteSet, которые наследуют java.util.concurrent.BlockingQueue и java.util.Set соответственно. DataGrid также поддерживает все операции интерфейса java.util.Collection. IgniteQueue и IgniteSet можно создать в режиме коллокации или без нее.
Ниже описаны примеры создания распределенных очереди и множества.
Создание распределенной очереди:
Ignite ignite = Ignition.start();
IgniteQueue<String> queue = ignite.queue("queueName", // Название очереди.
0, // Емкость очереди. `0` — неограниченная очередь.
new CollectionConfiguration() // Конфигурация коллекции.
);
Создание распределенного множества:
Ignite ignite = Ignition.start();
IgniteSet<String> set = ignite.set("setName", // Название множества.
new CollectionConfiguration() // Конфигурация коллекции.
);
Коллоцированый и неколлоцированый режимы#
Если требуется небольшое количество очередей или множеств с большим объемом данных, создавайте их в режиме без коллокации. В нем примерно равные части каждой очереди или множества хранятся на каждом узле кластера.
Если требуется много очередей или множеств относительно небольшого размера (по сравнению с общим объемом кешей), их лучше создавать в режиме с коллокацией. В нем все элементы очереди или множества сохраняются на одном узле кластера и примерно одинаковое количество очередей/множеств назначается каждому узлу.
Режим без коллокации стоит использовать только для PARTITIONED-кешей, так как этот режим поддерживается только ими.
Чтобы создать коллоцированные очередь или множество, установите свойство collocated в CollectionConfiguration.
Создание коллоцированной очереди:
Ignite ignite = Ignition.start();
CollectionConfiguration colCfg = new CollectionConfiguration();
colCfg.setCollocated(true);
// Создайте коллоцированную очередь.
IgniteQueue<String> queue = ignite.queue("queueName", 0, colCfg);
Создание коллоцированного множества:
Ignite ignite = Ignition.start();
CollectionConfiguration colCfg = new CollectionConfiguration();
colCfg.setCollocated(true);
// Создайте коллоцированное множество.
IgniteSet<String> set = ignite.set("setName", colCfg);
Очереди кеширования (Cache Queues) и балансировка нагрузки#
Элементы очереди остаются в ней до тех пор, пока кто-нибудь их не заберет, при этом один и тот же элемент никогда не попадает на два разных узла. В DataGrid очередь кеша можно использовать в качестве альтернативного подхода распределения заданий и балансировки нагрузки.
С помощью потоков на удаленных узлах можно добавлять в очередь вычисления, например экземпляры IgniteRunnable, и вызывать метод IgniteQueue.take(). Если очередь пустая, метод заблокируется. Если метод take() вернет задание, поток обработает его и снова вызовет take() для получения следующего задания. Потоки на удаленных узлах начнут выполнять следующее задание только после завершения предыдущего. Это позволяет создать идеально сбалансированная систему, в которой каждый узел берет только такое количество заданий, которое он может обработать.
Настройки коллекции#
Коллекции DataGrid можно настроить в API через CollectionConfiguration (подробнее написано в примерах выше).
Доступные параметры настройки:
Setter |
Описание |
Значение по умолчанию |
|---|---|---|
|
Устанавливает режим коллокации |
|
|
Устанавливает режим кеширования: |
|
|
Устанавливает режим атомарности кеша: |
|
|
Устанавливает максимальный размер памяти вне heap (Off-Heap) |
|
|
Устанавливает количество резервных копий |
|
|
Необязательный предикат. Указывает, на каких узлах должны храниться записи |
— |