java抢单功能_基于消息队列的高并发抢单功能实现方法与流程
本發明涉及嵌入式軟件中間件,具體涉及一種基于消息隊列的高并發搶單功能實現方法。
背景技術:
中間件是一種獨立的系統軟件或服務程序,分布式應用系統借助這種軟件在不同的技術之間共享資源,管理計算資源和網絡通訊。它在計算機系統中是一個關鍵軟件,它能實現應用的互連和互操作性,能保證系統的安全、可靠、高效的運行。中間件位于用戶應用和操作系統及網絡軟件之間,它為應用提供了公用的通信手段,并且獨立于網絡和操作系統。中間件為開發者提供了公用于所有環境的應用程序接口,當應用程序中嵌入其函數調用,它便可利用其運行的特定操作系統和網絡環境的功能,為應用執行通信功能。
RocketMQ是一款分布式、隊列模型的消息中間件,具有以下特點:
(1)能夠保證嚴格的消息順序;
(2)提供豐富的消息拉取模式;
(3)高效的訂閱者水平擴展能力;
(4)實時的消息訂閱機制;
(5)億級消息堆積能力;
MongoDB是一個基于分布式文件存儲的數據庫,由C++語言編寫,旨在為WEB應用提供可擴展的高性能數據存儲解決方案。具備高性能、易部署、易使用等特點。
主要功能特性有:
(1)面向集合存儲,易存儲對象類型的數據;
(2)模式自由;
(3)支持動態查詢;
(4)支持完全索引,包含內部對象;
(5)支持查詢;
(6)支持復制和故障恢復;
(7)使用高效的二進制數據存儲,包括大型對象(如視頻等);
(8)自動處理碎片,以支持云計算層次的擴展性;
(9)支持RUBY,PYTHON,JAVA,C++,PHP等多種語言;
(10)文件存儲格式為BSON(一種JSON的擴展);
(11)可通過網絡訪問;
如何有機結合消息隊列中間件及高速內存數據庫實現高并發搶單功能是嵌入式軟件領域當前一項研究熱點問題。
技術實現要素:
本發明所要解決的技術問題是:提出一種基于消息隊列的高并發搶單功能實現方法,基于消息隊列的特性,結合高速內存數據庫實現高可靠、高并發、易維護、分布式的搶單功能。
本發明解決其技術問題所采用的技術方案是:
作為一種實施例,本發明的基于消息隊列的高并發搶單功能的實現方法,包括加入搶單方法,所述加入搶單方法包括:
為需要參加搶單的業務劃分不同的類型,并設置對應的不同的優先級搶單隊列;
將需要參加搶單的業務根據其類型加入對應的優先級搶單隊列中;
如果加入成功,則保存入列記錄,如果加入失敗,則記錄失敗信息并保存到數據庫。
作為進一步優化,所述搶單隊列采用先進先出機制。
作為進一步優化,通過設置多個Topic來設置不同的優先級搶單隊列。
作為進一步優化,所述搶單業務的類型包括:預處理搶單、要素糾偏搶單、全圖糾偏搶單、規則檢查搶單、模擬記賬搶單、復核搶單。
作為進一步優化,所述保存入列記錄的方式為:采用異步刷盤方式結合內存數據庫,記錄已加入隊列的搶單業務,若發生程序中斷、服務器宕機事件,在重啟應用后自動從內存數據庫中讀取未消費的信息,自動加入隊列。
作為進一步優化,通過入列失敗信息表來記錄搶單業務加入失敗信息,對于第一次寫入失敗信息表的搶單業務,通過定時程序在定時時間到來時,再次將該搶單業務加入到隊列中,若仍然加入失敗,則通知人工干預。
作為另一種實施例,本發明的基于消息隊列的高并發搶單功能的實現方法,包括撤銷搶單方法,所述撤銷搶單方法包括:
通過創建撤銷記錄表來記錄需要撤銷的業務單,在進行搶單處理時,從搶單隊列中取出業務單,若該取出的業務單在撤銷記錄表中,則直接丟棄該業務單,從而達到撤銷該業務單的目的,若撤銷業務單失敗,則記錄撤銷業務單失敗信息,并保存到數據庫。
作為進一步優化,對于第一次保存的撤銷業務單失敗信息,通過定時程序在定時時間到來時,再次對業務單進行撤銷,若仍然撤銷業務單失敗,則通知人工干預。
作為第三種實施例,本發明的基于消息隊列的高并發搶單功能的實現方法,包括搶單方法,所述搶單方法包括:
采用多消費端的并發搶單方式,從搶單列表中取出業務單后,及時更新消費進度,然后查詢該業務單是否存在于撤銷記錄表中,若存在,則直接丟棄該業務單,然后從搶單列表中取出下一個業務單;若不存在于撤銷記錄表中,則繼續查詢該業務單對應的消費記錄,若已存在對應的消費記錄,則丟棄該業務單,若不存在對應的消費記錄,則在對業務單進行處理后在消費記錄表中保存對應的消費記錄。
作為進一步優化,該方法還包括:在對業務單進行處理時,若出現搶單異常狀況,則通過搶單異常信息表記錄這一狀況,通過定時程序在定時時間到來時,再次對該業務單進行處理,若仍然異常,則通知人工干預。
本發明的有益效果是:
基于消息隊列(Rocketmq)的特性,結合高速內存數據庫(Mongodb)實現高可靠、高并發、易維護、分布式的搶單功能:
1、加入搶單方法利用消息隊列特性和高速內存數據庫解決無序問題、解決優先級問題、解決多類型問題、解決可靠性問題以及解決加入失敗問題;
2、撤銷搶單方法利用內存數據庫實現消息隊列刪除功能;
3、搶單方法利用消息隊列特性和高速內存數據庫解決高并發下重復搶單問題、解決搶單隊列消息重復時重復搶單問題、解決搶單異常問題。
具體實施方式
本發明旨在提出一種基于消息隊列的高并發搶單功能實現方法,基于消息隊列的特性,結合高速內存數據庫實現高可靠、高并發、易維護、分布式的搶單功能。
在實現高并發搶單功能之前,需要進行以下工作:
1、安裝消息隊列(Rocketmq)服務,包括nameserver服務和mqbroker服務,安裝完成后修改相關配置,調整端口等信息;安裝內存數據庫(Mongodb)并修改相關參數,創建庫名為cscbase的數據庫。
2、創建入列失敗信息表(queue_fail_info)、入列記錄表(queue_snatch_info)、消費記錄表(queue_spending_info)、撤銷記錄表(queue_cancel_info)和搶單異常信息表(csc_message_info);
3、搭建java環境,分別開發加入搶單方法流程、撤銷搶單方法流程、搶單方法流程的功能代碼。
下面具體闡釋本發明中的基于消息隊列的高并發搶單功能實現:
一、加入搶單方法,即將需要參與搶單的業務加入到搶單隊列的實現方法,其包括:
為需要參加搶單的業務劃分不同的類型,并設置對應的不同的優先級搶單隊列;
將需要參加搶單的業務根據其類型加入對應的優先級搶單隊列中;
如果加入成功,則保存入列記錄,如果加入失敗,則記錄失敗信息并保存到數據庫。
通過本方法可以解決如下幾個問題:
(1)解決無序問題:消息隊列(Rocketmq)為采用先進先出(FIFO)機制可以嚴格的保證消息有序。應用中調用加入搶單方法時有序,則可確保搶單時有序。
(2)解決優先級問題:搶單存在優先級問題,如優先級高的業務先處理。Topic是消息中間件里一個重要的概念,每一個Topic代表了一類消息,有了多個Topic,就可以對消息進行歸類與隔離。因此利用Topic的這一特性,將不同優先級的業務搶單放入不同的Topic中,完美的解決了優先級問題。
(3)解決多類型問題:為減少程序復雜度及開發工作量,我們將多類型搶單業務(如預處理搶單、要素糾偏搶單、全圖糾偏搶單、規則檢查搶單、模擬記賬搶單、復核搶單等)共用搶單程序,利用消息隊列Topic和Tag進行歸類和隔離。
(4)解決可靠性問題:程序中斷,服務器宕機等突發狀況經常使已加入搶單池數據丟失,造成不可逆的災難。消息隊列(Rocketmq)所有發往broker的消息,有同步刷盤和異步刷盤機制。同步刷盤時,消息寫入物理文件才會返回成功,因此非??煽?#xff0c;但因為要寫入物理文件,效率稍受影響;異步刷盤時,消息寫入內存即返回成功,內存數據定時異步寫入物理文件,此方式效率高,但存在服務器宕機后數據丟失風險。本發明采用異步刷盤方式,并結合內存數據庫(Mongodb)技術,記錄所有已加入隊列的搶單業務。程序中斷,服務器宕機后,重啟應用自動從內存數據庫(Mongodb)中讀取未消費的消息自動重新加入隊列。
(5)解決加入失敗問題:加入搶單隊列時可能出現不可控異常,造成加入搶單隊列失敗,從而引起搶單丟失問題。本發明設計獨立的入列失敗信息表,一旦發生加入搶單異常,則寫入到此信息表中,定時程序重復執行指定次數后仍無法加入,則通知人工干預。
二、撤銷搶單方法,即對于已經加入搶單隊列的業務由于業務需要又從搶單隊列中刪除的方法,其包括:通過創建撤銷記錄表來記錄需要撤銷的業務單,在進行搶單處理時,從搶單隊列中取出業務單,若該取出的業務單在撤銷記錄表中,則直接丟棄該業務單,從而達到撤銷該業務單的目的,若撤銷業務單失敗,則記錄撤銷業務單失敗信息,并保存到數據庫。
由于消息隊列(Rocketmq)不能指定刪除隊列中的消息,因此本方法另辟蹊徑,利用內存數據庫(Mongodb)保存撤銷記錄,搶單時從隊列中取出搶單消息,若在撤銷記錄中,則不處理直接丟棄,從而達到刪除的目的,若撤銷業務單失敗,則記錄撤銷業務單失敗信息,并保存到數據庫,對于第一次保存的撤銷業務單失敗信息,通過定時程序在定時時間到來時,再次對業務單進行撤銷,若仍然撤銷業務單失敗,則通知人工干預。
三、搶單方法,即搶單時從搶單池中高效、穩定、準確取出業務信息的方法,其包括:采用多消費端的并發搶單方式,從搶單列表中取出業務單后,及時更新消費進度,然后查詢該業務單是否存在于撤銷記錄表中,若存在,則直接丟棄該業務單,然后從搶單列表中取出下一個業務單;若不存在于撤銷記錄表中,則繼續查詢該業務單對應的消費記錄,若已存在對應的消費記錄,則丟棄該業務單,若不存在對應的消費記錄,則在對業務單進行處理后在消費記錄表中保存對應的消費記錄。
通過本方法可以解決如下幾個問題:
(1)解決高并發下重復搶單問題:高并發搶單時,同一條業務信息會因為并發操作造成來不及修改搶單標志,從而被重復搶單。本方法通過及時更新消費進度并結合Java線程安全很好的解決了這一難題;為避免影響性能,本方法采用多消費端的方式進行搶單,大大提高搶單并發性。
(2)解決搶單隊列消息重復時重復搶單問題:由于業務或者程序原因,會導致部分業務信息重復加入到搶單隊列,如果不處理則會出現被搶多次的情況。本方法通過內存數據庫保存消費記錄完美解決這一問題。同時,內存數據庫高性能和分布式也為搶單方法的高性能奠定堅實基礎。
(3)解決搶單異常問題:搶單時可能出現不可控異常,造成隊列讀取成功但業務處理失敗,從而引起數據一致性問題。本發明設計獨立的搶單異常信息表,一旦發生搶單異常,則寫入到此信息表中,定時程序重新執行處理程序,若仍無法正常處理,則人工通知干預。
總結
以上是生活随笔為你收集整理的java抢单功能_基于消息队列的高并发抢单功能实现方法与流程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python找出录取率最高的年份_Pyt
- 下一篇: 司爱侠计算机英语教程第五版翻译,计算机英