Кейс: разработка социальной сети на node.js и nosql

Unface.me - высоконагруженная анонимная социальная сеть, которую мы разработали на основе стека MEN [Часть 1 - highload backend]

Разработка социальной сети на node.js и nosql - изображение d552c4f88af16b20cd381d2bf5a06b32 на https://digitaldali.ru

О проекте

unface.me — это анонимный сервис для общения с друзьями. Основная «фишка» проекта в том, что на unface.me можно общаться анонимно с друзьями. Здесь можно:

  • анонимно рассказывать истории о друзьях, задавать вопросы, публиковать мнения
  • анонимно общаться в чатах наедине или вместе с друзьями
  • оценить своих друзьях и узнать свой реальный «рейтинг» среди друзей

 

Технологии

Основной целью было сделать сервис быстрым и масштабируемым. Поэтому выбор пал на следующие технологии:

  1. MongoDB — основная БД, тут лежат все данные пользователей
  2. Redis — хранилище сессий
  3. Node.js — кластер из воркеров
  4. Nginx — статика, проксирует запросы на воркеры node.js
  5. Elasticsearch — поиск
  6. Backbone,jQuery — на клиенте

Архитектура unface.me

MongoDB

mong

В MongoDB у нас лежат все пользовательские данные. Всего данные вместе с индексами занимают около 30 ГБ. Все запросы делаются только по индексам, поэтому все работает очень быстро. Изначально мы планировали использовать шардинг, но даже с 10 млн записей в БД в этом смысла нет, поэтому мы просто имеем несколько реплик. В дальнейшем, если количество данных увеличится — нужно будет добавлять шардинг для того, чтобы увеличить скорость выборок из базы.

В качестве драйвера мы используем node-mongodb-native. На момент начала разработки это было лучшим решением, поскольку Mongoose был еще сыроват и в нем были утечки памяти, поэтому мы пренебрегли более удобным синтаксисом и использовали прямые запросы к базе, без лишних абстракций.

 

Node.js

nodejs-dark

При старте разработки (в 2011 году) перед нами встал серьезный вопрос: использовать проверенный PHP, который все умеют применять, или рискнуть и использовать не очень проверенную, но крайне перспективную Node.js, которую мы тоже неплохо знали, но в серьезном продакшне не пробовали. Мы решили рискнуть и не прогадали: нода не подвела. На тот момент мы были пионерами разработки на node.js: помимо нашего, единственным достаточно крупным проектом, разрабатываем на Node.js была социальная сеть Tactoom.

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

Основное преимущество выбора node.js для разработки высоконагруженных сервисов в том, что она может обрабатывать очень большое количество одновременных запросов. Node.js использует линуксовую libev (кстати, как и nginx Игоря Сысоева), и не создает новый процесс на каждый запрос, в отличии от классических языков веб-программирования. Правда, минусом node.js является то, что сложные процессорные операции блокируют работу всего процесса, и, соответственно, отдачу данных. Так что сложные вычисления лучше делать на чем-то другом, но у нас такой задачи нет, большая часть наших запросов — отдача данных напрямую из БД, без изменений. Для того, чтобы использовать все ядра процессору по-максимуму, node.js имеет удобный встроенный инструмент — cluster, при помощи которого можно создать несколько процессов, каждый из которых будет крутится на одном ядре процессора и выполнять свою функцию. В нашем случае мы имеем несколько классических worker’ов под стандартные запросы,  несколько под Long-Pooling для мгновенных сообщений и один мастер процесс, который осуществляет коммуникацию между ними.

 

Разработка социальной сети на node.js и nosql - изображение comma1 на https://digitaldali.ru Разработка социальной сети на node.js и nosql - изображение comma2 на https://digitaldali.ru
Разработка социальной сети на node.js и nosql - изображение d7b6426a-3ff9-4a52-82cf-e64354777b5b на https://digitaldali.ru

В целом, анонимная система всё-в-одном (смесь Formspring, Facemash, имиджборд и nekto.me) выстроена грамотно, сделана красиво, а работает быстро. 

Прочитать о нас на Цукерберг Позвонит

Константин Панфилов, Цукерберг Позвонит

Результаты

Нам удалось создать высокопроизводительный бекенд, который при этом очень легко масштабируется. В любой момент мы можем просто добавить несколько дополнительных серверов и спокойно пережить любые нагрузки. Сейчас в нашей БД около 10 млн пользовательских профилей, а скорость работы сервиса оценили ведущие технологические порталы. Продолжение рассказа о разработке анонимной социальной сети вы можете прочитать здесь.

Понравился кейс?

Поделись с друзьями и получи скидку 5%!

Нужна помощь в реализации подобного проекта?

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

Разработка социальной сети на node.js и nosql - изображение tfluv на https://digitaldali.ru
Головин Антон
Менеджер проектов