[發明專利]云詳單查詢管理系統及方法有效
| 申請號: | 201610922026.0 | 申請日: | 2016-10-21 |
| 公開(公告)號: | CN106649530B | 公開(公告)日: | 2020-12-15 |
| 發明(設計)人: | 劉健;吳鑌;姜科 | 申請(專利權)人: | 北京卡拉卡爾科技股份有限公司 |
| 主分類號: | G06F16/2453 | 分類號: | G06F16/2453;G06F16/2458;G06F16/27 |
| 代理公司: | 北京市盛峰律師事務所 11337 | 代理人: | 席小東 |
| 地址: | 100029 北京市朝陽區北辰*** | 國省代碼: | 北京;11 |
| 權利要求書: | 查看更多 | 說明書: | 查看更多 |
| 摘要: | |||
| 搜索關鍵詞: | 云詳單 查詢 管理 系統 方法 | ||
1.一種云詳單查詢管理系統,其特征在于,包括:詳單文件管理模塊、接口服務模塊、數據路由模塊和數據存儲模塊;
詳單文件管理模塊,用于接收外部系統上傳的新的詳單文件,讀取到所述新的詳單文件的詳單文件內容;然后,向所述接口服務模塊發送數據寫入指令;其中,所述數據寫入指令中攜帶有所述詳單文件內容;
接口服務模塊,分別與所述詳單文件管理模塊以及外部詳單查詢系統對接,用于接收所述詳單文件管理模塊下發的數據寫入指令,解析到需要被寫入的詳單文件內容;然后,根據所述詳單文件內容生成詳單寫入請求,將所述詳單寫入請求下發到所述數據路由模塊;
或者,用于接收所述外部詳單查詢系統發送的詳單查詢指令,從所述詳單查詢指令中解析到詳單查詢參數,根據所述詳單查詢參數生成詳單查詢請求,并將所述詳單查詢請求下發到所述數據路由模塊;
數據路由模塊,用于預制定數據路由策略,接收來自于所述接口服務模塊的詳單操作指令;其中,所述詳單操作指令包括詳單寫入請求或詳單查詢請求;然后,根據所述數據路由策略,對所述詳單操作指令中的數據進行數據特征提取,并根據數據特征查找到對應的數據存儲模塊,最后將詳單操作指令傳輸給相對應的數據存儲模塊;
數據存儲模塊,用于接收來自于所述數據路由模塊的詳單操作指令,并執行對應的操作;即:當接收到來自于所述數據路由模塊的詳單寫入請求時,寫入并存儲詳單數據;當接收到來自于所述數據路由模塊的詳單查詢請求時,根據所述詳單查詢參數,查詢到對應的詳單數據,并將查詢到的詳單數據返回給所述外部詳單查詢系統;
所述數據存儲模塊的靜態主體結構包括讀寫內存表、只讀內存表、log文件以及CCTable文件;其中,所述讀寫內存表和所述只讀內存表位于內存中;所述log文件以及所述CCTable文件位于磁盤上;
所述數據存儲模塊采用以下方法寫入數據:
(1)當所述數據存儲模塊需要寫入一條Key:Value記錄的時候,所述數據存儲模塊首先將所述Key:Value記錄寫入到所述log文件;
(2)所述讀寫內存表中Key:Value對是根據Key大小有序存儲的,因此,在將Key:Value記錄成功寫入到所述log文件后,所述數據存儲模塊再將所述Key:Value記錄寫入到所述讀寫內存表中的對應位置,以保證所述讀寫內存表中存儲數據的有序性;
(3)如此不斷循環,實現所述讀寫內存表和所述log文件的一致性;當所述讀寫內存表寫入的數據占用內存到達設定界限后,所述數據存儲模塊生成新的Log文件和新的讀寫內存表;原先的讀寫內存表轉為只讀內存表,所述只讀內存表指:只能進行讀操作,不能進行寫入操作或者刪除操作;后續當需要寫入新的Key:Value記錄時,將新的Key:Value記錄分別被寫入所述新的Log文件和新的讀寫內存表;
(4)數據存儲模塊將所述只讀內存表中存儲的數據導出到所述磁盤并進行壓縮操作后,形成一個新的CCTable文件;其中,所述CCTable文件為層級結構,第一層為Level 0、第二層為Level 1、依此類推,其層級逐漸增高;所述CCTable文件所存儲的記錄是根據記錄的Key由小到大排列的;
所述數據存儲模塊采用以下方法查詢數據:
(1)所述數據存儲模塊首先查看內存中的讀寫內存表,判斷所述讀寫內存表中是否包含key及其對應的value,如果包含,則返回value值即可;如果不包含,則執行步驟(2);
(2)所述數據存儲模塊查看內存中的只讀內存表,判斷所述只讀內存表中是否包含key及其對應的value,如果包含,則返回value值即可;如果不包含,則執行步驟(3);
(3)所述數據存儲模塊查看磁盤中的多個CCTable文件,對于每個CCTable文件,由于其為層級結構,因此,首先查找屬于level 0的文件,如果查找到所需的key及其對應的value,則返回value值即可;如果未查找到,則查找屬于level1的文件,如此循環往復,直到在某層CCTable文件中查找到所需要的key及其對應的value為止;
所述數據存儲模塊查詢數據時,當所述讀寫內存表和所述只讀內存表中均不存在需要查詢的key及其對應的value時,采用以下方法查詢:
(a)所述數據存儲模塊預建立Table緩存和Block緩存;其中,所述Block緩存用于緩存上一次返回給用戶的key及其對應的value;所述Table緩存用于緩存分別指向CCTable文件中不同block區域的文件指針以及Block緩存的位置信息;
(b)當所述數據存儲模塊接收到用戶發出的讀取請求時,所述讀取請求中攜帶有目標key;
(c)所述數據存儲模塊首先查詢所述Block緩存,判斷所述Block緩存中是否存在所述目標key,如果存在,則查找到與所述目標key對應的目標value,并向所述用戶返回所述目標value,結束流程;如果不存在,則執行步驟d;
(d)所述數據存儲模塊查詢所述Table緩存中的文件指針,獲得包含所述目標key的文件指針,然后,根據所述文件指針的指向,查找到所述CCTable文件中對應的一個block區域數據;
然后,所述數據存儲模塊根據所述Table緩存中的Block緩存的位置信息,定位到Block緩存,再將所述block區域數據傳輸到所述Block緩存;
(e)所述數據存儲模塊查詢所述Block緩存,判斷所述Block緩存中是否存在所述目標key,如果存在,則查找到與所述目標key對應的目標value,并向所述用戶返回所述目標value,結束流程;如果不存在,則執行步驟f;
(f)所述數據存儲模塊從磁盤的CCTable文件中查找與所述目標key對應的目標value,然后,將所述目標key及對應的所述目標value插入到Block緩存;
(g)返回步驟c;
其中,所述外部系統為詳單計費系統;
其中,所述接口服務模塊還用于:在接收到所述詳單文件管理模塊下發的數據寫入指令,或者,在接收到所述外部詳單查詢系統發送的詳單查詢指令時,首先進行安全性驗證,只有安全驗證通過后,再進行后續數據解析操作;
其中,所述安全性驗證包括兩種:
第一種,對來源地址和身份進行合法性驗證;
第二種,針對特定來源設定接口調用的頻度限制,然后,驗證特定來源接口調用的頻度是否超過設定值,如果超過,則為頻繁異常的調用,進行屏蔽處理;如果未超過,則通過驗證;
其中,所述詳單文件管理模塊、所述接口服務模塊、所述數據路由模塊和所述數據存儲模塊均作為獨立的服務運行于不同的服務器節點,或者部署在同一臺服務器上;
所述詳單文件管理模塊、所述接口服務模塊、所述數據路由模塊和所述數據存儲模塊均可運行于物理x86服務器環境或者虛擬化/云服務器環境;
所述詳單文件管理模塊、所述接口服務模塊、所述數據路由模塊和所述數據存儲模塊均支持多節點同時部署運行,支持系統冗余備份;
所述詳單文件管理模塊、所述接口服務模塊、所述數據路由模塊和所述數據存儲模塊在進行多節點部署時,在前端配置負載均衡設備,負載均衡設備根據各個節點的負載,分發詳單操作指令;
數據存儲模塊的靜態主體結構還包括Current文件和Manifest文件;所述Current文件和所述Manifest文件位于磁盤上;
(4.1)日志文件
日志文件在系統中用于系統崩潰恢復時不丟失數據;數據存儲模塊在寫入內存前,首先將操作記錄到Log文件中,然后再記入內存中;因此,即使系統崩潰,讀寫內存表中的數據沒有來得及轉存到磁盤的CCTable文件,數據存儲模塊也根據log文件恢復內存的讀寫內存表數據結構內容,不會造成系統丟失數據;
對于一個log文件,數據存儲模塊會將其切割成以32K為單位的物理Block,每次以一個Block作為基本讀取單位,log文件由3個Block構成,在物理布局上,一個log文件由連續的32K大小Block構成;
在應用中看不到Block,看到的是一系列的Key:Value對,在數據存儲模塊內部,會將一個Key:Value對看做一條記錄的數據,在這個數據前增加一個記錄頭,用來記載管理信息,以方便內部處理;
(4.2)CCTable文件
數據存儲模塊中存在不同層級的CCTable文件,所有CCTable文件內部布局都是一樣的;CCTable文件內部是根據記錄的Key由小到大排列的;每個Block分為三個部分,包括:數據存儲區、Type區和CRC區;其中,Type區用于標識數據存儲區是否采用了數據壓縮算法,CRC區是數據校驗碼,用于判別數據是否在生成和傳輸中出錯;
將CCTable文件劃分為數據存儲區和數據管理區,其中,數據存儲區存放實際的Key:Value數據,數據管理區則提供索引指針管理數據,以查找相應的記錄;數據存儲區和數據管理區都是基于分塊原理進行存儲數據;索引指針管理數據分為四種不同類型: MetaBlock、 MetaBlock 索引和數據索引塊以及一個文件尾部塊;
(4.3)讀寫內存表和只讀內存表
數據存儲模塊,所有Key:Value數據都是存儲在讀寫內存表、只讀內存表和CCTable中的,只讀內存表從結構上講和讀寫內存表是完全一樣的,區別在于只讀內存表是只讀的,不允許寫入操作,而讀寫內存表則是允許寫入和讀取的;
當讀寫內存表寫入的數據占用內存到達指定數量,則自動轉換為只讀內存表,等待轉存到磁盤中,系統會自動生成新的讀寫內存表供寫操作寫入新數據;
數據存儲模塊的讀寫內存表提供了將Key:Value數據寫入、刪除以及讀取Key:Value記錄的操作接口,讀寫內存表并不存在真正的刪除操作,刪除某個Key的Value在讀寫內存表內是作為插入一條記錄實施的,但是會打上一個Key的刪除標記;
數據存儲模塊的讀寫內存表中Key:Value對是根據Key大小有序存儲的,在系統插入新的Key:Value時,數據存儲模塊要把這個Key:Value插到合適的位置上以保持這種Key有序性;
當讀寫內存表插入的數據占用內存達到預設界限后,將內存的記錄導出到外存文件中,數據存儲模塊會生成新的Log文件和讀寫內存表,原先的讀寫內存表就成為只讀內存表,只能讀不能寫入或者刪除;新到來的數據被記入新的Log文件和讀寫內存表,數據存儲模塊后臺調度會將只讀內存表的數據導出到磁盤,形成一個新的CCTable文件;CCTable文件就是由內存中的數據不斷導出并進行壓縮操作后形成的,而且CCTable的所有文件是一種層級結構,第一層為Level 0,第二層為Level 1,層級逐漸增高;
(4.4)Current文件
Current文件:用于記載當前的manifest文件名;因為在數據存儲模塊的運行過程中,隨著壓縮的進行,CCTable文件會發生變化,會有新的文件產生,老文件被廢棄,Manifest也會跟著反映這種變化,此時新生成Manifest文件用于記載這種變化,而Current文件用來指出目標Manifest文件;
由于讀寫內存表存儲的是最新鮮的Key:Value對;只讀內存表中存儲的Key:Value數據對的新鮮程度次之;而所有CCTable文件中的Key:Value數據新鮮程度低于內存中的讀寫內存表和只讀內存表的Key:Value數據新鮮程度;如果同時在level L和Level L+1找到同一個key,level L的信息比level L+1的更新;查找數據的路徑順序按照數據新鮮程度由高到低排列;
CCTable文件很多,level 0和其它level中查找某個key的過程是不一樣的;因為level0下的不同文件存在key的范圍有重疊,數據存儲模塊的策略是找出level 0中包含目標key的文件,之后按照文件的新鮮程度排序,新的文件排在前面,之后依次查找,讀出key對應的value;
在Table緩存中,key值是CCTable的文件名稱,Value部分包含兩部分,一個是指向磁盤打開的CCTable文件中不同block區域的文件指針,以讀取內容;另外一個是指向內存中CCTable文件對應的Block緩存的結構指針,在內存中配置table結構, table結構保存CCTable文件的index內容以及用來指示Block緩存用的cache_id ;其中,table結構是根據用戶需要進行的選配組件,即在配置文件中指定是否打開采用table結構的功能;
數據存儲模塊會先在只讀內存中的Block緩存中查找是否包含CCTable文件的緩存記錄,如果包含,則從Block緩存中讀取;如果不包含,則打開CCTable文件,同時將CCTable文件的索引部分加載到內存中并放入Block緩存中;這樣Block緩存里面就有了CCTable的緩存記錄,只有索引部分在只讀內存中,之后數據存儲模塊根據索引定位到CCTable文件,從CCTable文件中讀出Block的內容,再根據緩存記錄,將從CCTable文件中讀出的Block內容與緩存記錄進行逐個比較,如果找到則返回結果,如果沒有找到,則本級別CCTable文件不包含需要查找的CCTable文件,到下一級別的CCTable文件中去查找;
在讀取操作中,數據存儲模塊確定了需要查找的key在某個級別下某個CCTable文件A的key range范圍內,那么需要判斷是不是CCTable文件A真的包含需要查找的Key:Value;此時,數據存儲模塊首先查找Table緩存,看CCTable文件是否在Table緩存里,如果找到,那么根據index部分就查找到包含該key的目標block;如果沒有在Table緩存中找到CCTable文件,那么打開CCTable文件,將其index部分讀入內存,然后插入Block緩存,去index里面定位包含該key的目標block;如果確定CCTable文件的block包含需要查找的key,那么需要讀取定位到的block內容,這是第二次讀取;
其中的key是CCTable文件的cache_id加上block在CCTable文件中的起始位置block_offset;而value則是Block的內容;
數據存儲模塊發現block在Block緩存中,那么避免讀取數據,直接在Block緩存里的block內容里面查找key的value就行,如果沒找到,那么讀入block內容并把它插入Block緩存中,以加快讀取速度。
該專利技術資料僅供研究查看技術是否侵權等信息,商用須獲得專利權人授權。該專利全部權利屬于北京卡拉卡爾科技股份有限公司,未經北京卡拉卡爾科技股份有限公司許可,擅自商用是侵權行為。如果您想購買此專利、獲得商業授權和技術合作,請聯系【客服】
本文鏈接:http://www.szxzyx.cn/pat/books/201610922026.0/1.html,轉載請聲明來源鉆瓜專利網。
- 上一篇:使用HTTP協議傳輸時的全文檢索方法
- 下一篇:一種網頁檢測方法及裝置





