2013-07-15 19 views
7

Chúng tôi có một ứng dụng sử dụng Cloudant làm máy chủ từ xa. Tuy nhiên, Cloudant không hoàn toàn tương thích với các bản sao liên tục của TouchDB từ trải nghiệm trước đó. Vì vậy, thay thế của chúng tôi bây giờ là kích hoạt sao chép một lần thủ công ở tần số cố định. Tuy nhiên, chúng tôi muốn biết liệu cách tiếp cận đó có tốn nhiều tiền hơn so với sao chép liên tục hay không, vì bản sao liên tục sử dụng longpoll và không cần truy vấn máy chủ thường xuyên. Nói cách khác, một cú bắn có nhân bản với Cloudant vì mục tiêu khiến chúng ta có yêu cầu GET không?Chi phí sao chép liên tục so với bản sao một lần (sử dụng TouchDB và Cloudant)

Cảm ơn bạn, Paul

+2

"Cloudant không tương thích với bản sao liên tục của TouchDB". Tại sao không? – garbados

+0

Mike gọi vấn đề không tương thích trong câu trả lời của anh ta. Đó là một vấn đề mở chưa được giải quyết. Cả các tác giả TouchDB hoặc Cloudant đều không thể xác định nguồn gốc của vấn đề là gì, nhưng chúng tôi đã tái tạo nó một cách dễ dàng. – airpaulg

Trả lời

8

Tôi nghĩ vấn đề bạn đề cập đến là [1]. Bản sao của Cloudant tương thích 100% với CouchDB. Trong ví dụ này, nhật ký của TouchDB cho biết ngăn xếp mạng iOS đã vượt qua trên JSON không hoàn chỉnh tới TouchDB. Nó không rõ ràng ai là để đổ lỗi cho trong trường hợp này cho sự thất bại nhân rộng.

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

Đối với câu hỏi chi phí, một kéo sao chép một-shot sẽ dẫn đến một GET đến _changes thức ăn mỗi lần xảy ra, cộng với các yêu cầu khác cần thiết để lặp. Yêu cầu _changes này sẽ được tính là yêu cầu yêu cầu HTTP đối với tài khoản Cloudant của bạn.

Tuy nhiên, việc này có hiệu quả khi có ít hoặc nhiều yêu cầu tổng thể hơn tùy thuộc vào số lượng thay đổi sắp xuống từ máy chủ từ xa.

Nó cũng quan trọng cần nhớ rằng số lượng _changes cuộc gọi là rất nhỏ so với số lượng cuộc gọi khác có liên quan (ví dụ, nhận được nội dung trong những thay đổi bản thân và đặc biệt là nếu có nhiều file đính kèm).

Trong khi câu hỏi này là cụ thể cho TouchDB, và tôi đề cập cụ thể hành vi của codebase rằng, đây giao dịch câu trả lời với các yêu cầu liên quan đến trong sự sao chép giữa bất kỳ hai hệ thống nói giao thức CouchDB sao chép [2].

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

Hãy lấy một ví dụ giả tạo: 1 cập nhật mỗi 10 cửa sổ thứ hai để cơ sở dữ liệu nguồn cho các nhân rộng, nơi mà một cơ sở dữ liệu TouchDB là mục tiêu. Hãy tham gia một cuộc thăm dò dài 5 phút so với một bản sao liên tục. Để đơn giản hóa tính năng đếm cuộc gọi, chúng ta cũng lấy các tệp đính kèm ra khỏi ảnh . Chúng tôi cũng giả định thiết bị có kết nối mạng không đổi.

Đối với trường hợp liên tục, cứ 10 giây TouchDB sẽ nhận được bản cập nhật trong nguồn cấp dữ liệu _changes. Điều này gây ra kết nối longpoll để đóng. TouchDB sau đó chạy qua các thay đổi, yêu cầu cập nhật từ cơ sở dữ liệu nguồn ; một hoặc nhiều yêu cầu GET trên máy chủ từ xa. Trong khi điều này đang xảy ra, TouchDB phải mở một yêu cầu longpoll tới _changes.Vì vậy, trong khoảng thời gian năm phút, bạn sẽ kết thúc với có lẽ 30 cuộc gọi đến _changes, cộng với tất cả các cuộc gọi để nhận tài liệu và ghi lại các điểm kiểm tra.

So sánh điều này với bản sao một lần mỗi năm phút. Bạn muốn nhận được thông báo về 30 cập nhật trong một cuộc gọi nguồn cấp dữ liệu _changes. TouchDB thực hiện việc tối ưu hoá [3] theo đó nó sẽ gọi _all_docs để có được tài liệu cập nhật cho 1- revs, vì vậy bạn có thể kết thúc với một cuộc gọi duy nhất để có được tất cả 30 tài liệu (không thể trong trường hợp liên tục như bạn đã nhận được một thay đổi duy nhất). Sau đó, bạn đã có các tài liệu checkpoint để ghi lại. Ít hơn 5 cuộc gọi HTTP tốt nhất, ít nhất là khoảng 1/3 số trường hợp liên tục khi bạn đã tránh thêm yêu cầu _changes.

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

Nó đi xuống đến tần suất cập nhật mà bạn mong đợi để nguồn cơ sở dữ liệu . Bản sao một lần có khả năng cung cấp một đường cong giá hấp dẫn hơn khi bạn kiểm soát tốt hơn số lượng yêu cầu bạn thực hiện.

Câu hỏi tiếp theo là tần suất kết nối sẽ giảm do ngắt kết nối mạng xảy ra thường xuyên với thiết bị di động. Sao chép liên tục của TouchDB sẽ kích hoạt lại mỗi khi người dùng xuất hiện trực tuyến (nếu được thêm thông qua cơ sở dữ liệu _replicator). Đây là một nguồn chi phí không thể dự đoán trước là .

Tuy nhiên, lợi ích từ khả năng hiển thị tức thì hơn về các thay đổi có thể chắc chắn đáng để đảm bảo sự không chắc chắn.

+0

Cảm ơn bạn rất nhiều vì câu trả lời rất chi tiết. Tuy nhiên, tôi đã cảm thấy rằng longpoll chỉ đóng cửa khi có sự thay đổi để kéo. Tôi không biết rằng nó nhận được một bản cập nhật nói rằng nó không có gì kéo, đóng kéo dài. Tôi loại thu hồi thử nghiệm một kéo liên tục với một proxy và nó chỉ dường như kích hoạt yêu cầu khi tôi đã thực sự thay đổi dữ liệu ở phía máy chủ, nhưng tôi có thể sai. Vì vậy, nói cách khác, bạn xác nhận rằng cứ 10 giây một lần, longpoll được đóng lại ngay cả khi không có gì để kéo, buộc nó kích hoạt một yêu cầu GET khác để mở lại nó? – airpaulg

+1

Yêu cầu longpoll có thời gian chờ (theo mặc định là 60 giây), sau đó thời gian sẽ được đặt lại nếu không có thay đổi. Đây là cấu hình trên cơ sở mỗi lần sao chép - xem http://docs.couchdb.org/en/latest/changes.html. –

+0

Trong trường hợp không có thay đổi cứ 10 giây một lần, điều đó có thay đổi tính toán chi phí có lợi cho việc sao chép liên tục vì thời gian chờ của longpoll khá dài? Ngoài ra, trong thực tế, sẽ không còn một thời gian chờ lâu hơn làm cho sao chép liên tục ít tốn kém? Các khía cạnh tiêu cực của thời gian chờ lâu hơn là gì? – airpaulg

Các vấn đề liên quan