Статьи

Сила электронных таблиц в реактивном, RESTful API

Будучи в основном технарем, я недавно и по общему признанию был обманут своим собственным отношением к Дильбертеску, когда наткнулся на эту наполненную модным словом статью TechCrunch об эспрессо-логике . Когда-либо беспокоился о моей репутации в социальных сетях (например, reddit и hackernews karma), я думал, что было бы разумно разместить ссылку на эти платформы под названием:

Только что нашел эту статью на TechCrunch. Читается как сгенерированная цепочкой Маркова серия модных слов.

С таким броским заголовком, пост быстро взлетел — и, как и многие другие редакторы, мои мысли были о Geek и Poke:

Компьютерщик и тыкает на большие данные

Компьютерщик и Poke на больших данных . Изображение лицензировано CC-BY 3.0

Но, как и некоторые другие редакторы, я не мог удержаться от перехода на реальный продукт, который претендует на реализацию «реактивного программирования» через API REST и JSON. И я искренне впечатлен идеями этого продукта. На этот раз модные слова поддерживаются программным обеспечением, реализующим их очень хорошо! Давайте сначала углубимся в …

Реактивное программирование

Реактивное программирование — термин, который недавно получил довольно широкое распространение в Typesafe , компании, стоящей за Akka . Это также получило дополнительную популярность с тех пор, как Эрик Мейер (создатель LINQ ) покинул Microsoft, чтобы полностью посвятить свое время своей новой компании Applied Duality . С этими блестящими умами остро на эту тему, мы обязательно услышим больше о Реактивном Манифесте в ближайшем будущем.

превосходитьНо на самом деле, каждый менеджер уже знает преимущества «реактивного программирования», поскольку он работает с самым реактивным и, возможно, самым удивительным программным обеспечением на планете: Microsoft Excel , устройством, тайна которого превосходит его мощь. Подумайте о том, какой классный Excel. У вас есть сотни правил, формул, ячеек-взаимозависимостей. И каждый раз, когда вы меняете значение, вся электронная таблица волшебным образом обновляется. Это реактивное программирование.

Сила реактивного программирования заключается в его выразительности. Используя очень мало выразительной логики, вы можете выразить то, что в противном случае требует десятков строк SQL или сотен строк Java.

Эспрессо Логик

Имея это в виду, я начал вникать в бесплатную пробную версию Espresso Logic . Обратите внимание, что я нетерпеливый человек, который хочет быстрых результатов, не читая документы. Если вы работаете наоборот, есть несколько интересных ресурсов для начала:

В любом случае, демонстрационная версия поставляется с предустановленной базой данных MySQL, содержащей то, что похоже на типичную схему электронной коммерции, содержащую таблицы customer, employee, lineitem, product, purchaseorder и purchaseorder_audit:

Просмотр схемы в Espresso Logic

Просмотр схемы в Espresso Logic

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

Live API

Пока что все как и ожидалось. Пользовательский интерфейс, возможно, немного острый, поскольку продукт существует только с конца 2013 года. Но то, что показалось мне весьма интересным, это то, что Espresso Logic называет Live API . С помощью пары щелчков мыши я могу собрать древовидную структуру REST-ресурсов из различных типов ресурсов, таких как таблицы базы данных. После этого Espresso Designer почти автоматически объединит таблицы для создания деревьев, подобных этому:

Представление дерева ресурсов Espresso Logic

Представление дерева ресурсов Espresso Logic

Обратите внимание, как я могу легко связать дочерние объекты с их родителями. Теперь этот API все еще немного ограничен. Например, я не мог понять, как перетащить отношения отчетности, где я рассчитываю сумму заказа для каждого клиента и продукта. Тем не менее, я могу переключить тип ресурса с «нормального» на «SQL», чтобы добиться этого с помощью простой старой GROUP BYи агрегатной функции .

Я начал понимать, что на самом деле я управляю и разрабатываю RESTful API на основе доступных ресурсов базы данных! Чуть дальше по меню я нашел пункт «Quick Ref» , который помог мне понять, как вызывать этот API:

Краткий справочник по API

Краткий справочник по API

