Avatar for squadette
Короче, 10 мая началась разработка, 14-го мая в коде появились риверы в эмбриональном состоянии, 24 мая они были переписаны на новый алгоритм, который я собственно вчера снес. То есть этот код был всю жизнь. Сразу как только я об этом начал думать, у меня получилось, что алгоритм конструирования ленты представляет из себя merge-sort нескольких сортированных потоков, причем не целиком, а top-k. Увлекшись этой сильной идеей, я заимплементил так:
Comment
берется список таймлайнов, извлекается их top-30, потом список таймлайнов сортируется по времени верхнего элемента таймлайна, который извлекается и кладется в ривер. потом снова сортировка, ну и так далее пока либо посты не кончатся, либо мы не наберем достаточно постов, чтобы заполнить ривер на требуемую длину. ‎· псы в рапиде
Comment
неделю назад я поговорил с Типичным Пользователем (тм) и у меня широко распахнулись глаза, потому что я осознал, что Типичный Пользователь подписан на 200 человек, то есть на 600 таймлайнов. Так как я не делал оптимизацию через UNION, то это означало следующее: при каждом новом заходе на экспайрившуюся морду происходило: ‎· псы в рапиде
Comment
а) 600 запросов к timeline_entries, с LIMIT 30, то есть примерно 18000 элементов; ‎· псы в рапиде
Comment
б) сразу же извлекались все посты, которые могут понадобиться, то есть около 600 * 20 / 6 = 2000 постов. Это было сделано, чтобы не делать shotgun queries. Наличие shortgun-N query в предыдущем пункте три месяца меня не смущало. ‎· псы в рапиде
Comment
из всего этого великолепия извлекалось 30 (ТРИДЦАТЬ, КАРЛ) верхних постов (так как пост в средней подписке находится на примерно 6 таймлайнах, то мы проходили по 180 timeline entries. Все остальное выбрасывалось. То есть эффективность забора timeline entries была 1%, эффективность предкэширования постов — 1.5%. ‎· псы в рапиде
Comment
Я провел вечер, проектируя новую систему на базе priority queue, но ближе к двум часам ночи внезапно понял, что все таймлайны на самом деле отсортированы одинаково для одного ривера. Так как исходный алгоритм я проектировал когда еще ничего не понимал (тм), то мне видимо почему-то казалось, что в рамках одного ривера будут таймлайны с разными сортировками в общем случае — именно это легко обеспечивается merge-sort-алгоритмом. ‎· псы в рапиде
Comment
что происходит, бля, сейчас. а) извлекается 600 айдишников таймлайнов; б) делается select * from timeline_entries where timeline_id in (....) order by <sort_by> desc limit 30 * 6; в) извлекаются посты, упоминающиеся в этих 180 таймлайнах (их примерно 30); дальше алгоритм работает как раньше. если постов недостаточно (некоторые не попадают в ленту из-за хайдов и прав доступа), то берется следующий батч из timeline_entries. ‎· псы в рапиде
Comment
На самом деле мы продержались так долго потому, что это редкая операция. Именно такие безумные потери происходят только на мордах, которые все же относительно редко экспайрятся. На всех остальных типах лент эффективность старого кэширования близка к стопроцентной. ‎· псы в рапиде
Comment
---- можно травить ---- ‎· псы в рапиде
Comment
а исчезновение кнопки Older posts было где-то тут? ‎· мотыль проворный
Comment
исчезновение кнопки Older posts произошло дважды! Первый раз ты видела, а второй раз документирован тут: https://mokum.ru/squadette/24465 ‎· псы в рапиде
Comment
ну вот мне и интересны причины первого. ибо кроме ~"вы все тут больные" ты тогда ничего не сказал ‎· мотыль проворный
Comment
прости, я не знал, что это так заденет! в прошлый раз все проявлялось на очень далеких страницах, а на этот раз гораздо быстрее. Причина одна и та же — неправильное условие, при котором лента помечалась как "закончившаяся". ну и соответственно никаких попыток ее дальше расширять не предпринималось. ‎· псы в рапиде
Comment
не! ну чо сразу прости-заденет? мне интересно! ну в смысле наблюдаю, делаю какие-то дурацкие предположения, и хочется же знать, что в итоге было-то ‎· мотыль проворный
1 2 3 4 5 6 7 8 9 10

2015-2018 Mokum.place