2013-07-23 15 views
8

Tôi thực sự đang chơi đùa với Meteor một chút, nhưng tôi nhận ra rằng tôi vẫn thiếu một số (hoặc rất nhiều) hiểu về chủ đề này.Bối rối về Meteor: cách gửi dữ liệu tới tất cả các máy khách mà không cần ghi vào cơ sở dữ liệu?

Ví dụ, đây là một hướng dẫn sử dụng Node.js/bày tỏ/socket.io để thực hiện một đơn giản real-time chat: http://net.tutsplus.com/tutorials/javascript-ajax/real-time-chat-with-nodejs-socket-io-and-expressjs/

Trong đó ví dụ trên, thông qua socket.io, máy chủ web nhận được một số và chuyển nó lên tất cả các máy khách được kết nối - tất cả đều không có bất kỳ truy cập cơ sở dữ liệu nào.

Với Meteor, trong tất cả các ví dụ mà tôi đã thấy, khách hàng được cập nhật bằng cách viết cho mongodb, sau đó cập nhật tất cả các máy khách. Nhưng nếu tôi không cần phải ghi dữ liệu vào cơ sở dữ liệu thì sao? Nó có vẻ như một bước đắt tiền để truyền dữ liệu cho tất cả khách hàng.

Tôi chắc chắn tôi đang thiếu thứ gì đó ở đây. Điều gì sẽ là cách Meteor cập nhật tất cả các khách hàng (nói, giống như với một ứng dụng trò chuyện đơn giản), nhưng mà không cần chi phí bằng văn bản cho một cơ sở dữ liệu đầu tiên?

Cảm ơn bạn!

Trả lời

10

Hiện tại, không có cách chính thức để gửi dữ liệu cho khách hàng mà không cần ghi dữ liệu vào bộ sưu tập. Đó là một mẹo nhỏ trong thiên thạch vì bước gửi dữ liệu tới nhiều máy khách khi không có nơi viết để xuất phát khi nhiều thiên thạch được sử dụng cùng nhau. Các mặt hàng được gửi từ một thiên thạch sẽ không đến với khách hàng đã đăng ký với nhau.

