在我們公司,我們有一個分佈在少數實例中的服務器。服務器處理用戶請求。可以並行處理來自不同用戶的請求。應該強烈地按順序執行來自同一用戶的請求。但由於平衡,他們可以到達不同的實例。目前我們使用基於Redis的分佈式鎖,但這很容易出錯,需要更多的關於併發性的工作,而不是業務邏輯。大量的單線程任務隊列
我想是這樣的(更像是一個概念):
- 爲每個用戶
- 隊列用戶ID命名的鮮明隊列
- 通過請求ID標識的每個請求
想象一下,來自同一用戶的兩個請求同時到達兩個不同的實例:
- 每個實例將其請求標識放入此用戶隊列中。
- 另外,它們都在本地存儲它們的請求ID。
- 那麼一些券商採取從「some_user_queue」頂部請求ID,並將其移動到「some_user_queue_processing」
- 兩個實例監聽「some_user_queue_processing」。他們偷看它,看看這是否是他們本地存儲的請求ID。如果是,那麼請處理。如果不是,那麼忽略並等待。
- 工作完成後,服務器將此ID從「some_user_queue_processing」中刪除。
- 然後再次執行步驟3。
而這一切對於很多同時發生(幾千條)不同的用戶(以及他們的隊列)的。
現在,我知道這聽起來很像的演員,但:
- 我們需要的解決方案需要的微小變化可能使從鎖的快速轉換。阿卡會迫使我們從頭開始重寫幾乎所有的東西。
- 我們需要生產準備解決方案。類星體聽起來不錯,但尚未準備好生產(更準確地說,它們的Galaxy系列)。
- 我工作的頂部非常保守,他們根本不想要我們需要支持的另一個依賴。但是我們已經使用Redis(用於分佈式鎖),所以我想也許它可以幫助解決這個問題。
感謝
也許您可以評估Hazelcas對分佈式鎖的支持,請參閱http://hazelcast.org/#lock。 –
假設粘性會話,它的簡單寫一個[dispatch queue](http://stackoverflow.com/questions/29889885/java-divide-incoming-work-uniformly-via-hashing-in-multithreaded-evnironments/29893297#29893297 )在Java 8中。 –
你能告訴我,如果我的答案是你實際需要的嗎? –