2016-10-11 38 views
1

雖然我有一些想法(IPC,用mysql堆表,內存緩存)無我的想法似乎是工作的「完美」。如何performantely拒絕點大的請求(基於PHP API)

我尋找一種方式來阻止來自同一用戶的PHP腳本的任何點大的訪問。
所有訪問我的腳本的用戶都會在每次通話時提供一個用戶ID,所以我知道打開門之前誰敲門。
但是,可能會發生這樣的情況:用戶會將我的API從地獄中「剔除」,我不希望任何人都可以在之前的「API調用」未完成時訪問腳本。

我需要較低的系統影響,並沒有任何比賽條件(即使請求來在毫秒之內或更快無瑕處理)的東西。

你是如何解決類似的問題,我會很高興的建議或信息。

平臺是Linux。

更新:
我到目前爲止拒絕使用數據庫,因爲我害怕每秒發送數千次更新或類似查詢可能會使服務器停頓,即使單一影響較低。
有時,訪問我的API的用戶工具有問題,只是用大量查詢來轟炸它,我希望如果通過我的數據庫處理它,性能會受到影響。

+0

這是我的想法,我不確定它是否正確。您可以創建一個access_token並設置一個生命週期。如果他們想使用你的API,他們應該應用一個access_token。 – lighter

+0

如果你有一個數據庫 - 你可以使用它提供的悲觀鎖定機制。 – zerkms

+0

考慮到數據庫,但我認爲這是我認爲的最「重」的解決方案之一。 我可以「更新」這是原子,然後檢查它是否工作。 我不喜歡這樣的想法:如果某人的腳本發瘋,那麼每秒鐘可能會有數千次額外的「更新」爆炸我的數據庫連接 – John

回答

3

如果我是你的情況,我可能會用Redis的開始。 Redis相當不錯,性能可能不錯。

特別,我會看的SETNX命令。我會在短時間內讓密鑰過期(所以如果你的PHP代碼不存在並且不能刪除密鑰,那麼你的客戶不會無限期地被鎖定)。

一旦我有這樣的工作,並說服自己它會表現不錯,我會按照上述鏈接頁面上的建議,並看看distributed locks

+0

我喜歡那個db,看起來很酷。 但不知道如果我想添加另一個依賴項的系統。 我希望有一個不需要額外包的好解決方案。 但是,Redis看上去很整潔 – John

+0

Redis是一個非常輕的依賴項,並且具有巨大的實用性。如果你不想添加一個依賴項,你可以嘗試將鎖定文件寫入磁盤,但它很快就會變得複雜,並有可能出現競態條件,可能很慢,並且不能擴展到一個盒子之外。現在,我幾乎總是假定一個redis依賴項,因爲它對於很多事情都很有用(它是一個緩存!它是一個隊列!你可以做一個互斥體!等等......) – timdev