Приемлемо ли иметь много слушателей на основе «ГДЕ» - PullRequest
0 голосов
/ 03 апреля 2019

Я работаю над реализацией, в которой мне нужно эффективно прослушать следующий псевдопросмотр:

SELECT * FROM 'trips' WHERE 'travelers' IS ONE OF [ x,y,z ]

Поскольку firebase не допускает запросов OR, мое текущее решение - создать все возможныеПерестановки поездок x путешественников и прослушивания всех их.


// Returns an array of {}
const permutations = ( locs, uids ) => {
    let perms = locs.map( location => {
        return uids.map( uid => ( { location: location, uid: uid } ) )
    } )
    return [].concat( ...perms )
}

// Trip destinations
let destinations = [ 'Amsterdam', 'Berlin' ]
// UIDs of travelers (in reality unique hashes)
let uids = [ 'John', 'Mary' ]


// Listeners
return Promise.all( permutations( locations, friends ).map( ( { location, uid } ) => {
        this.db.collection( 'trips' )
        .where( 'destination', '==', location )
        .where( 'traveler.uid', '==', uid )
        .onSnapshot( snapshot => {
            Promise.resolve( snapshot.docs )
            // Filter out empties
            .then( docs => docs.map( doc => doc.exists ? doc : false ) )
            .then( docs => docs.filter( doc => doc != false ) )
            // Grab data from docs
            .then( docs => docs.map( doc => ( { ...doc.data(), id: doc.id } ) ) )
            // Call a callback (used int he bigger scheme of a redux listener)
            .then( callback )
        } )
    } ) )
} )

В настоящее время это приводит к нескольким слушателям, но если массивы назначения / uids становятся большими, это может привести к МАССИВНОМУ количеству слушателей.

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

Имеет ли потенциально прослушивание bazillion слушателей проблему в firebase?Либо для производительности или стоимости?

1 Ответ

1 голос
/ 04 апреля 2019

Вы должны быть более конкретны в отношении "Базиллион". В общем, слушатели дешевы, и вам не стоит об этом беспокоиться. Но у всего есть практический предел, и я думаю, что вы поймете, что это такое, когда приблизитесь к своему гипотетическому «базилиону».

1 слушатель не использует счета, отличные от 10, 100 или 1000 слушателей. Вы можете ожидать, что оплата за одного слушателя будет линейно масштабироваться. Каждый из них будет стоить ровно столько, сколько он обычно стоит сам по себе, для каждого документа, который отличается для всех их запросов.

Каждый список также имеет одно соединение, поэтому вам не нужно беспокоиться об исчерпании дескрипторов открытых файлов или о чем-либо подобном. Твой лимит, фактически говоря, будет памятью и пропускной способностью.

...