ФорумСообществоФлейм → Как гугл плюс устроен внутри?

Как гугл плюс устроен внутри?

  • mario

    Сообщения: 6067 Репутация: N Группа: Джедаи

    Spritz 10 декабря 2011 г. 18:22, спустя 5 минут 58 секунд

    user2eventl(user_id, event_id)

    ==

    а ежли каждому пользователю свой канал и пихать событие сразу во все нужные?

    только остается суть канала, например пользователь может показать канал другому пользователю. Хотя может я и загоняю сейчас.
  • artoodetoo

    Сообщения: 5146 Репутация: N Группа: в ухо

    Spritz 11 декабря 2011 г. 0:35, спустя 6 часов 12 минут 7 секунд

    почитал статью на http://highload.com.ua

       1. Пользователь загружает фотку
       2. Обрабатываем его запрос, сохраняем фото и отправляем пользователю ответ
       3. В фоне (асинхронно) выполняем обработку события и обновляем ленты его друзей

    ключевой момент — асинхронно. почему бы не использовать для этого mysql events? верю, что специальные очереди событий и mongodb лучше подходят для highload проектов, но блять, кто из вас может похвастаться по настоящему высоконагруженными проектами? будьте реалистами.
    реализуйте просто, с минимумом зависимостей.
    ιιlllιlllι унц-унц
  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 11 декабря 2011 г. 2:24, спустя 1 час 49 минут 21 секунду

    Можно же брать фоном посты, которые старше 3х месяцев и отправлять их в своеобразный своп - дополнительную таблицу. Таким образом активная таблица будет всегда чистится и лагать меньше.

    а как разруливать эту стыковку таблиц? Если при нажатии на "показать еще" нужно часть данных взять в одной а часть в другой?

    почему фотка это канал? Почему не итем или же еще что то?

    фотка - канал, это что б ты мог получать уведомления по этой фотке - кто на ней отметился, кто ее прокомментировал и тд.


    Абырвалг, а нельзя убрать сущьность канала?


    не, не вариант. создание встречи вещает на канал моего района и на канал создателя встречи. Т.е. вижу встречи друзей и те, что будут в моем районе проходить. А если я перееду - как понять, что мне нужно показать/не показать эту встречу? Без канала никак

    посмотри в сторону сфинкса, он прекрасно работает с фильтрацией, пагинацией.

    да, нужно будет посмотреть
    Спустя 161 сек.
    будьте реалистами.
    реализуйте просто, с минимумом зависимостей.

    нам можно использовать что угодно, абы бесплатно. Хочется пощупать новые технологии


    зы: народ, всем спасибо за советы, будем думать
  • mario

    Сообщения: 6067 Репутация: N Группа: Джедаи

    Spritz 11 декабря 2011 г. 3:58, спустя 1 час 34 минуты 20 секунд

    неужели на пыхе появилась тема в которой кпд постов первых трех страниц превышает 90% :D
  • Ivan

    Сообщения: 1316 Репутация: N Группа: Адекваты

    Spritz 11 декабря 2011 г. 4:19, спустя 20 минут 57 секунд

    а как разруливать эту стыковку таблиц? Если при нажатии на "показать еще" нужно часть данных взять в одной а часть в другой?

    Если в редисе хранить число данных в свопе для юзера то можно быстренько у редиса спросить, сколько в свопе данных? и если больше нуля, и сообщения в активной таблице закончились, или сообщений в активной таблице для определенного юзера меньше чем нужно отобразить на странице, то делаешь долгозапрос - прям в эту мусорную таблицу и пофиг на время, все равно к этим постам не так часто обращаются. Еще как вариант: две колонки времени поста, одна - время создания, другая - время последнего "востребования". Обновлять время последнего востребования не нужно при каждом отображении, это нужно делать например если юзер запросил "долгозапрос". Два задания в бекгранде - одно таскает из актива в своп, другое - обратно, если время востребования младше чем последние 4 месяца, а первый такс проверяет "старше 4 месяцев или NULL".
  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 11 декабря 2011 г. 5:25, спустя 1 час 5 минут 31 секунду

    посмотри в сторону сфинкса, он прекрасно работает с фильтрацией, пагинацией

    так, стоп, он же не поддерживает джоинов, верно? Т.е. тогда мы будем дублировать одну и ту же запись в нескольких экземплярах для разного канала?

    одно и то же событие "комментарий 1 к встрече А"
    1, meet:1, комментарий 1 к встрече А # вещает на канал встречи
    1, user:4, комментарий 1 к встрече А # вещает на канал пользователя

    и как нам теперича выбрать те события, на каналы которых мы подписаны? (user:4) при условии, что таких каналов тыща-две
  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 11 декабря 2011 г. 5:30, спустя 5 минут 41 секунду

    Послушай Олега и совет от Ивана. Да затратно по объему, но зато по скорости ты получаешь выигрышный вариант.

    я имел в виду затраты не по объему, а по обслуживанию. Отключились от встречи - нужно во-первых пробежаться и поудалять это событие из чужих лент, во-вторых удалить из моей ленты все, что связано с этой встречей (другие комменарии, присоединения к встрече других людей и тд).

    Велик шанс проебать что-то, о чем-то забыть. И еще то, что вот такой фоновый обработчик будет захлебываться и не успевать все это обработать.
  • Sinkler

    Сообщения: 7958 Репутация: N Группа: в ухо

    Spritz 11 декабря 2011 г. 5:31, спустя 28 секунд


    неужели на пыхе появилась тема в которой кпд постов первых трех страниц превышает 90% :D
    странно, что она во флейме)
  • mario

    Сообщения: 6067 Репутация: N Группа: Джедаи

    Spritz 11 декабря 2011 г. 5:39, спустя 8 минут 6 секунд

    так, стоп, он же не поддерживает джоинов, верно?

    http://sphinxsearch.com/docs/current.html#mva
    одно и то же событие "комментарий 1 к встрече А"
    1, meet:1, комментарий 1 к встрече А # вещает на канал встречи
    1, user:4, комментарий 1 к встрече А # вещает на канал пользователя
    и как нам теперича выбрать те события, на каналы которых мы подписаны? (user:4) при условии, что таких каналов тыща-две

    можешь еще раз описать весь воркфлоу. Для примера возьми два юзера, 16 каналов и N комментов/или чего там.

    Так приблизительно я представляю себе это так:
    Индекс "Каналы"
    -юзер
    -другие параметры канала
    Индекс "Юзеры"
    -параметры для юзера, допустим все каналы юзера можно сюда загнать. Если в доке не найдешь как, скажи я нарою в конфигах.
    Индекс "Комментарии"
    -на какие каналы должен распространится.

    в общем лучше опиши подробнее еще разок, если не сложно :)
    Спустя 71 сек.

    Послушай Олега и совет от Ивана. Да затратно по объему, но зато по скорости ты получаешь выигрышный вариант.

    я имел в виду затраты не по объему, а по обслуживанию. Отключились от встречи - нужно во-первых пробежаться и поудалять это событие из чужих лент, во-вторых удалить из моей ленты все, что связано с этой встречей (другие комменарии, присоединения к встрече других людей и тд).

    Велик шанс проебать что-то, о чем-то забыть. И еще то, что вот такой фоновый обработчик будет захлебываться и не успевать все это обработать.
    да такой момент есть, но у меня есть мысыль как это сделать но пока я её не могу выразить, м.б. чуть позжа.
  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 11 декабря 2011 г. 5:58, спустя 19 минут 1 секунду

    events (id, group_name, channels, title)

    1, meet:3, [meet:3, user:2], "пользователь 2 прокомментировал встречу 3"
    2, meet:3, [meet:3, user:4], "пользователь 4 присоеденился к встрече 3"
    3, meet:4, [meet:4, user:10], "пользователь 10 создал встречу 4"
    4, topic:3, [topic:3, user:4], "пользователь 4 прокомментировал тему 3"
    5, meet:4, [meet:4, user:12], "пользователь 12 присоеденился к встрече 4"
    6, meet:4, [meet:4, user:9], "пользователь 9 прокомментировал встречу 4"



    я - пользователь 10, слушаю каналы [user:10 (я), user:2 (мой дружанька), meet:4 (встреча, которую я создал)]


    стало быть, из тех событий, которые есть вверху мне будут доступны такие

    1, meet:3, [meet:3, user:2], "пользователь 2 прокомментировал встречу 3" # так как комментарий оставил мой дружанька

    3, meet:4, [meet:4, user:10], "пользователь 10 создал встречу 4" # так как создатель - я

    5, meet:4, [meet:4, user:12], "пользователь 12 присоеденился к встрече 4" # так как присоеденились к моей встрече
    6, meet:4, [meet:4, user:9], "пользователь 9 прокомментировал встречу 4" # так как прокомментировали мою встречу



    идем дальше. Нам нужно видеть только последнее событие из группы (группируем по group_name), то есть получаем в итоге это

    1, meet:3, [meet:3, user:2], "пользователь 2 прокомментировал встречу 3"




    6, meet:4, [meet:4, user:9], "пользователь 9 прокомментировал встречу 4"

  • master

    Сообщения: 3242 Репутация: N Группа: Джедаи

    Spritz 11 декабря 2011 г. 6:03, спустя 4 минуты 48 секунд

    Конкретно гугл использует google big table для хранения данных и алгоритм map-reduce для разного рода вычислений/поиска. 9 к 1 что плюс они построили на тех же технологиях
    не всё полезно, что в swap полезло
  • mario

    Сообщения: 6067 Репутация: N Группа: Джедаи

    Spritz 11 декабря 2011 г. 6:18, спустя 15 минут 5 секунд

    events (id, group_name, channels, title)
    я - пользователь 10, слушаю каналы [user:10 (я), user:2 (мой дружанька), meet:4 (встреча, которую я создал)]
    стало быть, из тех событий, которые есть вверху мне будут доступны такие

    ну собственно
    Индекс "Events"
    -id
    -type
    -chanels - опять таки найди в мане, как указывать несколько атрибутов одного типа для одной записи.
    -title - для полнотекстового поиска.

    Индекс "User"
    -chanels - каналы, на которые подписан пользователь.
    -нужные тебе атрибуты



    Собственно потом нам нужно получить ленту событий для пользователя 10.
    1) getUserChanels: Ищем в сфинксе пользователя с id = 10, в ответе получаем аттрибуты, в этих аттрибутах будет массив с каналами на которые подписан пользователь.
    2) getUserEvents: делаем выборку по каналам _getUserChanels_ и тут же мы можем указать лимиты-хуимиты для пагинатора, дополнительные фильтры, и даже полнотекстовый поиск (ну за этим уже в ман, нужен будет хелп по сфинксу, стучи в скайп) :D
    (группируем по group_name)

    @group а еще очень полезнаю штука @count - которая позволяет выводить не один результат группировки, а необходимое нам кол-во :)

    Спустя 28 сек.
    и самое классное, это работает быстро, легко паралелится и тд и тп…
  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 11 декабря 2011 г. 6:25, спустя 7 минут 30 секунд

    @group а еще очень полезнаю штука @count - которая позволяет выводить не один результат группировки, а необходимое нам кол-во :)

    оо, это супер штука


    getUserEvents: делаем выборку по каналам _getUserChanels_

    а оно нормально будет работать, если getUserChanels вернет тыщу-две каналов? а то и больше
  • mario

    Сообщения: 6067 Репутация: N Группа: Джедаи

    Spritz 11 декабря 2011 г. 7:08, спустя 43 минуты

    а оно нормально будет работать, если getUserChanels вернет тыщу-две каналов? а то и больше

    если будет хватать оперативки, и ты правильно все настроишь в конфиге, то да :)
    Спустя 14 сек.
    и самое классное, это работает быстро, легко паралелится и тд и тп…

  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 11 декабря 2011 г. 7:28, спустя 19 минут 51 секунду

    хм, ну там же есть какие-то ограничения, на длину запроса, например? Не могу нагуглить их.

    Не может же быть такого, что WHERE IN (…) будет нормально работать при любом кол-ве аргументов

Пожалуйста, авторизуйтесь, чтобы написать комментарий!