Чуть больше года назад встала проблема выбора NoSQL решения для проекта. Был ряд определенных требований.
- Возможность расширения (триггеры, хранимые процедуры);
- Полнотекстовый поиск;
- Наличие провайдера для .NET;
- Поддержка POCO;
- Возможность развернуть на Windows платформе;
- Желательно поддержка lucene.net;
- Желательно поддержка транзакций;
- Желательно поддержка асинхронных запросов;
- Желательно map reduce;
- Желательно наличие документации и сообщества разработчиков.
После долгих поисков и сравнений выбор пал на RavenDb. Меня немного удивило, что данному продукту посвящено не так много публикаций. После года общения с данным NoSQL решением решил поделиться впечатлениями. Переписывать документацию не вижу смысла, все очень хорошо описано на сайте проекта и в официальных группах. А также блоге разработчика Ayende blog.
Нравится
Простота развертывания. Можно использовать как встроенное в проект решение, так Windows service и консольное приложение.
Ни разу не терял данных. Учитывая постоянные издевательства и эксперименты с базой считаю ее заслугой.
Простота перехода на новую версию. Просто нужно остановить Raven и закинуть новый билд в рабочую папку сервера. В проекте все обходится обновлением NuGet пакета.
Расширяемость. Есть множество возможностей по встраиванию своего функционала на стороне сервера. Причем код может быть написан на .NET. В нашем распоряжение все, начиная от триггеров на изменение данных и индексов до создания своих расширений, позволяющих обогатить API сервера.
Индексы lucene.net. Хорошее, всем известное решение. Есть возможность использовать свои классы анализа. Работа с полнотекстовым поиском проста и понятна.
Debug mode. Запустив в данном режиме, можно просматривать в консоли все обрабатываемые запросы и время их выполнения, что довольно удобно.
Встроенный функционал кеширования. Довольно удобная вещь, позволяет указывать в коде какие запросы должны быть кэшированы на стороне сервера.
Быстрая реакция в сообществе на возникающие вопросы. Пару раз сталкивался с багами, исправления появлялись практически онлайн.
Возможность формирования запросов как с использованием LINQ, так и используя синтаксис lucene.
Scripted Patch API. Довольно мощный инструмент позволяющий отправлять запросы на изменения документа с использованием скриптов javascript. Возможно перелопатить документ как вам угодно с использованием javascript.
Описание индексов в коде. Очень удобно когда можно создать отдельную сборку .NET с описанием индексов. При запуске приложения будет проверено наличие индексов и актуальность их описания. В случае несовпадения индексы будут перестроены.
Поддержка транзакций. Все довольно просто и понятно, используется TransactionScope.
Работа с POCO очень удобна. При необходимости можно легко добавить новые поля в объект документа. Для старых документов поля буду заполняться значениями по умолчанию.
Возможность задать приоритеты для обработки индексов. Если у нас есть набор индексов и часть из них должна работать онлайн, а другая может и подождать, то мы можем задать режимы их работы. Normal – изменения вносятся незамедлительно. Idle – изменения вносятся когда нет больше работы. Disable – индекс не перестраивается. Abandoned – изменения вносятся когда продолжительное время нет работы.
Не нравится
Интерфейс администрирования. Написан на Silverlight, что я бы не отнес к плюсам. В общем, работает стабильно, но постоянно возникают мелкие косячки. Это немного раздражает. Например, состояние индекса может отображаться как stale, но если открыть студию заново или параллельно в другом браузере, то покажет, что индекс находится в актуальном состоянии.
Автоматическое приведение описаний индексов в актуальное состояние. Если данных и индексов мало, то все работает отлично, но с ростом хранимой информации этот процесс становится все более загадочным. Иногда происходит перестроение не измененных индексов, причем самых сложных. Это заставляет проводить в ожидании некоторое время, что немного бесит.
Поддержка асинхронного обращения есть, но в сессии может выполнятся только один асинхронный запрос. То есть нельзя выполнить в одном подключении параллельно несколько запросов.
Плохая статистика. Когда необходимо проанализировать работу индекса у вас практически ничего нет. Есть время map reduce одной порции, но этого маловато.
HTTP Rest API. Подключение идет только по http, данные передаются в JSON, что сказывается на производительности. Хотелось бы иметь возможность подключения по мимо http.
Patch API не поддерживает транзакций. Это обидно и иногда этого очень не хватает.
Странно
Скорость индексации. Не очень понятна работа потоков индексации. Иногда они жрут практически все ресурсы, а в какой-то момент, при наличие работы, все как будто замирает. Хотелось бы больше информации о их работе.
Скорость исполнения запросов. Тоже не очень понятна. Не буду сравнивать с другими NoSql решениями, но иногда складывается впечатление что работать могла бы и побыстрее.
Заключение
В целом продукт довольно интересный. Жаль, что ему уделяется мало внимания. Raven постоянно развивается, новый функционал появляется регулярно. Есть свои минусы, но на данный момент .NET NoSql решений довольно мало. Поэтому, если кто-то встанет перед выбором NoSql для своего .NET проекта, я бы осмелился порекомендовать присмотреться к RavenDb.
Автор: langoner