2013-10-03 4 views
4

У меня возникают проблемы с плохой производительностью на канале CouchDB _changes, когда есть несколько наблюдателей.Увеличьте скорость подачи бумаги CouchDB при применении фильтра

У меня CouchDB работает внутри виртуальной машины на ноутбуке, а несколько клиентов iOS потребляют _changes?feed=continuous в одной из баз данных по сети, используя HTTP API CouchDB. По мере увеличения числа клиентов скорость, с которой происходят изменения, замедляется до обхода.

N.B. Я действительно общаюсь с CouchDB через обратный прокси Apache, который сжимает ответы.

И я также замечаю, что, применяя фильтр к каналу, он часто будет длиться долго, не доставляя никаких изменений в потоке HTTP. Почти так, как будто я жду его, чтобы проверить партию документов, которые не соответствуют моему фильтру.

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

+0

Будет интересно увидеть ответы. Я собираюсь вынести решение, которое использует изменения, но думал о том, что «один» потребитель потребляет его и публикует в собственных очередях сообщений и/или публикует с использованием веб-карт и т. Д. – Daniel

+0

Это неплохая идея. Фильтр, который я применяю, фактически принимает параметр переменной, поэтому мне нужно несколько кешей для разных возможных фильтров. И я уже представил множество сложностей, используя обратный прокси, чтобы я мог получить сжатый контент. –

ответ

2

Увеличение задержки с количеством пользователей отфильтрованной ленты с фильтрами не удивительно, когда вы понимаете, что для каждого изменения couchdb запрашивает сервер запросов для оценки функции filter(). По-видимому, он не кэширует результаты, поэтому он должен выполнять эту операцию для каждого потребителя.

Что-то вы могли бы попробовать это сбросив фильтра параметр и с помощью include_docs = истинный вместо этого. Таким образом, производитель фидов не должен будет запрашивать сервер просмотра для оценки изменений. Это должно сделать его более отзывчивым. Конечно, это связано с ценой значительного увеличения объема данных, передаваемых в фиде, и вам нужно дублировать логику функций filter() на стороне клиента. Это не идеально, но я думаю, что это стоит того.

+0

Я уже использую параметр 'include_docs', потому что я использую фид изменений в качестве * be-all-and-end-all * для получения данных из Couch. В идеале я хотел бы использовать 'bulk_docs' для вывода больших объемов данных (возможность использования представлений, которые быстрее), но это не дает мне последовательность обновления, поэтому я не знаю, с чего начать слушать '_changes'. Я мог бы попробовать эту технику и посмотреть, улучшу ли я производительность. –

+0

Его не быстрее, своего рода то же самое. '_changes' - это тоже мнение. Вы можете думать об этом как представление, сгенерированное с помощью 'emit (db_seq (doc), null)'. Когда вы запрашиваете его с 'since', как если бы вы использовали' startkey'. Вы должны увидеть хорошее улучшение скорости, как только вы сбросите параметр filter. –

+2

Я отмечаю это как ответ из-за результатов некоторых тестов. Я подсчитал ответ в терминале («зависание времени ...») и обнаружил, что фильтр увеличивает ответ на порядки. Для документов ~ 6k время отклика '_changes' составляло (в среднем) 4 секунды без фильтра, и оно подпрыгивало до 40 секунд с применением фильтра. –

Смежные вопросы