Недавно я попытался обновить Objectify с версии v5 до версии v6 и столкнулся с проблемой производительности, связанной с запросами ключа фильтра.
То, что я делаю, это простой запрос ключа диапазона, то есть что-то вроде
ofy()
.load()
.type(NotificationEntity.class)
.filterKey(">=", Key.create(NotificationEntity.class, recipient.id()))
.filterKey("<", Key.create(NotificationEntity.class, recipient.id() + "\ufffd"))
.keys()
.list()
и вот Stackdriver Trace of Objectify v5
а также
, что из v6
,
Как показано на этих трассировках, v6 потребовалось x10 времени для обработки запроса ключа.
У кого-нибудь есть идеи, что происходит за кулисами?
Вот код, который я использовал для создания следов:
final List<Key<NotificationEntity>> keys;
try (final Scope ss = TRACER.spanBuilder("DatastoreClient.getNotifications.loadKeys").startScopedSpan()) {
keys = ofy().load().type(NotificationEntity.class)
.filterKey(">=", Key.create(NotificationEntity.class, recipient.id()))
.filterKey("<", Key.create(NotificationEntity.class, recipient.id() + "\ufffd"))
.keys()
.list();
}
final Map<Key<NotificationEntity>, NotificationEntity> entities;
try (final Scope ss = TRACER.spanBuilder("DatastoreClient.getNotifications.loadEntities").startScopedSpan()) {
entities = ofy().load().keys(keys);
}
try (final Scope ss = TRACER.spanBuilder("DatastoreClient.getNotifications.sortEntities").startScopedSpan()) {
return entities
.values()
.stream()
.sorted(Comparator.comparing(NotificationEntity::getTimestamp).reversed())
.collect(toImmutableList());
}