Всем привет. Решил в свободное время (а его у меня много) сделать свою соц. сеть. Хотя бы для обучения, если идея прогорит. И сразу появилось множество вопросов, которые я опишу ниже. Надеюсь на ваши хорошие ответы, а не типа "Зачем тебе соц. сеть" и т.п.
1. Хранилище фото, аудио и видео файлов.
На данный момент у меня есть один сервер, в котором собственно и будет разворачиваться соц. сеть. Мне интересно, как лучше организовать структуру папок и файлов для хранения файлов.
Как я понимаю, кроме всего прочего мне придётся поднимать ещё сервера для хранения файлов, CDN и прочие плюшки. Я правильно понимаю? И сразу ли нужно акцентировать внимания во время разработки сайта на данную проблему, или потом?
2. База данных.
Количество данных, особенно постов и личных сообщений будет очень много. От сюда выходит вопрос - как лучше всё организовать? Репликация или поднятия на эти нужды серверов?
3. Сообщения
Все уже привыкли к тому, что в ВК и подобных соц. сетях личные сообщения приходят и отправляются без перезагрузки страницы. Как это лучше реализовать? Соккеты или просто Ajax'ом?
Была идея работать с соккетами, но что бы сообщения сохранились при отправке - это приходится лезть с запросам к БД, а это уже смахивает на Ajax.
PS: Пожалуйста, не нужно засорять тему сообщениями, что я с такими знаниями ни чего не сделаю...Так вот, надо же когда нибудь учиться)
1. Файлы (фото и пр.) хранить на специализированном "облачном хранилище", например, Amazon S3.
2. Репликация не репликация, шардинг не шардинг - зависит от нагрузки. БД делить по смыслу. Например, я бы выделил БД для сообщений, БД для учетки и БД для публикаций. И все эти БД могут быть разного типа.
3. Push-технологию посмотрите, если речь идет о больших нагрузках.
Дмитрий Кузнецов: В наше время соц. сети не пилит только ленивый. Но смысла в этом уже нет. Существовать могут только счетное число соц. сетей. По себе померьте - в скольки соц. сетях состоите вы? Где из них вы активны? Куда вы пошлете предложение очередной новой соц.сети?
Для прокачивания технических скиллов - вполне.
Для того, чтобы проект реально работал - не стоит. Нормальная соц. сеть дорогая в поддержке, а выхлоп нормальный дает только на миллионном контингенте.
Qw234: Зарегистрирован только в двух соц. сетях - ВК и Фейсбук. На ФБ около 2-ух лет не заходил, а в ВК постоянно)
В любом случае, прогорит или нет, для опыта построения больших сайтов это вполне достаточно.
А так, если посудить, что же ещё можно создать. Рынок сайтов уже переполнен. Есть практически всё. Осталось небольшая часть, которые не реализованы или их не стоит даже реализовывать.
Дмитрий Кузнецов:
Для опыта построения больших сайтов этого недостаточно.
Чтобы был реальный опыт - нужно спроектировать по архитектуре "очень расширяемое микросервисное". А это довольно трудноемко и громоздко.
Потребует несколько серверов для полноценной иммитации.
Ну ладно, сервера могут быть и виртуальными, на самом дешевом тарифе.
Но без нормальной нагрузки ты не поймешь, что да как.
А нормальную нагрузку - очень много пользователей - еще нужно суметь нагнать.
Просто как для прокачивания некоторых технических скиллов - проект годится.
Но я бы не надеялся что полученный опыт даже отдаленно будет напоминать опыт проектирования больших сайтов.
Большие сайты - это очень накладно, даже в минимальном масштабе.
RU:
"Заказчик пригласил делать соц. сеть" - это такой стеб уже у веб-программистов.
С такими обращениями ко мне только за 2015 года совершенно серьезные люди обращались раза 3, и еще несколько десятков несерьезных предложение (сделать соц. сеть за 1000 долларов).
Соц. сетей делают чуть ли не больше чем всего остального.
Никому не нужен очередной Фейсбук или ЮТуб.
Да, может быть, кто-то и выйдет на нормальные объемы - один из миллиона.
Остальные просто тупо сливают свое время и деньги, вместо того, чтобы сделать что-то свое оригинальное.
Кроме прокачивания технических скиллов никакой другой пользы я тут не вижу.
3. Я если честно не особо знаком с соккетами и не могу понять как после получения ответа хранить данные. В посте я писал, если использовать данную технологию, то получается для хранения записей (т.е. сообщений) потребуется их записывать в БД. И это нормально ли?
Я не понял вопрос. websocket это просто транспорт. Архитектура приложения и потоки данных при этом кардинально не отличаются от htt GET, POST или XMLHttpRequest транспорта. Еще вид транспорта Push сервисы для мобильных платформ. Ваша архитектура не должна зависеть от транспорта
Новая соц сеть никому не нужна, но для учебных целей, задача вполне интересная.
сразу же задумайтесь о масштабировании, т.к. это здесь самая интересная задача.
для этого сразу же делите весь проект по отдельным сервисам, каждый сервис в рабочей версии это отдельный сервак а часто и группа сераков. сервисы общаются друг с другом по внутреннему апи.
пример сервисов:
- личные сообщения
- анкеты юзеров
- друзья
- посты на стене
- группы
- альбомы и фотки
- комментарии к фоткам
- сервис лайков
и тд.
например все друзья хранятся на отдельном серваке, если для рендера лайков фоток нужно отрисовать ваших друзей в списке, то сервис фоток делает запросы к сервисам лайков и сервисам друзей, получает списки.
сразу же задачи делаем через движки для очередей.
например добавили пост в группу, уходит задача - разослать пост в ленту новостей всем подписчикам. сервис ленты найдет ее и выполнит, когда освободится.
при разработке соц сетей каждым сервисом может заниматься отдельная команда из неск человек.
поэтому в одиночку вк вы не создадите, выберите те сервисы которыми интеерсно заниматься для начала и делайте их, пока не наскучит.
особо не рассчитывайте что это дойдет до прода (либо делать чтото попроще где мало сервисов, типа твиттера), здесь главное научится принципам, дальше начнется одна рутина.
ну и отдельное внимание уделить фронтенду, лучше делать сразу так же single page app, на reactjs
Любая соц. сеть на 99% зависит от контингента, администрации и маркетинга. Куча примеров, когда на обычном движке форума миллионы посетителей. Вам стоит разбить свою задачу на модули и решать вопросы реализации.