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