Если вы работали с Apache Ignite, вы, вероятно, заметили, что существует довольно много различных клиентских коннекторов, которые вы можете использовать. Клиентский узел, толстый клиент, тонкий клиент, драйвер JDBC, драйвер ODBC, REST API,… Все это может немного запутать.

«Какой тип клиента мне нужно использовать в МОЕМ приложении?» - спросите вы себя.

Так позвольте мне сломать это. Ниже приведены все клиентские коннекторы, доступные для Apache Ignite из коробки, а также некоторые рекомендации относительно того, когда вы должны (или не должны) их использовать.

Толстый клиент (он же клиентский узел)

Толстый клиент - это, по сути, обычный узел Ignite, работающий в клиентском режиме.

Разница между клиентскими узлами и серверными узлами скорее логическая, чем физическая. Клиенты не участвуют в кэшировании, вычислениях, развертывании служб и других подобных действиях, но внутри они работают (почти) точно так же, как серверы. В основном это означает, что клиентский узел использует одни и те же механизмы обнаружения и коммуникации, что дает как преимущества, так и недостатки.

Плюсы

  • Толстый клиент является частью топологии, поэтому он знает о конфигурации разделения, а также о методах совместного размещения данных, которые вы применили к своим кэшам. Всякий раз, когда толстый клиент отправляет запрос на чтение или обновление записи кэша, он направляется непосредственно к узлу, где эта запись хранится - это очень эффективно с точки зрения масштабируемости и производительности.
  • Толстые клиенты предоставляют полный набор API, доступных в Apache Ignite. Некоторые функции (например, ближние кеши или непрерывные запросы) доступны ТОЛЬКО в толстых клиентах.

Минусы

Как всегда, высокая эффективность и богатая функциональность имеют свою цену.

  • Во-первых, толстый клиент довольно тяжелый (отсюда и название) - в некоторых случаях он может потреблять довольно много ресурсов процессора и оперативной памяти. Например, если вы выполняете SQL-запрос, клиент фактически используется как редуктор, который накапливает вспомогательные результаты с разных узлов и выполняет окончательные вычисления. Опять же - это хорошо для производительности, но также требует большей мощности ЦП / ОЗУ. Если ваше приложение работает на устройстве с ограниченными ресурсами, вы, скорее всего, захотите использовать другие параметры.
  • Во-вторых, требуется, чтобы каждый толстый клиент имел полное соединение с каждым узлом сервера. Более того, поскольку толстый клиент - это просто обычный узел, возможно, что серверный узел инициирует TCP-соединение с клиентским узлом. Если между кластером и приложением есть брандмауэр, NAT или балансировщик нагрузки, использовать толстые клиенты будет действительно сложно или даже невозможно. По сути, это означает, что толстые клиенты лучше использовать в той же физической среде, в которой работают серверные узлы.
  • Наконец, имейте в виду, что клиенты могут быть доступны только для языков JVM, .NET и C ++. Для других платформ вам придется использовать другие варианты.

Тонкий клиент

Тонкие клиенты на самом деле намного ближе к тому, о чем мы обычно думаем, когда говорим о клиентах. Тонкий клиент очень легкий, инициирует одно соединение сокета TCP с одним из узлов кластера и взаимодействует с помощью простого двоичного протокола. Он также следует очень простой схеме запрос-ответ.

Плюсы

  • Тонкие клиенты потребляют минимум ресурсов и очень нетребовательны с точки зрения сетевых коммуникаций. Это делает их идеальными для удаленных приложений, работающих за пределами центра обработки данных кластера за NAT или брандмауэром. Они также отлично работают на устройствах с ограниченными ресурсами. Интернет вещей - хороший пример использования тонких клиентов.
  • Бинарный протокол, используемый тонкими клиентами, не зависит от языка и платформы, что означает, что вы можете запускать тонкий клиент практически где угодно. В настоящее время Ignite предоставляет реализации, написанные на Java, .NET, C ++, Python, NodeJS и PHP, что уже превосходит то, что у нас есть для толстых клиентов. И довольно легко добавить новые языки в этот список.

