2017-01-23 131 views
1

我用流星發佈和訂閱的方法與客戶端和服務器交互。現在根據我的場景,我使用D3 js生成條形圖,只要數據輸入到mongo db集合中,我就使用客戶端功能生成條形圖。我的問題是發佈和訂閱太慢而無法做出反應。即使我限制了mongodb返回的文檔數量,問題仍然存在。它也不一致,即它有時會在1秒內反應,而其他時間會需要4-5秒。請指導我做什麼和我的實施出了什麼問題。流星js發佈和訂閱的反應很慢

這裏是服務器端的代碼,

Test = new Mongo.Collection("test") 

Meteor.publish('allowedData', function() { 
    return Test.find({}); 
}) 

,這裏是客戶端代碼,

Test = new Mongo.Collection("test") 
Meteor.subscribe('allowedData'); 
Meteor.setTimeout(function() { 
    Test.find().observe({ 
    added: function(document){ 
     //something 
    }, 
    changed:function(){ 
     //something 
    }, 
    removed:function(){ 
     //something 
    }, 
    }) 
+0

我認爲從一般文件導入'Test'更優雅 – API

+0

您是否檢查了TimeLine(在Chrome瀏覽器中)以查看每個操作的加載時間? – API

+0

感謝您的評論。不,我沒有檢查TimeLine。我沒有明白你的意思,「我認爲從一般文件導入測試更加優雅」 – LearningNew

回答

1

從你的意見,我看你需要一個報告圖表是反應性的。儘管這是你的要求,但是像這樣的圖表太昂貴了。事實上,當你的系統變得越來越大時,假設你在一張圖表上有大約10000個文檔,這種圖表會頻繁地崩潰你的服務器。

要解決這個問題,我有兩個建議:

  • 定義一個圖表返回數據的方法。在客戶端設置一個作業/間隔定時器,定期調用該方法。間隔值取決於你的需要,對圖表來說10秒鐘應該沒問題。這種方式並沒有完全反應,你只能在一段時間後得到最新的數據,但它仍然比慢速和崩潰頻繁的系統要好。你可以找到好的模塊來管理作業/計時器here
  • 使用這個流星包meteor-publish-join(免責聲明:我是作者),它是爲了解決您遇到的問題:需要對大數據集進行反應性聚合/連接,並且仍然具有良好的整體性能
+0

非常感謝您的回答。至於你的第一個選擇,我認爲是相同的,但我不允許這樣做。但我一定會看看你的第二個選擇。 – LearningNew