// DevCon•12
Интеграция Apache Lucene
в Windows Azure
ВАДИМ НОВИЦКИЙ
@vadinov | ifface.com
Вице-президент по разработке в проекте
AtContent.com, IFFace Inc.
#msdevcon
О сервисе
AtContent.com
AtContent - это
Платежная
система
внутри
Аналитика
и
статистика
Управление
разделением
дохода
Оплата
автору
напрямую
Новый
подход к
публикации
и
дистрибуции
Автоматиза
ция
разделения
дохода
Управление
контентом
из одного
места
Легальное
копирование
проще и
выгоднее
нелегального
Архитектура
#msdevcon
Как же все происходит внутри?
Демонстрация решения
Демонстрация
#msdevcon
Полнотекстовый поиск в Windows Azure
Apache Lucene
Apache Lucene - это
Библиотека для полнотекстового поискаВысокопроизводительная
Написана на Java
С открытым исходным кодом
Кроссплатформенная
Портирована на многие языки программирования, включая C#
Apache Lucene в AtContent
Индексирование публикаций
Индексирование профилей
пользователей
Поиск по публикациям и профилям
пользователей
#msdevcon
Доступна по ссылке:
http://ou.gs/AzureDirectory
Библиотека Lucene.NET for
Azure
Детали реализации
Хранение индексовApache Lucene — файлы
Lucene.NET for Azure — блобы
Структура данныхЭлемент индекса — документ
Элемент документа — поле
Добавление в индекс
SearchTicket Ticket = Item.GetSearchTicket();
DeleteDocument(Ticket.Id);
string Language = DefinitionLanguage(Ticket.Language);
Analyzer Analyzer = new SnowballAnalyzer(Language);
var Writer = new IndexWriter(Directory, Analyzer);
AddDocument(Writer, Ticket);
Writer.Optimize();
Writer.Commit();
Writer.Close();
Добавление документа
var Doc = new Document();
Doc.Add(new Field("Id", Id, Field.Store.YES, Field.Index.NOT_ANALYZED, Field.TermVector.NO));
Doc.Add(new Field("Type", Type, Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.WITH_POSITIONS_OFFSETS));
Doc.Add(new Field("IndexField", IndexField, Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.WITH_POSITIONS_OFFSETS));
Writer.AddDocument(Doc);
Блокировка поискового индекса
Поисковый индекс
блокируется на время
изменения
Lease Extensions
Используется
расширение для
блобов, блокирующее
запись в блоб
Особенности исключений
Некоторые исключения
вываливаются из
библиотеки наружу
Производительность
Синтетический тест на 1 000 000 записейЗаполнение индекса — около 250 секунд
Поиск частоупотребимого слова — 8-25 мс. (50 потоков,
478 325 совпадений)
Поиск редкоупотребимого слова — ≈0-5 мс. (50 потоков,
283 совпадения)
Конкурентный поиск не увеличивает время обработки запроса
Размер индекса — 20-30% от исходного контента
Сделать свой Яндекс?
Не получится Отсутствие поддержки морфологии
Терабайты индексов нужно где-то хранить
Отличия между поисковым движком и поисковой системой
Альтернативы
Bing API5 000 запросов в сутки бесплатно
Поиск по веб, картинкам, новостям, видео
Не решает проблему поиска внутри сервиса
SphinxПотребует дополнительного MySQL-сервера
Более сложная интеграция
НЕ масштабируется
#msdevcon
Библиотека улучшений для Windows Azure
CPlase Engine
Фабрика контекстов
Создание контекстов
для работы с Table
Storage, Blob Storage и
Queue
//было
var StorageAccount = RoleEnvironment.IsEmulated ?CloudStorageAccount.FromConfigurationSetting(
"EmulatedConnectionString") :
CloudStorageAccount.FromConfigurationSetting(
"ConnectionString");
var Context = new TableServiceContext(
StorageAccount.TableEndpoint.ToString(),
StorageAccount.Credentials);
//стало
var Context = CPlase.Azure.GetContext();
Фабрика контекстовСоздание контекста для Table Storage
Утилиты для Blob
Работа с хранилищем,
чтение папок, удаление
папок, сериализация в
блобы
//было
try
{
var BlobClient = Azure.GetBlobClient();
var BlobRef = BlobClient.GetBlobReference(BlobUrl);
BlobRef.UploadText(Content);
}
catch { }
//стало
CPlase.BlobUtils.SaveBlob(BlobUrl, Content);
Утилиты для BlobСохранение данных в блоб
Работа с кешем на экземпляре
Создание кеша,
управление кешем,
синхронизация кеша
между инстанциями
Сохранение на экземляре//было
var Storage = RoleEnvironment.GetLocalResource(LocalResourceName);
var FinalPath = GetPath(Storage, Path);
try
{
string DirectoryPath = System.IO.Path.GetDirectoryName(FinalPath);
if (!Directory.Exists(DirectoryPath))
Directory.CreateDirectory(DirectoryPath);
File.WriteAllText(FinalPath, Content);
}
catch () {}
//стало
CPlase.InstanceStorage.Save(LocalResourceName, Path, Content);
Утилиты для работы с Queue
Создание очередей,
управление
сообщениями в
очередях
public static bool AddToQueue<QueueHandlerType>(
CloudQueue Queue, string Task) {
try {
var Message = new CloudQueueMessage(Task);
Queue.AddMessage(Message);
Internal.RoleCommunicatior.
WorkerRoleCommand(typeof(QueueHandlerType));
return true;
}
catch { return false; } }
Работа с QueueДобавление в очередь и вызов обработчика
Расширения для LINQ
Позволяют
осуществлять
операции Or и
Contains для Table
Storage
Утилиты безопасности
Работа с шифрованием
MD5, генерация
последовательностей,
системы счисления
string MD5Bits = Security.GetHashMD5Binary(
InputString, PartitionBitCount);
string MD5PartitionBits =
Convert.ToString(Convert.ToInt32(MD5Bits, 2), 16);
Entity.PartitionKey = MD5PartitionBits;
Генерация ключа разделаИспользование утилит безопасности
Фреймворк для сообщений
Организация обмена
сообщениями между
ролями и
экземплярами
Примеры сообщений
var Command = new CPlase.Internal.Commands.
ClearCacheCommand(RESOURCE_NAME, LocalUrl);
CPlase.Internal.RoleCommunicatior.WebRoleCommand(Command);
CPlase.Internal.RoleCommunicatior.
WorkerRoleEchoCommand(Command);
CPlase.Internal.RoleCommunicatior.
WorkerRoleCommand(typeof(QueueHandlerType));
Полезные материалы
http://ou.gs/AzureDirectory
https://cplaseengine.codeplex.com
http://ou.gs/CPlaseEngineAbout
Связанные сессииWEB202
ASP.NET for Mobile and Slate Devices
IOP201
Windows Azure and Open Source Solutions
AZR205MN
Запускаем корпоративные сервисы в облака - практика для
разработчика
Пожалуйста
Оцените доклад и мастерство докладчика.Форма для оценки находится в вашем инфопакете.
© 2012 Microsoft Corporation. All rights reserved. Microsoft, Windows, Windows Vista and other product names are or may be registered trademarks and/or trademarks in the U.S. and/or other countries.
The information herein is for informational purposes only and represents the current view of Microsoft Corporation as of the date of this presentation. Because Microsoft must respond to changing market conditions, it should not be interpreted to be a commitment on the
part of Microsoft, and Microsoft cannot guarantee the accuracy of any information provided after the date of this presentation. MICROSOFT MAKES NO WARRANTIES, EXPRESS, IMPLIED OR STATUTORY, AS TO THE INFORMATION IN THIS PRESENTATION.