Вопрос по java, google-app-engine, gae-search, quotas – квоты на appengine поиск API для Java

9

Я тестирую новый поисковый API для движка приложений для Java, и у меня есть следующий код, который пытается добавить ~ 3000 документов в индекс:

<code>List<Document> documents = new ArrayList<Document>();
    for (FacebookAlbum album: user.listAllAlbums()) {
        Document doc = Document.newBuilder()
                .setId(album.getId())
                .addField(Field.newBuilder().setName("name").setText(album.getFullName()))
                .addField(Field.newBuilder().setName("albumId").setText(album.getAlbumId()))
                .addField(Field.newBuilder().setName("createdTime").setDate(Field.date(album.getCreatedTime())))
                .addField(Field.newBuilder().setName("updatedTime").setDate(Field.date(album.getUpdatedTime())))
                .build();
        documents.add(doc);
    }     

    try {
        // Add all the documents.
        getIndex(facebookId).add(documents);
    } catch (AddException e) {
        if (StatusCode.TRANSIENT_ERROR.equals(e.getOperationResult().getCode())) {
            // retry adding document
        }
    }
</code>

Однако я получаю следующее исключение:

<code>Uncaught exception from servlet
java.lang.IllegalArgumentException: number of documents, 3433, exceeds maximum 200
at com.google.appengine.api.search.IndexImpl.addAsync(IndexImpl.java:196)
at com.google.appengine.api.search.IndexImpl.add(IndexImpl.java:380)
at photomemories.buildIndexServlet.doGet(buildIndexServlet.java:47)
</code>

Есть ли квота на количество документов, которые я могу вставить с добавленным вызовом, установленным на 200?

Если я попытаюсь вставить один документ за раз в индекс с помощью следующего кода:

<code> for (FacebookAlbum album: user.listAllAlbums()) {
        Document doc = Document.newBuilder()
                .setId(album.getId())
                .addField(Field.newBuilder().setName("name").setText(album.getFullName()))
                .addField(Field.newBuilder().setName("albumId").setText(album.getAlbumId()))
                .addField(Field.newBuilder().setName("createdTime").setDate(Field.date(album.getCreatedTime())))
                .addField(Field.newBuilder().setName("updatedTime").setDate(Field.date(album.getUpdatedTime())))
                .build();

         try {
            // Add the document.
            getIndex(facebookId).add(doc);
        } catch (AddException e) {
            if (StatusCode.TRANSIENT_ERROR.equals(e.getOperationResult().getCode())) {
                // retry adding document
            }
        }

    }     
</code>

Я получаю следующее исключение:

<code>com.google.apphosting.api.ApiProxy$OverQuotaException: The API call search.IndexDocument() required more quota than is available.
at com.google.apphosting.runtime.ApiProxyImpl$AsyncApiFuture.success(ApiProxyImpl.java:479)
at com.google.apphosting.runtime.ApiProxyImpl$AsyncApiFuture.success(ApiProxyImpl.java:382)
at com.google.net.rpc3.client.RpcStub$RpcCallbackDispatcher$1.runInContext(RpcStub.java:786)
at com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:455)
</code>

Я думал, что квота на вызовы API составляет 20 КБ / день (см. Здесь:https://developers.google.com/appengine/docs/java/search/overview#Quotas).

Есть идеи о том, что происходит?

Ваш Ответ

3   ответа
3

что существует ограничение квоты в минуту, вы должны индексировать документы, используя очередь, чтобы убедиться, что вы постепенно их индексируете.

Как поможет очередь? Это ограничение скорости на задачу или что? Ioannis Antonellis
В точку. Ограничьте очередь, чтобы избежать превышения квоты. У Google есть квоты в минуту (в секунду?) Повсюду. Jan Z
1

20 тыс. - только 13,9 в минуту.

https: //developers.google.com/appengine/docs/quota

8

и это то, что очень скоро будет разъяснено в документации, квота Search API Call также учитывает количество документов, которые добавляются / обновляются. Таким образом, один вызов Add, который вставляет 10 документов, уменьшит вашу ежедневную квоту на вызов API поиска на 10.

Да, максимальное количество документов, которые могут быть проиндексированы в одном вызове добавления, равно 200. Однако на этом этапе также существует краткосрочная пакетная квота, ограничивающая вас до около 100 вызовов API в минуту.

Все вышесказанное означает, что, по крайней мере, на данный момент безопаснее не добавлять более 100 документов на один запрос на добавление. Делать это через Task Queue, как рекомендует Shay, тоже очень хорошая идея.

Спасибо, Питер! Добавление ~ 3k документов было достигнуто путем вызова add по одному документу за раз и наличия очереди задач с пределом скорости 2 / с - скорость очереди по умолчанию (5 / с) достигала пакетной квоты. Таким образом, ограничение скорости пакетной передачи составляет> = 120 вызовов API в минуту. Ioannis Antonellis
Пакетирование нескольких документов в один вызов add немного более эффективно. Peter McKenzie
Question: Есть ли тогда преимущество (быстрее?) В вызове add со многими документами по сравнению со многими вызовами для добавления в документ одновременно? Ioannis Antonellis
Недавно мы удалили квоту поиска (пакетного) в минуту для бесплатных приложений, поэтому теперь вы можете использовать свою квоту 20K Search API Call так быстро, как вам нравится. Peter McKenzie

Похожие вопросы