Эта статя открывает цикл статей о внутреннем устройстве сервиса AtContent.com. Каким образом контент проходит путь от автора до конечного пользователя, через какие механизмы ему приходится пройти и как он при этом взаимодействует с различными модулями — обо всем этом вы узнаете из цикла. Открывает его статья с общим описанием архитектуры сервиса. В серии будут также статьи «Механизм обмена сообщениями между ролями и экземплярами», «Кэширование данных на экземпляре и управление кешированием», «Эффективное управление обработкой облачными очередями (Queue)», «Расширения для LINQ, реализующие операции Or и Contains к Azure Table Storage», «Практические советы по разделению данных на части, генерация PartitionKey и RowKey для Azure Table Storage».
AtContent.com – это сервис нового поколения для дистрибьюции и монетизации авторского контента. Он основывается на модели разделения дохода и предлагает качественно новые инструменты для авторов, распространителей и медиа-площадок. Автор контента может самостоятельно опубликовать свою работу, заполучить себе поклонников и получить сеть дистрибьюции без усилий! С помощью специального виджета зарабатывать может как автор, так и распространитель публикации. Больше сеть дистрибьюции, больше продаж, больше дохода авторам.
Сейчас сервис доступен только для авторов. Если вы хотите опробовать его в действии и опубликовать свой материал используя наш сервис — зарегистрируйтесь по специальной ссылке.
В качестве платформы для архитектуры мы используем Microsoft Windows Azure и такие его компоненты как:
- Web Role – экземпляр приложения в Azure для запуска веб-проектов;
- Table Storage – хранилище данных в Azure позволяющее сохранять структурированные данные;
- Blob Storage – другое хранилище данных в Azure, но уже для сохранения файлов;
- Worker Role – экземпляр приложения или сервиса, которому не нужен веб-интерфейс;
- Queue – облачная очередь сообщений для сервисов Azure;
- Azure SQL – облачая SQL база данных основанная на сервере MS SQL.
Наш выбор именно этой платформы обусловлен тем, что позволяет нам сфокусироваться на разработке, не думая об инфраструктуре. Также мы используем Apache Lucene – открытую поисковую технологию для организации поиска данных, международную систему платежей PayPal для организации приема платежей от пользователей.
Итак, чтобы опубликовать свои труды, автор заходит на сайт и загружает публикацию. Сама публикация попадает при этом в Blob Storage, а различная мета-информация о ней попадает в Table Storage. В момент публикации запускается механизм индексации, который состоит из нескольких этапов. Первый этап – это добавление задачи в очередь индексации. Второй – передача задания на обработку в Worker Role используя механизм межролевых взаимодействий. Третий – обработка задания на Worker Role. Индексация и последующий поиск осуществляется с использованием Apache Lucene.
Рис 1. Схема опубликования материалов
Все медиа-файлы, такие как картинки, аудио, видео и другие файлы хранятся в Blob Storage. У каждого файла есть метадата, в которой хранится информация о владельце файла и публикации, к которой он принадлежит. Пользователю файлы отдаются через специальный шлюз, который контролирует доступ исходя из информации в метаданных и данных пользователя.
После публикации в распоряжение автора попадает виджет, который он может разместить на любом сайте. Также этот виджет попадает в список всех публикаций на сайте и различные другие списки, такие как Feed подписчиков, список публикаций автора и другие. Практически все они хранятся в Table Storage.
Здесь также стоит упомянуть о том, что публикация может быть бесплатной (в которой весь контент является открытым), с возможностью пожертвований, и платной. Для платной публикации часть контента может быть закрытой. Оплата происходит непосредственно в виджете и платная часть публикации становится доступна сразу же после оплаты читателем. Для оплаты статей используется внутренний механизм предоплаченных кредитов. Пополнение происходит через систему PayPal. Так как операции с кредитами проводятся в блокируещем режиме – то они хранятся в Blob Storage, ведь он позволяет производить операции блокировки.
Рис 2. Схема покупки платной публикации
В момент покупки со счета пользователя отнимается количество кредитов, соответствующее цене публикации, а затем оно распределяется между автором, дистрибьютором и сервисом. Все операции проводятся с точностью до сотой доли цента, что позволяет назначать цену публикации в один цент.
Весь обмен данными между виджетом и сервисом осуществляется через так называемый Native AJAX. Виджет формирует запросы к сервису, а тот, в свою очередь, генерирует в ответ JavaScript-файлы, которые обрабатываются виджетом.
При загрузке виджета публикации она выбирается из базы и при этом кэшируется на том же экземпляре где и выбирается. И чтобы обеспечить актуальность кэша при обновлении публикации автором он очищается. Используя наш собственный механизм взаимодействия между экземплярами посылается специальная команда для очистки соответствующей части кэша.
Также виджет собирает различную статистику, такую как просмотры с учетом места установки виджета, путь распространения публикации, продажи и пожертвования для соответствующих публикаций. Автору и дистрибьютору предоставляется различная аналитическая информация по этой статистике. В связи с этим понадобился механизм выборки из Table Storage с операциями Or и Contains. Для этого были написаны расширения для LINQ-запросов к Table Storage, т.к. Azure SDK не позволяет модифицировать запросы таким образом.
На сайте присутствует рейтинг пользователей, который формируется из отзывов пользователей. Т.к. он формируется динамически, то хранить его в Table Storage очень затратно. Поэтому он хранится в Azure SQL, который позволяет делать выборки с сортировкой.
Использование Windows Azure позволяет нам контролировать нагрузку на сервис и наши расходы. Система спроектирована таким образом, что позволяет легко масштабировать её горизонтально, т.е. увеличивать количество Web Role и Worker Role при возрастающей нагрузке.
Читайте в серии:
- «Механизм обмена сообщениями между ролями и экземплярами»,
- «Кэширование данных на экземпляре и управление кешированием»,
- «Эффективное управление обработкой облачными очередями (Queue)»,
- «Расширения для LINQ, реализующие операции Or и Contains к Azure Table Storage»,
- «Практические советы по разделению данных на части, генерация PartitionKey и RowKey для Azure Table Storage».
Автор: VadNov