java怎么處理高并發(fā) 高并發(fā)用消息隊列會延遲,還有什么好方法解決?
高并發(fā)用消息隊列會延遲,還有什么好方法解決?首先,您需要知道隊列的應(yīng)用場景在哪里。一般來說,當后臺需要大量的邏輯處理或計算資源時,隊列也可以改善前端的用戶體驗。例如:微博-關(guān)注/粉絲。如果你有1000
高并發(fā)用消息隊列會延遲,還有什么好方法解決?
首先,您需要知道隊列的應(yīng)用場景在哪里。一般來說,當后臺需要大量的邏輯處理或計算資源時,隊列也可以改善前端的用戶體驗。例如:微博-關(guān)注/粉絲。如果你有1000個粉絲,你發(fā)一個微博,1000個粉絲就會收到你的消息。消息隊列適合這種情況。原因:1。推送1000個動態(tài)數(shù)據(jù)是一個耗時的操作,發(fā)送微博頁面需要盡快響應(yīng),這樣就可以將任務(wù)放入隊列中。微博發(fā)送后,會立即生效,但允許粉絲延遲接收微博,通過隊列實現(xiàn)也滿足需求;3.隊列處理可以采用高性能集群架構(gòu)。架構(gòu)實現(xiàn)了關(guān)注點的分離,系統(tǒng)擴展更加靈活
如果需要根據(jù)數(shù)據(jù)量和業(yè)務(wù)復(fù)雜度綜合評估硬件級別,建議購買兩臺云主機(4核8g內(nèi)存)構(gòu)建集群環(huán)境。之后將根據(jù)實際需要進行擴建。
軟件級別:
1。如果是寫操作,應(yīng)該:
1.1使用消息隊列進行異步處理(如ActiveMQ等),避免消息阻塞
1.2使用mongodb的批寫功能,如每1000條數(shù)據(jù)寫一次
2。Mongodb以集群方式部署,可以分散壓力
3。如果是讀操作,可以考慮添加redis來緩存熱數(shù)據(jù)
消息中間件不會丟失消息,主要從以下幾個方面來考慮
1。生產(chǎn)者關(guān)閉
情況是這樣的,在你的生產(chǎn)的同時,生產(chǎn)者必須將消息推送到消息中間件進行異步處理。此時,如果生產(chǎn)者掛斷,消息數(shù)據(jù)將不會被推入消息中間件,并且會發(fā)生數(shù)據(jù)不一致。
在生產(chǎn)者推送之后,將標志位設(shè)置為已交付。另外,啟動一個計時任務(wù)來檢測是否有消息未被傳遞,并確保消息數(shù)據(jù)將進入中間件。
2. 消息重試
消息中間件存儲在磁盤上。存儲在磁盤上的消息不會丟失,磁盤文件也會備份。如果丟失了一個,可以通過備份文件來恢復(fù)。
同樣,會導致重復(fù)消費,這就需要考慮消費的冪等性,可以做消費記錄,防止重復(fù)消費。