Минусы

  • Тонкий клиент не поддерживает совместное размещение. Обычно он подключается только к одному узлу в кластере, который используется в качестве шлюза - все запросы от клиента проходят через этот узел сервера. Это создает очевидное узкое место. Некоторые реализации поддерживают балансировку нагрузки между двумя или более узлами, но даже в этом случае масштабируемость более ограничена, чем у толстых клиентов.
  • Тонкие клиенты предоставляют ограниченный API. В настоящее время вы можете только создавать / уничтожать кеши, выполнять операции ключ-значение и запросы SQL. API Compute Grid и Service Grid, вероятно, будут добавлены в будущем (вклады приветствуются!). Однако расширенные функции, требующие push-уведомлений от серверов к клиентам (около кешей, непрерывные запросы) или сложные модели потоковой передачи (потоковая передача данных), скорее всего, никогда не будут реализованы для тонких клиентов.

Драйверы JDBC и ODBC

JDBC и ODBC - это стандартные API-интерфейсы SQL для языков, совместимых с JVM и C ++ соответственно. Ignite предоставляет готовые реализации для этих API:

Архитектурно они работают точно так же, как тонкие клиенты - подключаются к одному из узлов и используют этот узел в качестве шлюза. По этой причине драйверы SQL имеют те же преимущества и недостатки, что и тонкие клиенты. Однако есть еще пара ключевых отличий, о которых я хотел бы упомянуть.

Плюсы

  • JDBC и ODBC являются отраслевыми стандартами, а это означает, что предоставленные драйверы упрощают интеграцию с существующими инструментами, ориентированными на SQL. Например, вы можете использовать их для прозрачного подключения инструментов бизнес-аналитики, таких как Tableau или Pentaho, к Apache Ignite.

Минусы

  • Ограничение здесь очевидно - вы получаете только API SQL от этого типа клиентского коннектора. По моему опыту, в подавляющем большинстве случаев использования требуется больше функций, если вы хотите получить максимальную отдачу от Apache Ignite с точки зрения масштабируемости и производительности. Если у вас нет другого выбора, кроме использования стандартного JDBC / ODBC, я настоятельно рекомендую рассмотреть другие варианты.

REST API

Apache Ignite также поставляется с REST API, который позволяет выполнять базовые операции, такие как чтение или обновление записей кеша, выполнение SQL-запросов, просмотр некоторых показателей и т. Д.

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

Однако REST API иногда может быть полезен во время разработки или тестирования - например, для быстрой проверки определенного значения записи или результата SQL-запроса.

Выбор правильного варианта

Хорошо, есть несколько вариантов клиентских коннекторов, и у каждого из них есть свои плюсы и минусы. Итак, какой из них выбрать для конкретного приложения? Вот простой алгоритм, который поможет вам определиться с выбором.

  1. Если приложение развертывается в той же среде, в которой работают серверные узлы, и пока существует полное сетевое соединение между приложением и каждым серверным узлом (т. Е. Без брандмауэра или NAT), используйте толстый клиент. Вообще говоря, толстые клиенты должны быть вашим первым выбором, поскольку они наиболее эффективны и обеспечивают наибольшую функциональность.
  2. Если приложение является удаленным и / или работает на устройстве с ограниченными ресурсами, используйте тонкий клиент. Это ваш второй выбор.
  3. Наконец, если приложение должно использовать стандартный JDBC или ODBC API (например, это инструмент бизнес-аналитики, такой как Tableau), используйте соответствующий драйвер SQL.

Вот и все! Разве это больше не сбивает с толку, правда? 🙂 Я определенно на это надеюсь. Но если что-то все еще неясно, не стесняйтесь комментировать ниже.