Таким образом, каждый из ранее определенных ресурсов предоставляется через URL, как и следовало ожидать от любого RESTful API. Что действительно приятно, так это то, что у меня есть встроенная версия API и ключ API. Обратите внимание, что с точки зрения OWASP настоятельно не рекомендуется передавать ключи API в запросах GET. Это всего лишь пример использования для быстрого запуска демо-версии и для нечетного теста разработчика. Не используйте это в производстве!

Во всяком случае, я назвал URL в своем браузере с ключом API в качестве параметра (что противоречит моим собственным правилам):

https://eval.espressologic.com/rest/[my-user]/demo/v1/AllCustomers?auth=[my-key]:1

И я получил документ JSON, как это:

[
  {
    "@metadata": {
      "href": "https://eval.espressologic.com/rest/[my-user]/demo/v1/Customers/Alpha%20and%20Sons",
      "checksum": "A:cf1f4fb79e8e7142"
    },
    "Name": "Alpha and Sons",
    "Balance": 105,
    "CreditLimit": 900,
    "links": [
    ],
    "Orders": [
      {
        "@metadata": {
          "href": "https://eval.espressologic.com/rest/[my-user]/demo/v1/Customers.Orders/6",
          "checksum": "A:0bf14e2d58cc97b5"
        },
        "OrderNumber": 6,
        "TotalAmount": 70,
        "Paid": false,
        "Notes": "Pack with care - fragile merchandise",
        "links": [
        ], ...

Обратите внимание, что у каждого ресурса есть ссылка и контрольная сумма. Контрольная сумма необходима для оптимистической блокировки, которая является встроенной, если вы решите одновременно обновить любой из вышеперечисленных ресурсов. Обратите также внимание на то, как указывается вложенный ресурс Orders Customers.Orders. Я также могу получить к нему доступ напрямую, позвонив по указанному выше URL.

Живая Логика / Реактивное Программирование

Все идет нормально. Подобные вещи были реализованы в различных программах. Например, Adobe Experience Manager / Apache Sling интуитивно открывает хранилище JCR и через REST. Но идея Espresso Logic действительно начала меня очаровывать, когда я нажал «Live Logic» , и я столкнулся с заранее сконфигурированным набором правил, которые применяются к данным:

Правила просмотра

Правила просмотра

Я быстро просмотрел руководство, чтобы понять, правильно ли я понял. Эти правила на самом деле напоминают правила, которые я могу ввести в любом программном обеспечении для работы с электронными таблицами. Так , например, по- видимому , как если бы customer.balanceстолбец вычисляется как сумма всех purchaseorder.amount_totalимеющий paidзначение false, и так далее.

Итак, если я продолжу эту цепочку правил, то получу lineitem.product_priceобщую зависимость от всех других вычисляемых значений. При изменении этого значения весь набор обновлений должен проходить через мой набор правил, чтобы окончательно изменить customer.balance:

changing lineitem.product_price
-> changes lineitem.amount
  -> changes purchaseorder.amount_total
    -> changes customer.balance

В зависимости от того, насколько вы хакер консоли, вы можете написать свой собственный вызов PUT, используя curl , или вы можете использовать REST Lab из Espresso Designer, который поможет вам правильно настроить все параметры. Итак, если мы хотим изменить позицию с предыдущего вызова:

{
  "@metadata": {
    "href": "https://eval.espressologic.com/rest/[my_user]/demo/v1/Customers.Orders.LineItems/11",
    "checksum": "A:2e3d8cb0bff42763"
  },
  "lineitem_id": 11,
  "ProductNumber": 2,
  "OrderNumber": 6,
  "Quantity": 2,
  "Price": 25,
  ...

Давайте просто попробуем обновить это, чтобы иметь цену 30:

Использование лаборатории REST для выполнения запросов PUT

Использование лаборатории REST для выполнения запросов PUT

И вы можете видеть в ответе, есть сводка транзакций, которая показывает, что Customers.Orders.TotalAmountизменилось с 50 на 60, Customers.Balanceизменилось с 105 на 95, и была записана запись аудита. Сама запись аудита также определяется правилом, как и любое другое правило. Но есть также обычный файл журнала, который показывает, что действительно произошло, когда я запустил этот запрос PUT:

Представление журнала, показывающее все выполненные вставки и обновления

Представление журнала, показывающее все выполненные вставки и обновления

Представьте, что вам нужно самим разместить все эти утверждения INSERTи UPDATEутверждения в правильном порядке и правильно управлять кэшированием и транзакциями! Вместо этого все, что мы сделали, это определили некоторые правила. Полный обзор доступных типов правил приведен на этой странице руководства Live Logic.

Вне сферы возможностей этого поста

… До сих пор мы рассматривали самые очевидные особенности Espresso Logic. Но есть и другие. Пара примеров:

Серверный JavaScript

Если правила не могут выразить это, JavaScript может . Существуют различные точки приложения, в которых вы можете внедрить свои фрагменты JavaScript, например, для проверки, более сложных выражений правил, преобразования запросов и ответов и т. Д. Хотя мы не пробовали это делать, оно читается как триггеры на основе строк, написанные в JavaScript .

Поддержка хранимых процедур

Люди, стоящие за Espresso Logic, являются «наследниками», такими же, как мы в Data Geekery . Их целевая аудитория может уже иметь тысячи сложных хранимых процедур с большим количеством бизнес-логики. Они не должны быть переписаны на JavaScript. Но так же, как таблицы, представления и ресурсы REST, они предоставляются через API REST, принимая параметры GET для параметров IN и возвращая JSON для параметров и курсоров OUT .

С точки зрения jOOQ, просто замечательно , что кто-то еще воспринимает хранимые процедуры так же серьезно, как и мы.

Безопасность на уровне строк / столбцов

Существует встроенный модуль управления пользователями и ролями, который позволяет вам обеспечить централизованно управляемый, детальный контроль доступа к вашим данным. Не многие базы данных поддерживают безопасность на уровне строк, как, например, база данных Oracle. Таким образом, наличие такого рода функций в вашей платформе действительно повышает ценность многих интеграций с RDBMS. Некоторые дополнительные ресурсы по этой теме:

Вывод: запросы против обновления или постоянства на основе правил

В нашем блоге jOOQ и на наших маркетинговых веб-сайтах (например, hibernate-alternative.com ) мы всегда поддерживаем два основных варианта использования при работе с базами данных:

  • Запросы: у вас есть очень сложные запросы для расчета таких вещей, как отчеты. Для этого идеально подойдет SQL (например, через jOOQ )
  • Обновление: у вас очень сложная модель предметной области с множеством элементов и дельт, которые вы хотите сохранить за один раз. Для этого идеально подходят Hibernate / ORM

Но сегодня Espresso Logic показала нам, что есть еще один вариант использования. Тот, который покрыт методами реактивного программирования (или « программирования электронных таблиц »). И это:

  • Постоянство на основе правил: у вас очень сложная модель предметной области с множеством элементов и множеством правил, которые вы хотите проверять, вычислять и синхронизировать постоянно. Для этого и SQL, и ORM являются решениями на неправильном уровне абстракции.

Этот «новый» вариант использования на самом деле довольно распространен во многих корпоративных приложениях, где сложные бизнес-правила в настоящее время изложены в миллионах строк императивного кода, который очень трудно расшифровать и еще сложнее проверить / изменить. Как вы можете перепроектировать свои бизнес-правила из миллионов строк старого кода, написанного на языке COBOL ?

В Data Geekery мы всегда ищем новые технологии. Espresso Logic — молодой стартап с новым продуктом. Тем не менее, как уже упоминалось, они являются стартапом с начальным финансированием , очень убедительной и инновационной идеей и огромным рынком унаследованных приложений на языке COBOL, которые хотят начать изучать «сексуальные» новые технологии, такие как RESTful API, JSON, реактивный программирование. Это может просто сработать! Если вы еще не видели достаточно, изучите этот учебник , который включает в себя расширенные примеры, такие как «сведение ценовой ведомости материалов», «взрыв комплекта ведомостей материалов», «сведение бюджета», «аудиторские проверки заработной платы» и многое другое.

Мы обязательно будем следить за будущими улучшениями платформы Espresso Logic !