Добрый день, читатели!
В процессе реализации одного моего проекта (с блекджеком и всеми остальными social прелестями), пришлось реализовывать функциональность голосования (like, like/dislike, rating, etc) пользователей за некоторые сущности предметной области проекта.
Disclaimer: к моему величайшему сожалению далее будут лишь рассуждения о функциях некоторого абстрактного внешнего сервиса голосовалок и ни строки кода или полезных ссылок, но мне нужно получить обратную связь знающих людей.
Поискав в Google готовые решения, не удалось найти ничего подходящего. В основном решения (плагины для различных web-фреймворков) сводятся к добавлению дополнительных полей в существующие таблицы (или объекты коллекций в случае MongoDB), в которые пишется количество лайков/дислайков, а также кто из пользователей уже проголосовал. Такие решения имеют значительные недостатки, так как с одной стороны не обладают достаточной гибкостью, позволяющей легко модифицировать алгоритмы голосования (что очень важно для нового проекта в процессе поиска правильной модели), а с другой стороны требуют модификации существующего кода и, что еще хуже, уровня хранения данных, для добавления функциональности голосования.
В то же время, существует значительное число сервисов, предоставляющих возможности по добавлению комментариев на свой сайт, как то cackle.me, disqus.com и пр. Сервисы являются внешними по отношению к разрабатываемому проекту и позволяют минимальными усилиями добавить возможность комментировать что угодно на своем сайте (или в приложении).
Возник логичный вопрос, почему не существует аналогичных сервисов по добавлению голосовалок на свой сайт?
Функции, необходимые, сервису голосовалок
- внешнее API
- хранение данных на стороне внешнего сервиса
- возможность отложенной выгрузки данных по голосам
- решение классических вариантов использования like/dislike на стороне внешнего сервиса
- голосование (лайк) пользователя за какой-то объект
- все голоса (лайки) за заданный объект
- все голоса пользователя (когда, за какие объекты, как)
- при построении списка объектов, получить информацию, за какие из объектов голосовал текущий пользователь и с каким результатом
- при построении списка объектов, получить информацию, о количестве лайков/дислайков или количестве оценивших на 1,2,3,4,5 звезд для каждого из объектов
Таким образом, основную логику обработки лайков или рейтингования берет на себя внешний сервис. Например, он должен проверять, не является ли лайк пользователя за заданный объект повторным и не давать выполнить такое голосование. При этом бизнес логика кто и за что может голосовать может быть реализована уже на стороне собственного проекта.
Из дополнительных возможностей хотелось бы видеть:
- Возможность отдельно голосовать за определенные аспекты объектов (теги).
- Версионность голосования (удобно для сплит-тестирования, для одной группы пользователей разрешаем лайки и дислайки, а для другой только лайки и наблюдаем за поведением пользователей на сервисе).
- Добавление событий в очередь сообщений о новых лайках, на которые можно подписываться и отложенно их обрабатывать (для пересчетов рейтингов в фоновом режиме, например).
Интеграция сайта с сервисом
Думаю, должно быть 2 способа — со стороны бекенда и со стороны фронтенда (веб-клиента или мобильного клиента). Так как можно вообще не хранить на своей стороне информацию о голосах, можно делать запросы на создание лайков или получение количества лайков за объекты прямо с клиента (идентифицируя себя каким-либо токеном). Таким образом страничка будет собираться из нескольких источников. Также можно собирать информацию о голосах на бекенде и инжектить ее в результирующие данные перед отправкой их на клиент, делая запросы к внешнему API. Возможно даже асинхронные, чтобы во время ожидания ответа можно было выполнить прочую обработку данных.
Должны существовать плагины для популярных языков (Ruby, PHP, JS) позволяющие за счет миксинов или же просто добавления новых модулей в проект легко добавлять возможность лайкать/дислайкать или оценить объекты предметной области.
Преимущества
- Никакой лишней информации о голосах в существующих структурах данных на уровне хранения.
- Минимум кода для добаления возможности голосовалки на свой сайт или мобильное приложение.
- Возможность интеграции исключительно средствами клиента.
- Снимает часть нагрузки с бекенд-серверов.
- Несколько моделей голосования одновременно (удобный механизм для сплит-тестов).
Вместо заключения
Вот как-то так должен выглядеть сервис голосовалок моей мечты. Хотелось бы получить ответы, может кто-нибудь посоветовать нечто похожее? Или возникала ли у вас необходимость в таком сервисе, был бы он вам полезен?
Автор: Ostrovski