Ell Neal
Ell Neal

Reputation: 6064

Increase speed of CouchDB's _changes feed while applying a filter

I'm having trouble with poor performance on CouchDB's _changes feed when there are multiple observers.

I have CouchDB running inside a virtual machine on a laptop, and multiple iOS clients are consuming _changes?feed=continuous on one of the databases over the network, using CouchDB's HTTP API. As the number of clients increases, the speed at which the changes come through is slowed to a crawl.

N.B. I'm actually communicating with CouchDB via an Apache reverse proxy, which is compressing the responses.

And I'm also noticing that, while applying a filter to the feed, it will often go long periods without delivering any changes to the HTTP stream. Almost as if I'm waiting for it to check a batch of documents that don't meet my filter.

Is there anything settings I can enable or optimisations I can make that will help speed this all up?

Upvotes: 4

Views: 1039

Answers (1)

Marek Kowalski
Marek Kowalski

Reputation: 1792

The increase of latency with the number of consumers of filtered _changes feed is no surprise when you realize, that for each change couchdb has ask the query server to evaluate the filter() function. Apparently it doesn't cache the results so it has to perform this operation for each consumer.

Something you could try is dropping the filter parameter and using the include_docs=true instead. This way the feed producer wouldn't have to ask the view server to evaluate the changes. This should make it more responsive. Of course, this comes with the price of significantly increasing the amount of data transferred in the feed and you have to duplicate the filter() function logic on the client side. Its not ideal, but I think its worth a shot.

Upvotes: 2

Related Questions