- PVSM.RU - https://www.pvsm.ru -
Хочется поблагодарить 0leo [1], morisson [2] и adaptun [3] за помощь в подготовке статьи.
Многие уже читали статью [4] о миссии Gaia [5], до запуска которой осталось меньше суток, однако мало кто знает, какую технологию разработчики Европейского Космического Агентства выбрали [6] для обработки и хранения данных Gaia. В 2011 году в качестве кандидатов рассматривались IBM DB2, PostgreSQL, Hadoop [7], Cassandra [8] и Caché (точнее – технология Caché eXtreme Event Persistence [9]; см., напр., "Astrostatistics and Data Mining [10]" п/ред. Луиса Мануэля Сарро (Luis Manuel Sarro), Лорана Эйе (Laurent Eyer) и Уильяма О'Маллейна (William O'Mullane), c. 111-112).
О первых четырёх «игроках» индустрии знает, наверное, едва ли не каждый школьник. А вот что же такое Caché XEP?
Если посмотреть на стек Java API, предоставляемых компанией InterSystems, то мы увидим примерно следующее:
READ_UNCOMMITTED
[13] и READ_COMMITTED
[14] – и по умолчанию работает в режиме READ_UNCOMMITTED
.Если вчитаться в название упомянутой технологии, то невооружённым глазом видно, что оно как бы намекает на связь с задачей обработки сложных событий (XEP – eXtreme complex Event Processing). Эта задача решается повсеместно:
Какие же требования нынче предъявляются к технологиям, помогающим решить задачу? Требования просты и немногочисленны:
Если посмотреть на рынок IT, то можно сходу назвать следующие интересные реализации:
Справедливости ради стоит заметить, что технология Caché eXtreme сама по себе не является CEP/XEP-реализацией: XEP здесь расшифровывается не как eXtreme Event Processing, а всего лишь как eXtreme Event Persistence. Тем не менее, мы не видим причин, почему бы пресловутую CEP-парадигму было технически невозможно реализовать в рамках технологического стека InterSystems с привлечением такого продукта, как Ensemble [22]. Кроме того, многие внедрения достигают схожих целей, используя Caché eXtreme в связке с Esper [23] или NEsper.
Если взглянуть на высокоуровневую архитектуру Caché eXtreme, то она достаточно проста:
Здесь Globals API [24] обеспечивает быстрый низкоуровневый доступ к глобалам. Функциональность Globals API также доступна в виде бесплатной NoSQL-БД – GlobalsDB [25].
Caché XDO [26] – это быстрый «динамический» доступ к данным, не требующий присутствия объектной модели на стороне клиента. Ближайший аналог из мира Java – это Reflection [27].
Наконец, модуль с не совсем благозвучным для русского уха названием Caché XEP [28], также опирающийся на Globals API, предоставляет быстрый объектный и квази-реляционный доступ к данным. Объектный – в том смысле, что клиенту API не нужно заботиться об объектно-реляционном отображении: по образу и подобию объектной модели Java (даже в случае сложного многоуровневого наследования) автоматически создаётся [29] объектная модель на уровне классов Caché (или схема БД, если перейти к терминам реляционного представления). А квази-реляционный – в том смысле, что над множеством уже загруженных в БД «событий» можно выполнять SQL-запросы [30] (точнее, запросы, использующие подмножество SQL) прямо из контекста eXtreme-соединения, причём, более того, индексы [31] и транзакции тоже поддерживаются. Разумеется, все загруженные данные становятся немедленно доступны через JDBC посредством реляционного представления (с возможностью использования всей мощи ANSI SQL плюс расширений SQL, характерных для диалекта Caché), но скорость доступа будет уже совсем другая. Ещё раз, в качестве резюме, у нас есть:
Такой подход даёт некоторые преимущества и перед аналогичными реляционными (более высокая скорость доступа), и перед разнообразными NoSQL-решениями (немедленный доступ к данным в реляционном стиле).
Дополнительно можно сказать, что eXtreme-соединение может быть двух видов: соединение, использующее JNI (но требующее, чтобы сервер Caché был доступен локально – отличие от JDBC-соединения 2-го типа в том, что не поддерживается передача данных по сети), и обычное TCP-соединение, где передача данных осуществляется посредством стандартного JDBC-драйвера 4-го типа.
«Тонкость настройки» JNI-версии состоит исключительно в том, что нужно настроить окружение:
GLOBALS_HOME
должна указывать на каталог, содержащий инсталляцию Caché, иLD_LIBRARY_PATH
(DYLD_LIBRARY_PATH
для Mac OS X или PATH
для Windows) должна содержать ${GLOBALS_HOME}/bin
.Для TCP-версии достаточно увеличить размер стека (stack) и кучи (heap) JVM (-Xss2m -Xmx768m
).
Авторам было интересно, как ведёт себя Caché eXtreme в задаче записи непрерывного потока данных по сравнению с популярными технологиями обработки данных. В качестве источника данных были взяты исторические котировки с сайта холдинга "Финам [32]", которые можно загрузить в CSV-формате (авторы статьи благодарны создателям такого замечательного ресурса).
Поскольку найти искомую ссылку на сайте едва ли реально (во второй и последующие разы у нас не получилось), то делимся ею здесь [33].
В результате был написан некий достаточно наивный тест, который полностью игнорирует правила написания микротестов производительности на Java. В частности, так и не дошли руки прикрутить JMH [34]. Некоторым оправданием может послужить то, что мы измеряем всё-таки не скорость кода, сгенерированного JIT, а скорость, с которой не имеющий отношения к JVM код (за исключением Apache Derby) умеет записывать на диск. Вопрос, подчиняется [35] ли [36] участвовавший в тестах жёсткий диск syscall'у fsync()
мы, увы, тоже оставили без внимания.
Итак, в забеге участвовали:
Сразу скажем, что в силу приближённости тестов мы не видим смысла в приведении точных цифр: погрешность достаточно велика, и целью статьи является лишь продемонстрировать общую тенденцию. Из тех же соображений, а также в силу неумения настраивать GC, мы не указываем точную версию JDK и настройки сборщика мусора: серверные 6u45 и 7u40 с -Xmx2048m -Xss128m
показали схожую производительность на Linux и Mac OS X. В каждом из тестов сохранялось около миллиона событий; тесту для каждой отдельной БД предшествовали несколько (до 10) «прогревающих» запусков. Что касается настроек Caché, то кэш программ (routine cache) был увеличен до 256 МБ, а восьмикилобайтный кэш БД (8kb database cache) – до 1024 МБ.
Собственно, результаты выглядят следующим образом:
Derby и другие реляционные СУБД дают скорость записи, варьирующуюся от 1000 до 1500 событий/сек. Caché в JDBC-режиме даёт бóльшую скорость (от 6000 до 7000 eps), но эта скорость имеет свою цену: используемый по умолчанию уровень изоляции транзакций, как уже было сказано выше, – это READ_UNCOMMITTED
. Далее, Caché eXtreme даёт 45000-50000 eps в pure-Java-режиме и больше 80000 eps при общении с локальным экземпляром Caché через JNI. Наконец, если пойти на некоторый риск и отключить транзакционный журнал [37] (для отдельно взятого текущего процесса), то на тестовой машине оказалось возможным довести скорость записи при JNI-соединении до 100000 eps.
Всем, кому интересны более точные цифры, или хочется сделать тесты более корректными, или кого приведённые результаты задели за живое, предлагаем ознакомиться с исходным кодом [38]. Для сборки и запуска вам понадобятся JDK 1.6+, Git, Maven (в т. ч. Maven Install Plugin [39] для создания локальных артефактов Caché JDBC и Caché eXtreme), и, наконец, Caché (Рекомендуем заказать временный лицензионный ключ [40] – это бесплатно. Также мы предлагаем ВУЗам присоединиться к программе InterSystems Campus [41] и получить официальные дистрибутивы Caché с академической лицензией. В любом случае, консультанты InterSystems готовы помочь с проведением нагрузочного тестирования в вашем проекте).
Комментарии приветствуются.
Автор: unix_junkie
Источник [43]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/java/51028
Ссылки в тексте:
[1] 0leo: http://habrahabr.ru/users/0leo/
[2] morisson: http://habrahabr.ru/users/morisson/
[3] adaptun: http://habrahabr.ru/users/adaptun/
[4] статью: http://habrahabr.ru/post/205872/
[5] Gaia: http://sci.esa.int/gaia/
[6] выбрали: http://www.intersystems.ru/press/2013/gaia-mission-1yr-later.html
[7] Hadoop: http://hadoop.apache.org/
[8] Cassandra: http://cassandra.apache.org/
[9] Caché eXtreme Event Persistence: http://docs.intersystems.com/cache20131/csp/docbook/DocBook.UI.Page.cls?KEY=BXJV_xep
[10] Astrostatistics and Data Mining: http://books.google.com/books?id=ys-e0SotvBoC&lpg=PA109&ots=ut05m7Pem5&dq=Astrometric%20Global%20Iterative%20Solution%20Intersystems&hl=ru&pg=PA112#v=onepage&q=Astrometric%20Global%20Iterative%20Solution%20Intersystems&f=false
[11] Caché Object Binding: http://docs.intersystems.com/cache20131/csp/docbook/DocBook.UI.Page.cls?KEY=BLJV
[12] Jalapeño: http://docs.intersystems.com/cache20131/csp/docbook/DocBook.UI.Page.cls?KEY=GBJJ
[13] READ_UNCOMMITTED
: http://java.sun.com/javase/7/docs/api/java/sql/Connection.html#TRANSACTION_READ_UNCOMMITTED
[14] READ_COMMITTED
: http://java.sun.com/javase/7/docs/api/java/sql/Connection.html#TRANSACTION_READ_COMMITTED
[15] .NET: http://docs.intersystems.com/cache20131/csp/docbook/DocBook.UI.Page.cls?KEY=BXNT
[16] Node.js: http://docs.intersystems.com/cache20131/csp/docbook/DocBook.UI.Page.cls?KEY=BXJS
[17] XTP: http://ru.wikipedia.org/wiki/%D0%AD%D0%BA%D1%81%D1%82%D1%80%D0%B5%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%BE%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0_%D1%82%D1%80%D0%B0%D0%BD%D0%B7%D0%B0%D0%BA%D1%86%D0%B8%D0%B9
[18] [1]: http://www.cnews.ru/reviews/free/marketBD/int/intersys/
[19] [2]: http://citforum.ru/seminars/cbd2010/1_3_InterSystems.pdf
[20] бизнес-правил: http://en.wikipedia.org/wiki/Rete_algorithm
[21] загрузить: http://www.sybase.com/products/financialservicessolutions/complex-event-processing
[22] Ensemble: http://docs.intersystems.com/ens20131/csp/docbook/DocBook.UI.Page.cls?KEY=EGIN_intro
[23] Esper: http://esper.codehaus.org/
[24] Globals API: http://docs.intersystems.com/ens20131/csp/docbook/DocBook.UI.Page.cls?KEY=BXJV_globals
[25] GlobalsDB: http://globalsdb.org/
[26] Caché XDO: http://docs.intersystems.com/ens20131/csp/docbook/DocBook.UI.Page.cls?KEY=BXJV_dynamic
[27] Reflection: http://en.wikipedia.org/wiki/Reflection_%28computer_programming%29#Java
[28] Caché XEP: http://docs.intersystems.com/ens20131/csp/docbook/DocBook.UI.Page.cls?KEY=BXJV_xep
[29] автоматически создаётся: http://docs.intersystems.com/ens20131/csp/docbook/DocBook.UI.Page.cls?KEY=BXJV_xep_import
[30] можно выполнять SQL-запросы: http://docs.intersystems.com/ens20131/csp/docbook/DocBook.UI.Page.cls?KEY=BXJV_xep_queries
[31] индексы: http://docs.intersystems.com/ens20131/csp/docbook/DocBook.UI.Page.cls?KEY=BXJV_xep_events_indexing
[32] Финам: http://www.finam.ru
[33] делимся ею здесь: http://www.finam.ru/analysis/profile041CA00007/default.asp
[34] JMH: http://openjdk.java.net/projects/code-tools/jmh/
[35] подчиняется: http://brad.livejournal.com/2116715.html
[36] ли: http://lists.apple.com/archives/darwin-dev/2005/Feb/msg00072.html
[37] отключить транзакционный журнал: http://docs.intersystems.com/ens20131/csp/docbook/DocBook.UI.Page.cls?KEY=GMSM_management_journaling
[38] исходным кодом: https://github.com/unix-junkie/persistence-benchmark
[39] Maven Install Plugin: http://maven.apache.org/plugins/maven-install-plugin/
[40] временный лицензионный ключ: http://intersystems.ru/aboutus/contact.html
[41] InterSystems Campus: http://www.intersystems.ru/cache/education/cachecampus/
[42] Yahoo! Cloud Serving Benchmark: https://github.com/brianfrankcooper/YCSB/wiki
[43] Источник: http://habrahabr.ru/post/194814/
Нажмите здесь для печати.