Первый пост в Medium 🎊 .

Отказ от ответственности: я начал писать этот пост задолго до того, как клиент ES стал поддерживать конечную точку REST, которую я сейчас использую. Этот пост больше о шаблоне магнита в Scala.

Несколько недель назад я искал клиентскую библиотеку ElasticSearch в Scala/Java для чего-то, над чем я работал. Так как я работаю на Scala, я открыл список библиотек Scala в документации ElasticSearch и пробежался по списку.

Я специально искал тонкий клиент, который будет работать с конечной точкой HTTP REST ElasticSearch. Клиент Java по умолчанию присоединяется к кластеру и действует как узел. Программное обеспечение, над которым я работаю, должно быть настолько апатридным, насколько это возможно, поэтому я не мог его использовать (слишком много потоков и состояний).

Я наткнулся на эту библиотеку под названием esclient, которая содержит два исходных файла. Он не поддерживается, но это натолкнуло меня на мысль, что, возможно, мне следует написать код, который выглядит так же в моем исходном коде, так как я собираюсь запустить небольшой набор команд для ES.

ESClient.scala

Этот файл содержит фасад для ElasticSearch, и это довольно просто. Единственная плохая вещь здесь заключается в том, что этот клиент не использует конечную точку REST, он использует клиент Java для запроса ES и, таким образом, присоединяется к кластеру как узел.

Одна интересная вещь в этом заключается в том, что он использует шаблон Magnet, который представляет собой класс Type, который связывает два других типа вместе. Если вы не знаете, что такое классы типов, вам действительно стоит прочитать об этом.

Шаблон магнита в этом случае связывает тип запроса с типом ответа. Поэтому, когда вы используете клиент, вы не сможете запрашивать A и ожидать B.

ActionMagnet.scala

Этот файл содержит все неявные значения для ActionMagnets, которые можно использовать с ESClient.

Как это работает?

Вы можете видеть, что функция имеет три параметра типа и один параметр типа Action[Request, Response, RequestBuilder, Client]. Все эти типы взяты из базовой библиотеки Java ElasticSearch. Вы можете видеть, что автор использовал строгую систему типов базовой библиотеки, чтобы сделать вещи «безопасными».

Компилятор не позволит вам вызывать ESClient.execute с Request и Response, для которых нет соответствующих ActionMagnet. Неявные ActionMagnet находятся в Companion Object для трейта ActionMagnet (Подробнее о неявном разрешении в Scala).

Если есть действия, которые вы хотите вызвать, а библиотека не реализует, вы можете реализовать свои собственные ActionMagnet. Жаль, что фабричные методы являются частными.

Вывод

Чтение кода — отличный способ учиться на опыте других людей. Чтение этой библиотеки заняло у меня около 10 минут, и я узнал из нее две вещи:

  • Библиотеки должны следовать принципу открытости/закрытости, чтобы сократить объем обслуживания и увеличить время использования.
  • Классы типов в Scala прекрасно подходят для безопасности времени компиляции. Шаблон магнита создает еще один уровень безопасности, связывая два типа (или более), которые не должны быть связаны друг с другом в первую очередь (в нашем случае: объекты передачи данных).