PinQueue состоит из веб-приложения AngularJS в качестве внешнего интерфейса, веб-службы RESTful, реализованной во Flask и поддерживаемой единой базой данных MySQL.

Служба предоставляет интерфейс HTTP и набор RESTful API для веб-приложения, а также других внешних систем для связи. Он использует ORM SQLAlchemy для взаимодействия с базой данных.

Более широкая картина

PinQueue разработан как универсальная платформа, поддерживающая просмотр любого типа контента. Инженеры и аналитики могут легко настроить рабочие процессы поверх PinQueue с различными системами восходящего и нижнего уровня. Его сервисные API и шаблоны внешнего интерфейса легко подключаются и расширяются.

В Pinterest типичный конвейер обзора контента, построенный на основе PinQueue, состоит из Stingray в качестве источника данных и PinLater в качестве системы выполнения заданий.

Stingray - это распределенный потоковый процессор и механизм правил. Мы можем определить правила Stingray для реагирования на все типы событий, которые происходят на Pinterest (например, рекламодатель хочет продвигать пин). После срабатывания этих правил они извлекают информацию из событий (например, PIN-код или идентификатор рекламной акции) и отправляют их в базу данных PinQueue через PinQueue API.

Когда наши аналитики приходят в PinQueue для проверки продвигаемого пина, например, PinQueue связывается с соответствующими службами Pinterest для получения соответствующей информации (т. Е. Информации о пине, доске и пиннере или рекламодателе). Затем аналитики просматривают их и принимают решения через пользовательский интерфейс PinQueue.

Как только решения будут приняты, PinQueue отправит решения (метки) в PinLater (асинхронная система выполнения заданий) для принудительного исполнения (т. Е. Отклонить продвигаемый пин, потому что он не соответствует нашим рекламным стандартам).

Внимательнее

В PinQueue есть множество моделей данных для таких категорий, как безопасность, спам, монетизация и т. Д. Каждая категория представляет тип контента и содержит набор очередей.

  • Очередь: каждая очередь представляет собой набор элементов, которые необходимо проверять по одной и той же причине.

  • Элемент: каждый элемент представляет собой событие, которое нам необходимо проверить (например, ПИН сообщается как недопустимое содержание или рекламодатель хочет продвигать Пин), и содержит всю информацию об этом событии, которую необходимо проверить. и действовал дальше.
  • Виджет: элемент - это набор виджетов. Виджет - это часть информации, с которой можно взаимодействовать. Используя предыдущий пример сообщения о недопустимом содержании пина, мы создадим элемент для представления этого события. Этот элемент будет содержать виджет Pin (сообщенный Pin), виджет доски (доска, на которой сохраняется этот Pin), виджет пользователя (Pinner, который сохранил Pin) и виджет репортера (Pinner, который сообщил об этом Pin) .

  • Каждый тип виджета определяет свой собственный шаблон (т.е. информацию, которую он содержит, и способы ее отображения) и действия, которые он поддерживает. В качестве примера виджет доски включает в себя имя и описание доски, количество сохраненных на доске пинов, оценку репутации доски и образец из 10 пинов на доске. Его действия включают «игнорировать» (без действий), «скрыть» (скрыть доску из общедоступных каналов) и «деактивировать» (деактивировать доску).
  • В дополнение к одному действию для одного виджета, действие на уровне элемента также поддерживается посредством предопределенной комбинации действий на уровне виджета (например, «деактивировать все», поскольку действие на уровне элемента применяет действие «деактивировать» к каждому виджету в этом пункт).
  • Рецензент: у нас также есть рецензент для авторизованных пользователей PinQueue. У нас есть сопоставление категорий рецензента, в котором мы контролируем, к каким категориям имеет доступ каждый рецензент. У нас также есть сопоставление рецензент-элемент, где каждый элемент может быть назначен только одному рецензенту, так что несколько рецензентов могут работать одновременно в одной очереди без конфликтов или дублирования работы.

Расширенные возможности

PinQueue имеет несколько дополнительных функций:

  • Кеширование: мы кэшируем данные для статических виджетов вместо того, чтобы извлекать их через вызовы служб во время проверки.
  • Фильтрация: мы определяем фильтры, чтобы отфильтровать элементы, которые не нуждаются в проверке (например, указанный пин уже удален или кампания, содержащая продвигаемый пин, больше не действительна).
  • Контроль качества. Чтобы обеспечить точность и последовательность отзывов, мы можем выбрать некоторые элементы, которые будут проверены одновременно несколькими рецензентами. Если в их решениях возникнут конфликты, эти вопросы будут отправлены в отдельную очередь для обсуждения или проверки руководителем.
  • Метрики и мониторинг. Мы собираем метрики для отслеживания процесса проверки, такие как объем контента, время ответа или распределение решений.

Мы считаем, что общая система обзора контента, такая как PinQueue, полезна для многих компаний, и в ближайшем будущем планируем открыть PinQueue с открытым исходным кодом. Быть в курсе!

Благодарности: PinQueue был создан Эриком Коннером, Джонатаном Хоровицем и Юань Яо. Эта команда, а также люди из всей компании помогли воплотить этот проект в жизнь своими техническими знаниями и бесценными отзывами.