2012-05-27 33 views
5

Nếu bạn có nút đang chạy và tôi có nút đang chạy, có bất cứ ai nhìn thấy một giải pháp mà sẽ cho phép chúng tôi để giữ một tập hợp các tập tin đồng bộ.Đồng bộ hóa tệp với node.js: unision == tcp == node ----- [http] ----- node == tcp == unison

Synchronization là phức tạp, vì vậy tôi nghĩ rằng có thể được để lại cho một công cụ như unison (đó là như rsync) và sau đó tất cả các nút sẽ phải làm là kết nối một ống TCP giữa người sử dụng chứng thực.

filesystem1---unision==tcp==node.js------[http]----node.js==tcp====unison---filesystem2 

Có lẽ khoảng 12 dòng mã JavaScript, nhưng ít điểm này đó là ngoài tôi, hoặc bất kỳ ví dụ tôi có thể tìm thấy, cho đến nay.

tôi đã xem xét một bó toàn bộ các tùy chọn khác đồng bộ hóa tập tin (như Git, tính xác thực, hóa thạch, trong đó có một tuần cố gắng cài đặt một máy chủ Simias iFolder trên Linux, thất bại ~ trông đầy hứa hẹn bởi vì nó bao gồm một filewatching khách hàng cho mỗi hệ điều hành lớn) nhưng bây giờ tôi đang nghĩ rằng một cái gì đó nhiều, đơn giản hơn nhiều có lẽ sẽ là đi.

Nếu ai đã nhìn thấy một dự án Node.js mà không như vậy, hoặc là ở một mức độ mà kết nối hai ống TCP là không phải là quá khó khăn, sau đó tôi sẽ đánh giá cao được nghe từ bạn

+0

Bạn có thể muốn có một cái nhìn tại Node.js thư viện ròng. Nó chứa các hàm cho phép bạn tạo các kết nối socket TCP tùy chỉnh. Hãy cho tôi biết nếu bạn cần thêm chi tiết cụ thể. http://nodejs.org/api/net.html#net_class_net_socket –

+0

Về biểu đồ của bạn, bạn có nghĩ đến việc sử dụng kết nối socket TCP đơn giản giữa hai thể hiện node.js không? Ví dụ: unision == tcp == node.js ------ [TCP Socket] ---- node.js == tcp ==== unison. Một cái gì đó nói với tôi nó có thể được dễ dàng hơn, như TCP socket là hai chiều, và http không phải là. –

Trả lời

0

Cách tiếp cận cơ bản tôi sẽ đưa đến vấn đề này là sử dụng stream2.
Cách tiếp cận cơ bản của tôi sẽ giống như thế này.

nhận được dữ liệu từ tcp đầu tiên

var gulp = require('gulp') 
, thr = require('through2') 
; 


gulp.watch('rootDirectory/**/*', function(evt) { 


    if ('deleted' === evt.type) { 
    // do stuff if file is deleted 
    return 
    } 

    // file got changed, moved or added. 
    gulp.src(evt.path).pipe(thr(chunk, enc, next){ 
    // chunk is a vinyl filesytem object, 
    // so better fix chunk before sending to tcp server 
    next(null, fixedChunk) 

    }).pipe(toYourTcpServer) 

}) 

sau đó tại nút của bạn

var net = require('net') 
, http = require('http') 
; 

var clientTcp = net.connect({port: 'toYourTcpServerPort'}) 

var server = http.createServer(function(req, res){ 
    clientTcp.pipe(res) 
}).listen('somePort') 

sau đó ở đầu bên kia, bạn làm ngược lại
tại nút

var clientTcp2 = net.connect({port: 'toYourTcpServerPort2'}) 

var server2 = http.createServer(function(req, res){ 
    // fix response or something else. 
    req.pipe(clientTcp2) 
}).listen('somePort') 

đến từ thứ hai tcp

gutil = require('gulp-util') 


clientTcp2.pipe(thr(function(chunk, enc, next){ 
    // You must create a vinyl filesystem before 
    // sending down stream. Use new gutil.File() 
    next(null, fixedChunk) 

})).pipe(gulp.dest('finalDirectoy')) 

through2 tạo luồng biến đổi và gulp giúp bạn tạo công việc với luồng. Các tệp vinyl chỉ là một trừu tượng được sử dụng bởi gulp.

Tôi hy vọng cung cấp cho bạn một ý tưởng về cách sử dụng con suối để giải quyết vấn đề may mắn của bạn

+0

dòng dưới cùng, tôi sẽ không sử dụng tất cả. –

+0

Nhưng điều này sẽ gửi toàn bộ tập tin cập nhật không chỉ là phần thay đổi bên phải (như rsync của unison sẽ)? – swennemen