Медленный фильтр ключевого запроса с Objectify v6 - PullRequest
0 голосов
/ 11 января 2019

Недавно я попытался обновить 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());
}
...