Как правильно вычислять географические расстояния в высоконагруженных сервисах?
Может быть, вычислять расстояние только до пользователей, которые находятся в этом или смежных квадратах? Можно ограничиться 4 квадратами - расположенными вокруг вершины, ближайшей к пользователю.
Высоконагруженные проекты это всегда компромисс между скоростью и целостностью данных. Поэтому нужно сначала решить, является ли критичной для бизнес-логики ситуация когда несколько пользователей друг друга не увидят или нет. Ответив на этот вопрос можно сделать либо более надженое либо более быстрое решение.
Мы на проекте вынесли логику определения попадания в зону на базу, но честно говоря не тестировали по скорости. Если у Вас будет время и Вы используете MySql, было бы интересно узнать, насколько быстро работает это вычисление.
ACOS(SIN(#{userLat})*e.SIN_LATITUDE + COS(#{userLat})*e.COS_LATITUDE*COS(#{userLong} - e.RADIANS_LONGITUDE)) * 6371000 <= #{targetRadius}
SIN_LATITUDE = SIN(RADIANS(#{latitude})) , COS_LATITUDE = COS(RADIANS(#{latitude})), RADIANS_LONGITUDE = RADIANS(#{longitude}) рассчитывались заранее для каждого объекта перед внесением в БД.