Có một giải pháp tạm thời bằng cách sử dụng Luồng sao băng (http://meteorhacks.com/introducing-meteor-streams.html) có thể cho phép bạn thực hiện những gì bạn muốn mà không cần ghi vào cơ sở dữ liệu trong khi đó.

Ngoài ra còn có một cuộc thảo luận khá rộng rãi về điều này trên thiên thạch nói chuyện (https://groups.google.com/forum/#!topic/meteor-talk/Ze9U9lEozzE) nếu bạn muốn hiểu một số chi tiết kỹ thuật. Điều này sẽ thực sự trở thành có thể khi nhánh liên kết được hợp nhất thành master, đối với một máy chủ đơn lẻ

Đây là một cách để có một bộ sưu tập ảo, nó không hoàn hảo nhưng có thể làm cho đến khi Meteor có cách đánh bóng hơn nó đã xong.

Meteor.publish("virtual_collection", function() { 
    this.added("virtual_coll", "some_id_of_doc", {key: "value"}); 

    //When done 
    this.ready() 
}); 

Sau đó đăng ký này trên máy khách:

var Virt_Collection = new Meteor.Collection("virtual_coll"); 
Meteor.subscribe("virtual_collection"); 

Sau đó, bạn có thể chạy này khi đăng ký hoàn tất:

Virt_Collection.findOne(); 
=> { _id: "some_id_of_doc", key: "value"} 

Đây là một chút lộn xộn nhưng bạn cũng có thể móc vào đó để cập nhật hoặc xóa bộ sưu tập. Ít nhất theo cách này mặc dù bạn sẽ không sử dụng bất kỳ plugin hoặc gói nào.

Xem: https://www.eventedmind.com/posts/meteor-how-to-publish-to-a-client-only-collection để biết thêm chi tiết và ví dụ về video.

+0

Cảm ơn bạn. Tôi thực sự tốt với cách Meteor xử lý mọi thứ, nhưng có vẻ như truy cập cơ sở dữ liệu sẽ phải chịu một số lần truy cập hiệu suất. Để chính xác hơn, tôi đang cố tạo một trò chơi HTML5 rất đơn giản với Meteor và KineticJS. Tôi có nhiều người chơi kiểm soát hình đại diện của họ trên màn hình và gửi vị trí của mỗi người chơi thông qua mongodb. Phương pháp này dường như có một số lần truy cập hiệu suất. Vì vậy, tôi đã tự hỏi nếu đó là bước bổ sung của truy cập db đó là để đổ lỗi. – kurisukun

6

Chức năng xuất bản trên máy chủ gửi dữ liệu cho khách hàng. Nó có một số phím tắt tiện lợi để xuất bản kết quả truy vấn từ cơ sở dữ liệu nhưng bạn không phải sử dụng chúng. Hàm publish có this.added(), this.removed(), và this.changed() cho phép bạn xuất bản bất cứ thứ gì bạn chọn. Khách hàng sau đó đăng ký và nhận dữ liệu đã xuất bản.

Ví dụ:

if (Meteor.isClient){ 
    var someMessages = new Meteor.Collection("messages"); //messages is name of collection on client side 
    Meteor.subscribe ("messagesSub"); //messagesSub tells the server which publish function to request data from 

    Deps.autorun(function(){ 
    var message = someMessages.findOne({}); 
    if (message) console.log(message.m); // prints This is not from a database 
    }); 
} 

if (Meteor.isServer) { 
    Meteor.publish("messagesSub", function(){ 
    var self = this; 
    self.added ("messages", "madeUpId1", { m: "This is not from a database"}); //messages is the collection that will be published to 
    self.ready(); 
    }); 
} 

Có một ví dụ trong tài liệu sao băng giải thích here và một ví dụ khác here. Tôi cũng có an example chia sẻ dữ liệu giữa các khách hàng mà không bao giờ sử dụng cơ sở dữ liệu chỉ để dạy bản thân cách xuất bản và đăng ký hoạt động. Không có gì được sử dụng mà là thiên thạch cơ bản.

+1

Ví dụ hay. Đáng chú ý là cả hai ví dụ này và Akshat là không phản ứng: họ gửi dữ liệu tĩnh cho khách hàng mà sẽ không thay đổi. Nhưng ấn tượng, Meteor có thể xuất bản [đăng ký phản hồi không phải db] (http://stackoverflow.com/questions/10565654/how-does-the-messages-count-example-in-meteor-docs-work), nếu bạn không Đừng bận tâm thêm một chút. – joeytwiddle

1

Có một cách! Ít nhất về mặt lý thuyết Giao thức được Meteor sử dụng để đồng bộ giữa máy khách và máy chủ được gọi là DDP. Thông số kỹ thuật là here

Và mặc dù có một số ví dụ herehere của những người triển khai ứng dụng DDP của riêng họ, tôi e ngại không thấy ví dụ về triển khai máy chủ DDP. Nhưng tôi nghĩ rằng giao thức rất đơn giản và có thể sẽ không khó thực hiện.

+0

Bạn sẽ ngạc nhiên, DDP không được tài liệu đủ tốt, ít nhất là không rõ ràng. Nếu bạn sử dụng các giá trị 'số' cho các ID phương thức, nó sẽ không thành công; họ phải là dây. Vv, cùng với các sắc thái không có giấy tờ khác. – trusktr

3

Có thể sử dụng gói sống của Meteor (triển khai DDP của họ) mà không cần một cơ sở dữ liệu trên máy chủ. Đây là demoed by Avital Oliver và dưới đây tôi sẽ chỉ ra phần thích hợp.

Sự kỳ diệu sẽ xảy ra ở đây:

if (Meteor.isServer) { 
    TransientNotes = new Meteor.Collection("transientNotes", {connection: null}); 
    Meteor.publish("transientNotes", function() { 
     return TransientNotes.find(); 
    }); 
} 

if (Meteor.isClient) { 
    TransientNotes = new Meteor.Collection("transientNotes"); 
    Meteor.subscribe("transientNotes"); 
} 

Thiết connection: null xác định không có kết nối (xem tài liệu Meteor).


Akshat đề xuất sử dụng luồng. Tôi không thể trả lời bình luận của anh ấy vì thiếu uy tín, vì vậy tôi sẽ đưa nó vào đây. Gói mà anh ta liên kết không còn được duy trì (xem tác giả của tweet). Tôi khuyên bạn nên sử dụng gói yuukan: streamy (look it up on Atmosphere) thay vào đó hoặc sử dụng SockJS lib cơ bản được sử dụng trong chính Meteor - bạn có thể tìm hiểu cách thực hiện điều này bằng cách xem mã Meteor và xem Meteor.server.Stream_server, và Meteor.connection._stream được sử dụng, đó là những gì gói Streamy làm.

Tôi đã thử nghiệm việc triển khai ví dụ trò chuyện Streamy và thấy hiệu suất có thể khác nhau một cách không đáng kể nhưng điều này chỉ là trên các thử nghiệm thô sơ. Sử dụng phương pháp tiếp cận đầu tiên bạn nhận được lợi ích của việc thực hiện minimongo (ví dụ: tìm kiếm) và phản ứng Meteor. Khả năng phản ứng có thể với Streamy, mặc dù là thông qua những thứ như sử dụng ReactiveVar's.

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