2013-07-15 1 views
7

У нас есть приложение, которое использует Cloudant как удаленный сервер. Тем не менее, Cloudant не полностью совместим с непрерывными повторениями TouchDB от предыдущего опыта. Таким образом, наша альтернатива на данный момент состоит в том, чтобы запускать вручную одноразовые репликации с фиксированной частотой. Тем не менее, мы хотели бы знать, будет ли этот подход стоить нам больше денег, чем непрерывные повторы, поскольку непрерывные повторы используют longpoll и не требуют часто запрашивать сервер. Другими словами, делает ли одноразовое тиражирование с помощью Cloudant, поскольку цель стоила нам запроса GET?Стоимость непрерывных реплик по сравнению с однократными повторениями (с использованием TouchDB и Cloudant)

Спасибо, Пол

+2

«Облако не совместимо с непрерывными повторениями TouchDB». Почему нет? – garbados

+0

Майк упомянул проблему несовместимости в своем ответе. Это открытая проблема, которая еще не решена. Ни авторы TouchDB, ни поддержка Cloudant не смогли определить причину проблемы, но нам удалось воспроизвести ее с относительной легкостью. – airpaulg

ответ

8

Я думаю, что вопрос вы ссылаетесь на это [1]. Репликация Cloudant на 100% совместима с CouchDB. В этом примере журналы TouchDB указывают, что сетевой стек iOS прошел на неполном JSON на TouchDB. Неясно, кто должен был обвинять в этом случае для отказа репликации.

[1] https://github.com/couchbaselabs/TouchDB-iOS/issues/241

На вопрос стоимости, тянуть репликации одноразовое приведет к ГЭТ к корму _changes каждый раз, когда это происходит, а также других запросов, необходимых для репликации. Этот запрос _changes будет засчитан как сигнал HTTP-запроса против вашей учетной записи Cloudant.

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

Важно также помнить, что количество вызовов _changes очень мал по сравнению с рядом других вызовов, связанных (например, получение содержания изменений сами и, в частности, если есть много вложения).

Хотя этот вопрос относится только к TouchDB, и я упоминаю конкретное поведения этого кодового, этот ответ имеет дело с запросами участия в репликации между любыми двумя системами, говорящих протоколом CouchDB репликацией [2].

[2] http://www.dataprotocols.org/en/latest/couchdb_replication.html

Давайте надуманный пример: 1 обновление за 10 вторым окно базы данных источника для репликации, где база данных TouchDB является целевой. Давайте проведем 5-минутный опрос против непрерывной репликации. Для простоты подсчета звонков, давайте также возьмем вложения из изображения . Мы также предположим, что устройство имеет постоянное сетевое соединение.

Для непрерывного случая каждые 10 секунд TouchDB получит обновление в _changes. Это приводит к закрытию соединения longpoll. TouchDB затем выполняет изменения, запрашивая обновления из исходной базы данных ; один или несколько запросов GET на удаленном сервере. Пока это происходит, TouchDB должен открыть еще один longpoll запрос по _changes.Таким образом, за пять минут вы получите, возможно, 30 звонков на _changes, а также все звонки для получения документов и записи контрольных точек .

Сравните это с однократной репликацией каждые пять минут. Вы получите уведомление о 30 обновлениях в одном сообщении об обмене подпиской. TouchDB реализует оптимизацию [3] в результате чего он будет вызывать _all_docs получить обновленные документы на 1- оборотах, так что вы может в конечном итоге с помощью одного вызова, чтобы получить все 30 документов (не возможно в непрерывном случае, как вы мы получили одно изменение). Затем у вас есть контрольные документы . В лучшем случае менее 5 HTTP-звонков, самое большее около трети - это непрерывный случай, поскольку вы избегаете дополнительных запросов _changes.

[3] https://github.com/couchbaselabs/TouchDB-iOS/wiki/Replication-Algorithm#performance

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

Еще один вопрос заключается в том, как часто происходит падение соединений из-за сетевых отключений , которые происходят регулярно с мобильными устройствами. Непрерывные репликации TouchDB будут срабатывать каждый раз, когда пользователь подключается к сети (если он добавлен через базу данных _replicator). Это дополнительный источник непредсказуемых затрат.

Однако выгоды от более непосредственной видимости изменений могут , безусловно, стоит неопределенности.

+0

Большое спасибо за очень подробный ответ. Тем не менее, у меня создалось впечатление, что длинный патч закрывается только тогда, когда происходит смена. Я не знал, что он получил обновление, сообщив, что нет ничего, что закрывает длинный паз. Я как бы напоминаю, что тестировал непрерывное нажатие с прокси-сервером, и он только, казалось, запускал запросы, когда я действительно менял данные на стороне сервера, но я мог ошибаться. Итак, другими словами, вы подтверждаете, что каждые 10 секунд длинный патч закрывается, даже если нет ничего, чтобы заставить его вызвать другой запрос GET для его повторного открытия? – airpaulg

+1

Запрос longpoll имеет тайм-аут (по умолчанию 60 секунд), после чего он сбрасывается, если никаких изменений не было. Это настраивается на основе репликации - см. Http://docs.couchdb.org/en/latest/changes.html. –

+0

В случае отсутствия изменений каждые 10 секунд это изменяет расчет стоимости в пользу непрерывной репликации, так как длинные паузы длинны? Кроме того, на практике, не будет ли более длительный тайм-аут делать непрерывные повторения менее дорогостоящими? Каковы негативные аспекты более длительного тайм-аута? – airpaulg

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