2015-01-09 19 views
8

我遇到了客戶端無限循環崩潰Meteor服務器的情況。無限循環是我會解決的一個錯誤,而不是這個問題的主題。我擔心的是,惡意用戶可能會創建自己的無限循環並導致Meteor服務器崩潰。如何保護我的Meteor服務器免受客戶端上無限循環的影響?

問題的無限循環重複撥打電話Meteor.subscribe(...)Meteor.call(...)。看起來這些請求正在服務器上排隊等待失效,即使客戶的意圖是放棄它們。有沒有辦法告訴服務器該請求已被放棄並將其從隊列中移除?

我想這不會保護服務器免受連續數千次請求而不放棄它們的客戶端的影響,所以如果任何人有答案,這個問題就會取代這個問題。我如何限制單個客戶端可以發出的請求數量?

在這些APM圖表中,您可以看到無限循環如何影響性能。我在大約13:17開始了它,並在13:25這個應用程序崩潰了(由於超過了它的內存配額,Heroku終止了)。

Meteor APM charts - kadira.io - client infinite loop causes server crash

+1

你看看大氣層的限速/節流包嗎? https://atmospherejs.com/?q=limit – 2015-01-21 16:10:38

回答

1

當Meteor.subscribe被調用時,Meteor.publish功能在服務器上執行。因此,您可以在發佈功能中決定不提供數據。

這取決於您是否希望用戶登錄或不提供數據。如果您希望用戶登錄,則可以創建一個集合,並使用所使用的用戶標識註冊對發佈功能的任何調用(即任何客戶端訂閱請求)。每當記錄用戶嘗試訂閱並檢查此用戶最近是否發出多個請求時,您都會問這個集合。如果這個客戶端命中你已定義的請求配額,你可以返回null。

通過使用https://github.com/gadicc/meteor-headers軟件包並註冊IP地址,您可以對未登錄的用戶執行相同的操作。

您可以在客戶端meteor.call()重複調用的服務器方法中執行相同的操作。

我認爲在這個數據庫中檢查(因爲只有最近的連接必須保存在數據庫中才能保持小型數據庫),並且決定提供數據還是不需要每次提供數據的時間。

我希望這會有所幫助。

+0

謝謝,雨果。所以基本上......什麼@Serkan說。使用速率限制/限制包。 – colllin 2015-02-03 00:21:02

相關問題