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

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

  • Абырвалг

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

    Spritz 10 декабря 2011 г. 8:15, спустя 8 часов 8 минут 5 секунд

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


    Все равно не понимаю что Ваня написал(
  • artoodetoo

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

    Spritz 10 декабря 2011 г. 9:17, спустя 1 час 2 минуты 10 секунд

    то, что ты написал это не круги, а подписки. чего тут сложного?
    table subscribe(user_id, topic_id, subs_date)

    select t.*
    from
    topic as t inner join
    subscribe as s on t.id=s.topic_id
    where s.user_id=Я
    limit не_слишком_много

    если индексы есть, на миллионах записей будет работать быстро.
    команда "отписаться": delete from subscribe where user_id=Я and topic_id=ЭТОТ_ТОПИК
    по крону удаляем старый хлам: delete from subscribe where subs_date<ОЧЕНЬ_ДАВНО

    ιιlllιlllι унц-унц
  • Абырвалг

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

    Spritz 10 декабря 2011 г. 10:09, спустя 51 минуту 46 секунд

    там куча прочих условий, вот тут они перечислены http://phpclub.ru/talk/threads/%D0%9F%D0%BE%D1%81%D0%BE%D0%B2%D0%B5%D1%82%D1%83%D0%B9%D1%82%D0%B5-%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B4%D0%BB%D1%8F-%D0%BE%D1%80%D0%B3%D0%B0%D0%BD%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8-pub-sub.69946/

    сейчас так
    event (id, group_name, created_at …) group_name - что б объединять однородные события вокруг объекта
    channel (id, name)
    event2channel(event_id, channel_id)
    user2channel(user_id, channel_id)

    1. выбираем группы событий, которые нужно показать на странице
    SELECT e.group_name FROM event e JOIN e.channels ec JOIN ec.subscribers s WITH s.user_id = %me% GROUP BY e.group_name ORDER BY e.created_at LIMIT 0, N

    2. выбираем события для групп из прошлого запроса
    SELECT e.* FROM event e JOIN e.channels ec JOIN ec.subscribers s WITH s.user_id = %me% WHERE e.group_name IN (…) ORDER BY e.created_at


    50 тыщ записей в таблице event
    73 тыщи записей в event2channel
    420 тыщ записей в таблице user2channel

    на локалке - по 15 секунд запросы идут
  • phpdude

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

    Spritz 10 декабря 2011 г. 10:09, спустя 23 секунды

    на локалке - по 15 секунд запросы идут

    ты каждому юзеру на комп ставишь сайт локально? :)
    Спустя 22 сек.
    ну придумывай решение блеядь, ты же теоретик, ты все можешь! фабьена спроси на худой конец
    Сапожник без сапог
  • Абырвалг

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

    Spritz 10 декабря 2011 г. 10:10, спустя 47 секунд

    нет, но это как бы звоночек, что что-то сделано неправильно и скоро будет пиздец
    Спустя 30 сек.
    лучше заранее перестраховаться

    тут главное нихуя не закешируешь, так как события мгновенно показываться должны
  • vasa_c

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

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

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

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

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

    типа как тут http://highload.com.ua/index.php/2010/04/24/%D0%B4%D0%B5%D0%BB%D0%B0%D0%B5%D0%BC-%D0%BB%D0%B5%D0%BD%D1%82%D1%83-%D0%BE%D0%B1%D0%BD%D0%BE%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B9-%D0%BD%D0%B0-mongodb-php/ ? рассматриваю такое решение тоже, но тут нужно за многим следить, это затратно.
  • Ivan

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

    Spritz 10 декабря 2011 г. 13:16, спустя 1 час 34 минуты 12 секунд


    типа как тут http://highload.com.ua/index.php/2010/04/24/%D0%B4%D0%B5%D0%BB%D0%B0%D0%B5%D0%BC-%D0%BB%D0%B5%D0%BD%D1%82%D1%83-%D0%BE%D0%B1%D0%BD%D0%BE%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B9-%D0%BD%D0%B0-mongodb-php/ ? рассматриваю такое решение тоже, но тут нужно за многим следить, это затратно.


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

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

    Spritz 10 декабря 2011 г. 13:24, спустя 8 минут 10 секунд

    А загонять число сообщений в свопе можно в редис какой-нибудь
    $redis->run("SET id$id:mswpc " . $db->where(array('id' => $id))->countFrom('swap')->resultInt());

  • mario

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

    Spritz 10 декабря 2011 г. 14:07, спустя 42 минуты 55 секунд


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

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


    типа как тут http://highload.com.ua/index.php/2010/04/24/%D0%B4%D0%B5%D0%BB%D0%B0%D0%B5%D0%BC-%D0%BB%D0%B5%D0%BD%D1%82%D1%83-%D0%BE%D0%B1%D0%BD%D0%BE%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B9-%D0%BD%D0%B0-mongodb-php/ ? рассматриваю такое решение тоже, но тут нужно за многим следить, это затратно.
    Послушай Олега и совет от Ивана. Да затратно по объему, но зато по скорости ты получаешь выигрышный вариант.
    Плюс к совету Ивана, можно добавить сжатие и хранить его в базе как raw data, а так же иметь temporary tables (аналогичная структуре топиков/евентов или как там у тебя), которая обнулятся раз в сутки/2-3 суток, и в которой хранятся крайние запрошенные посты старше 3 месяцев.
  • kostyl

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

    Spritz 10 декабря 2011 г. 14:09, спустя 2 минуты 7 секунд

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

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

    Spritz 10 декабря 2011 г. 14:18, спустя 8 минут 20 секунд


    Абырвалг, а нельзя убрать сущьность канала?
    по мне это одна из ключевых сущностей, так зачем её тогда убирать? Но как описал их Костя, это по моему не совсем то. Первое что бударажит мой ум это:
    загрузил 100 фоток - и вот, он подписался сразу на 100 каналов

    почему фотка это канал? Почему не итем или же еще что то?
    Спустя 213 сек.
    Добрый вечер. Летом мы организовывали новостную ленту (activity feed/newsfeed), на mysql. Есть пользователь, он подписывается на несколько каналов. Есть события (прокомментировали фотку/отметились на ней, добавили друга), каждое вещает на несколько каналов. Находим события, вещающие на каналы, к которым подписан пользователь и отдаем их ему.

    ….

    Что подскажите, господа-разработчики?

    посмотри в сторону сфинкса, он прекрасно работает с фильтрацией, пагинацией. Но вот индекс таких штук может занимать очень долгое время. Но во 2 версии ввели лайв-индекс, т.е. он обновляется в реальном времени, а с версии 0.8 или 0.9 появился метод апи, который позволяет добавлять (тут могу спиздеть, т.к. знаю точно есть обновления определенной записи в индексе, а вот за добавление мне кажется, что есть, но это может быть плодом моего воображения) в индекс
    Спустя 40 сек.
    да, я смотрю среди MQ-решений

    мне кажется MQ не совсем подходящее решение.
  • kostyl

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

    Spritz 10 декабря 2011 г. 14:53, спустя 35 минут 21 секунду

    так а что нельзя будет сделать без сущьности канала?
  • mario

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

    Spritz 10 декабря 2011 г. 15:02, спустя 9 минут 35 секунд


    так а что нельзя будет сделать без сущьности канала?
    а как ты представляешь структуру без канала как такового (не важно пользователи подписываются на канал или же 1 юзер 1 канал, в который все пихается)?
  • kostyl

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

    Spritz 10 декабря 2011 г. 15:16, спустя 13 минут 58 секунд

    ну тут важно понимать, что такое канал, зачем он нужен, какую роль он несет…
    Например, если это

    event2channel(event_id, channel_id)
    user2channel(user_id, channel_id)

    сделать таким

    user2eventl(user_id, event_id)

    Что меняется? Я же не знаю, может ли Костян пойти так, вот и предлагаю.

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