SyncCollection в Акита Коллекшн Сервис слишком дорогой? - PullRequest
0 голосов
/ 26 января 2020

У меня запрос по методу CollectionService(), доступному в модуле akita-ng-fire. Я создал сервис, который расширяет CollectionService () и использует syncCollection для поддержания syn c между документом firestore и моим веб-клиентом. Вот как выглядит определение сервиса:

@Injectable({providedIn: 'root'})
@CollectionConfig({path: 'someDoc/:customId/anotherDoc'})
export class MyService extends CollectionService<WorkspaceState> {

    constructor(store: WorkspaceStore) {
        super(store);
        this.store.setHasCache(true, {restartTTL: true});
    }

    // service methods ......
}

Я использую его в директиве onInit в моем компоненте для инициализации syn c.

    ngOnInit() {
        this.sub = this.myService.syncCollection().pipe(
            concatMap(_ => this.query.myDoc$.pipe(
                tap(d => this.myService.markActive(d.customId)),
                tap(d => this.customId = d.customId),
            )),
            tap(d => this.router.navigate(['somePlace', d. customId])),
        ).subscribe();
    }

Однако я вижу, что этот син c проходит ~ 5 операций чтения каждую минуту. Есть ли способ уменьшить это? Я считаю, что это дорого для меня, потому что у нас есть этот сервис в качестве основного сервиса, который используется для поддержки синхронизации c с критически важным для бизнеса документом.

Любые предложения от сообщества будут полезны

Ответы [ 2 ]

4 голосов
/ 26 января 2020

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

  1. Только син c, когда вам нужно : используйте syncCollection для страниц с список и syncDoc для страниц с одним просмотром. И не забывайте отписываться, когда вы покидаете страницы (мне нравится использовать Guards для этой цели).
  2. Если вам не нужно всегда быть в курсе, рассмотрите возможность использования снимка вместо с getValue. Есть некоторые случаи, когда вы не хотите выполнять чтение в режиме реального времени, например, не совместные формы, или списки, в которых отображается только один ключ, который не должен изменяться. В этом случае вы можете использовать getValue() для коллекции или getValue(id) для документа.
  3. Используйте queryFn для прослушивания меньшего количества документов . Большую часть времени вы не хотите получать всю коллекцию, а только ее подмножество: syncCollection(ref => ref.limitTo(10).where(...).
  4. Не беспокойтесь о цене . Вы заплатите около € / млн. Чтений. Время, потраченное на его оптимизацию, обойдется вашей компании гораздо дороже, чем затраты на чтение в Firebase. Держите цену в голове, когда вы пишете код, но не тратьте слишком много времени на оптимизацию;).

В качестве примечания, я не думаю, что setHasCache будет иметь здесь какое-либо влияние. Firebase использует IndexedDB для кэширования данных, которые вы уже использовали. Так что, если ничего не изменилось с прошлого раза, вы не платите за это.

1 голос
/ 26 января 2020

используйте оператор first для автоматической отмены подписки при получении данных

    ngOnInit() {
        this.sub = this.myService.syncCollection().pipe(
            concatMap(_ => this.query.myDoc$.pipe(
                tap(d => this.myService.markActive(d.customId)),
                tap(d => this.customId = d.customId),
            )),
            
            first((d) => {
              const hasData = !!d;
              return hasData;
            })
            tap(d => this.router.navigate(['somePlace', d. customId])),
        ).subscribe();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...