2014-10-30 28 views
0

我有一個服務系統從另一個系統獲取請求。請求包含存儲在服務系統的MySQL數據庫中的信息。一旦收到請求,服務器應該啓動一個定時器,如果時間已過,定時器將向發送者發送一條FAIL消息。C++/MySQL中的多個定時器

問題是,它是一個動態系統,可以從相同或不同來源獲取多個請求。如果從超時限制爲5分鐘的源接收到請求,並且僅在2分鐘後來自同一個源的另一個請求,則它應該能夠處理這兩個請求。因此,需要爲每個傳入消息啓用計時器。該服務是一種用C++編程的Web服務,信息存儲在MySQL數據庫中。

任何想法我可以做到這一點?

+1

或者你也許可以在每個傳入的請求上加上一個時間標記,並使用一個定時器來定期檢查哪些請求已經超時了? – Galik 2014-10-30 17:56:36

回答

1

一種我經常見到的方式:使用單個計時器,並保持每個超時的優先級隊列(按目標時間排序)。通過這種方式,您始終知道需要等待下一次超時的時間,並且您沒有與同時管理數百個定時器相關的開銷。

說在時間0你得到的100

Queue: [100]

超時請求您設定定時器在百秒火。

然後在時間10你會得到一個新的要求與50

Queue: [60, 100]

超時您取消計時器,並設置它在50秒內射擊。

當它觸發時,它會處理超時,從隊列中刪除60,看到下一次是100,並將計時器設置爲在40秒內觸發。假設你得到另一要求用100超時,在時間80

Queue: [100, 180]

在這種情況下,由於隊列的頭部(100)不會改變,你不需要重置計時器。希望這個解釋能讓算法變得非常清晰。

當然,隊列中的每個條目都需要鏈接到與超時相關的請求,但我想應該很簡單。

但請注意,這可能是不必要的,這取決於您用於定時器的機制。例如,如果你在Windows上,你可以使用CreateTimerQueue,我想在內部使用相同(或非常相似)的邏輯。

+0

感謝您的好評!我決定給傳入的請求添加時間戳,並將當前時間與他們的時間戳進行比較,以查看他們是否超時。所以你要爲每個條目的每個主循環進行一次檢查。 – 2014-10-31 08:13:34