Мне было интересно, может ли кто-нибудь помочь мне с этой проблемой.
У нас есть идея, которую мы хотели бы реализовать, и в настоящее время мы не можем сделать это эффективно.
Я анонимизировал данные как можно лучше, но структура та же.
У нас есть две сущности, Car и CarJourney. Каждый автомобиль имеет 0 ко многим CarJourney's. Каждое автомобильное путешествие имеет (среди прочих свойств) дату, связанную с ним - дату начала поездки.
Я хотел бы запросить время по автомобильным поездкам. У меня будет два раза, дата начала и дата окончания, где дата начала <= endDate, и я хочу получить последнее начатое путешествие за этот период. </p>
Итак, если бы я имел в виду конкретную машину, скажем, машину 123, я бы написал запрос, который ограничивается значениями Car.key и Car.startDate, где Car.key == 123 и Journey.startDate> = startDate и Journey.startDate <= endDate с упорядочением по Journey.startDate по убыванию и пределом 1. </p>
например. Автомобиль А имеет 3 поездки, совершенные 1-го, 2-го и 3-го числа месяца. Дата начала запроса - 1-й, а дата окончания запроса - 2-й. Результатом этого запроса будет одно автомобильное путешествие, второе.
Как только возвращается результат этого запроса, выполняется очень небольшая обработка, чтобы вернуть результат пользователю.
Это легко.
Но вместо 1 Автомобиля мне нужен список автомобилей, в котором содержится N ключей от автомобилей.
Итак, я хочу выполнить вышеуказанный запрос N раз, один раз для каждой машины. И я хочу новейшее путешествие для каждой машины.
Поскольку временной диапазон является гибким (и, следовательно, не может быть известен заранее), мы не можем реализовать флаг «isMostRecent», потому что, хотя он может быть самым последним на данный момент, он может быть не самым последним для указанные параметры даты.
Мы также должны убедиться, что это возвращает быстро (текущие запросы находятся на отметке 3-5 секунд для небольшого набора данных), поскольку это возвращается непосредственно к пользователю. Это означает, что мы не можем использовать очереди задач, и поскольку указанные даты являются произвольными, мы не можем реализовать массовую индексацию полей «isWithinDate».
Мы попытались использовать асинхронный запрос, но поскольку объем обработки незначителен, узким местом по-прежнему являются запросы к хранилищу данных (поскольку асинхронный API-интерфейс по-прежнему отправляет запросы синхронно, он просто не блокируется).
В идеале, мы бы реализовали это как выбор для автомобильных поездок, заказанных startDate, где Car.key отличается, но мы не можем осуществить это в GAE.
Существует множество небольших оптимизаций, которые мы можем сделать (например, некоторые MemCaching для повторных запросов), но ни одна не оказала существенного влияния на время нашего запроса. И MemCaching может помочь только максимум 1-2 минуты (из-за неизбежного продвижения вперед!)
Любые идеи приветствуются и высоко ценятся.
Спасибо,
Ed