
Badoo работает по всему миру и наш поиск работает абсолютно одинаково, вне зависимости от того, в какой точке земного шара вы находитесь. Как же эффективно искать людей вокруг среди всех 200+ миллионов пользователей?
Решение нетривиально, честно говоря. Нам нужен какой-то индекс, какой-то способ сразу же сузить область поиска. В случае с земным шаром, самым простым разбиением является сетка географических широт и долгот. Однако проблема с этой сеткой в ее неравномерности. Ячейка у северного полюса и ячейка у экватора имеют совсем разные формы. Такое несимметричное разбиение вносит большие проблемы, если мы хотим равномерно распределить нагрузку по поисковому кластеру.

Спроецируем вершины и ребра икосаэдра на сферу Земли. Разобьем рекурсивно треугольники задаваемые икосаэдром на 4 более мелких треугольника. И так два раза. Получим в итоге 320 граней. К сожалению, уже не равных. Далее — программкой на питоне сгенерируем ~100000 строк кода на C, которые умеют делать трансформацию lon/lat -> треугольник.

Таким образом мы можем любую координату на земном шаре сопоставить с треугольником или, другими словами, с шардой кластера, которая содержит в себе всех пользователей, живущих в данной области земного шара.
Такой «большой» треугольник, в зависимости от желаемой точности поиска, мы можем и дальше разбивать на треугольники, все более и более «мелкие». Когда треугольники становятся достаточно мелкими по сравнению с радиусом земли — можно уже считать их «плоскими» и строить расстояния в «высотах треугольников», а не метрах.

Каждый из таких «маленьких» треугольников однозначно задается тройкой (a, b, c), где a, b, c являются номерами пересекающихся линий.
Как эффективно искать людей в маленьком треугольнике, используя нашу систему координат мы обязательно расскажем в будущем, если вам интересно, но мы бы хотели сегодня вернуться и более подробно поговорить о «больших» треугольниках.
Предложенное нами решение по разбиению земного шара имеет недостатки, связанные как с неравномерностью, так и с точностью. Несмотря на 320 шард, мы зачастую сталкиваемся с перекосами в нагрузке.
И вот, пару неделю назад, с нами связались наши друзья — сотрудники Австрийского Института Науки и Технологий и рассказали об их открытии.
Используя разработанную ими технику поиска симметричных сечений многомерных решеток и ресурсоемкие компьютерные вычисления им удалось построить новое симметричное разбиение сферы на шестиугольники с достаточно большим количеством вершин. Полученные дизайн они назвали «Гексасфера». На сайте с анонсом статьи выложена интерактивная модель данного разбиения. Вставить ее сюда мы не смогли, так что перейдите по ссылке, чтобы поиграться с ней.

В течение прошлой недели мы плотно поработали вместе с австрийцами, доработали наш алгоритм, и добились абсолютно равномерного распределения нагрузки по шардам.
Badoo для своих пользователей стал точнее, для нас система стала более предсказуемой и устойчивой к нагрузкам, а ученые из Австрии, надеемся, увидели интересное применение для своих идей.
В следующей статье мы обязательно более подробно расскажем как работает этот алгоритм и покажем на графиках те улучшения, которых нам удалось добиться.
Марко Кевац, разработчик-исследователь
Комментарии (31)
dovg
01.04.2015 15:55+1В течение прошлой недели мы плотно поработали вместе с австрийцами, доработали наш алгоритм, и добились абсолютно равномерного распределения нагрузки по шардам.
Нарезка земли на равны кусочки ведет к равномерности нагрузки? Но ведь кусочек, содержащий условный Дели будет гораздо более нагружен, чем кусочек с условной Антарктидой.
Мы в подобной задаче просто брали проекцию Меркатора, да там искажения на полюсах, но ведь на полюсах и пользователей сильно меньше, не так ли?mkevac Автор
01.04.2015 16:26Будет гораздо более нагружен. Вы правы. Смотрите ответ на этот комментарий: habrahabr.ru/company/badoo/blog/254643/#comment_8356027
Geckelberryfinn
01.04.2015 16:08Круто! А вот предлагать знакомых рядом с учетом языка вы так и не научились. Живу в Париже и в Лионе и мне постоянно чернокожих красавиц предлагают. Спасибо, но пока нет)
mkevac Автор
01.04.2015 16:09Вам бы русских русых красавиц в Париже отыскать? :-)
Geckelberryfinn
01.04.2015 16:18Именно! Французские девушки не такие интересные. Кроме того, тут много русских, ищущих именно русских. И это стандартное желание среди эмигрантов.
И еще: а нужно ли равномерное разбиение сферы? Ведь наверняка нагрузка там больше, где плотность населения больше? Может имеет смысл сгущать сетку в густонаселенных районах? Это представит возможности по более детальному поиску. Например, в мегаполисах как Москва и Мехико можно делить по районам.mkevac Автор
01.04.2015 16:24-1Имеет. Вы правы.
Но разве можно отказаться от такого революционного открытия, как гексасфера? Можно ее просто сделать гуще! Равномерно гуще! :-)
Walas
01.04.2015 16:28+1В веб-версии (badoo.com), в People Nearby (Люди рядом) есть настройки поиска, в которых есть advanced search. Там можно искать девушек всяко-разно. Можно найти рыжеволосую, зелёноглазую, без вредных привычек, выше 170 сантиметров, не занятую, живущую отдельно, говорящую по-русски девушку за секунду. Если повезёт, и не одну. =) Удачи!
Geckelberryfinn
01.04.2015 16:35В мобильной веб-версии есть только мальчик/девочка, разброс возрастов и цель знакомства. А настольной версией неудобно на телефоне пользоваться.
yojick
01.04.2015 16:28+18Сидят в гримерке два клоуна — молодой и старый, выдумывают репризу. Молодой говорит: давайте вы выйдете на манеж, уроните кошелек, нагнетесь, а я выбегу из-за кулисы и дам вам сапогом по ж*пе. Старый печально отвечает: не годится. Слишком тонкая шутка для нашего цирка…
m1el
01.04.2015 19:05+6Если никто не заметил, это разбиение невозможно. :)
TimsTims
02.04.2015 14:09Вопрос — а если граница такого треугольника/шестиугольника проходит ну допустим прямо по середине города, значит поиск будет произведен только в одном шарде, и живущие, например прямо возле её границы никогда не найдут свою вторую половину из соседней улицы только потому что шарды так разбиты? Прямо как Берлинская стена…
mkevac Автор
02.04.2015 16:28Штуки в сторону, такие ситуации у нас обходятся таким образом, что треугольники пересекаются, накладываются друг на друга. Т.е. пользователи в какой-то области будут дублироваться в накладывающихся треугольниках.
kemsky
02.04.2015 17:01А почему вы решили использовать свое, вместо уже известных R-деревьев (и вагона других spatial индексов)?
forgotten
Если это на первое апреля, то могли бы что-нибудь позабавнее придумать.