我正在重新開發一個系統,通過http發送消息給衆多供應商之一。原來是perl腳本,很可能重新開發也會使用perl。要叉還是不叉?
在舊系統中,有許多perl腳本同時運行,每個供應商有五個腳本。將消息放入數據庫時,會選擇一個隨機線程號(1-5)和供應商,以確保沒有消息被處理兩次,同時避免鎖定表/行。此外,數據庫中還有一個「公平隊列位置」字段,用於確保發送大郵件時不會延遲大郵件發送時發生的小發送。
在某些時候,每分鐘只會有幾條消息,但在其他時候會有潛在的數十萬條消息轉儲。在我看來,像所有的腳本一直在運行和檢查消息的資源浪費,所以我試圖找出是否有更好的方法來做到這一點,或者如果舊的方式是可以接受的。
我現在的想法是有一個腳本根據需要運行多少子進程並根據需要分配儘可能多的子進程(但最大限度),但我不確定如何最好地實現它使得每個消息只處理一次,而公平排隊得到維護。
我現在最好的猜測是,父腳本更新數據庫以指示哪個子進程應該處理它,但是我擔心這會比原來的方法效率低。我幾乎沒有寫分叉代碼的經驗(上次我做了大約15年前)。
有關如何最佳處理消息隊列的指南的任何想法或鏈接表示讚賞!
你看過Gearman或其他任何一臺工作服務器嗎? – jshy