biztalk
中訊息儲存在
messagebox
資料庫的
spool
表和parts
表中。spool
表的內容是訊息的總體性描述和訊息的上下文屬性,一條訊息在此表中為一條記錄。
parts
表存放多部分訊息的各個部分,乙個部分在此表中佔一條記錄。哪乙個是正文部分由
spool
表中的uidbodypartid
標識。
biztalk
儲存每一條訊息,不管這個訊息是否已經不再有用。隨著時間推移,訊息會不斷堆積,占用占用硬碟空間,給系統的效能帶來負面影響。所以一般需要定期對
messagebox
資料庫中的訊息進行清理,把一些過期的無用的訊息清理掉。
biztalk 2006
提供了訊息清理工具,幫助使用者日常清理訊息。清理訊息的依據就是看這條訊息是否被服務例項引用,如果這條訊息已經不被任何例項引用,說明此條訊息已經被使用完畢,在系統中不會再被使用,可以刪除。
前一篇文章《
深入biztalk
訊息引用和引用計數
》中已經分析了
biztalk
中訊息的引用機制,對此部分不了解的朋友可以參考此文章。
引用計數分為兩種情況: l
乙個訊息只有乙個服務訂閱:這種情況十分簡單,引用計數儲存在本地引用計數表
中,因為只有乙個服務例項使用這個訊息,所以這個服務例項完成後直接把這個訊息的
guid
存入messagezerosum
表中,表示這條訊息已可刪除。 l
乙個訊息有多個服務訂閱:這種情況比較複雜,把引用計數儲存到全域性訊息引用計數表。清理訊息作業大部分的工作就是根據全域性訊息引用表來計算判斷哪些訊息不再被引用了。
biztalk2006
中清理訊息應該執行
messagebox_message_ managerefcountlog_biztalkmsgboxd
作業,在這個作業中會呼叫
messagebox_message_ cleanup_biztalkmsgboxdb
作業,從而一同完成清理訊息的任務。
messagebox_message_managerefcountlog_biztalkmsgbox
只有乙個步驟,呼叫
bts_ managemessagerefcountlog
儲存過程,下面訊息分析這個儲存過程的作用。
1.清理非活動引用計數表
訊息**把訊息引用計數記入到全域性訊息引用計數表
messagerefcountlog1
或者messagerefcountlog2
中。這個過程是逐筆記錄下乙個訊息被引用的次數,和被釋放引用的次數的乙個流水過程。
biztalk
還有乙個全域性引用計數彙總表
messagerefcountlogtotals
,此表彙總兩個全域性引用計數表的引用計數。
messagerefcountlogtotals
表結構如下:
uidmessageid
――訊息
guid
snrefcount
――引用計數
tnlasttable
――最後更新總表的是哪個分表
根據activerefcountlog
表tnactivetable
字段,獲得當前非活動引用計數表,呼叫儲存過程
int_purgemessagerefcountlog
清理非活動引用計數表。
int_purgemessagerefcountlog
儲存過程的作用: l
把非活動引用計數表按照訊息
guid
分組彙總每個訊息的引用計數 l
把非活動引用計數表的訊息計數跟全域性引用計數彙總表相同
guid
的訊息的引用計數相加更新到全域性引用計數彙總表。 l
把非活動引用計數表中在全域性引用計數彙總表中沒有的訊息計數插入到全域性引用計數彙總表。 l
將所有此次彙總表中受影響的記錄的
tnlasttable
設為這個非活動引用計數表的錶號。 l
因為非活動引用計數表中的內容已經全部更新到全域性引用計數彙總表,全部刪除非活動引用計數表的記錄。 l
將全域性引用計數彙總表中最後更新為活動錶號的,引用計數
snrefcount
為零的訊息記錄轉存到
messagezerosum
表中,同時把這些記錄在全域性引用計數彙總表中刪除。在
messagezerosum
表中的訊息就表示是可以刪除的了。
2.交換活動表,再清理當前活動引用計數表
上一步處理了非活動引用計數表,此時非活動引用計數表應該為空。這一步把活動引用計數表和非活動引用計數表作個交換,通過重設
activerefcountlog
表tnactivetable
欄位來完成。這樣原來的活動引用計數表就變成了非活動引用計數表,同樣呼叫
int_purgemessagerefcountlog
過程,來清理當前非活動引用計數表。過程同上一步驟一樣。
通過這兩個步驟,把兩個全域性引用技術表都進行了處理,同時也把不再被引用的訊息從全域性引用計數彙總表中刪除,轉存到了
messagezerosum
表中。messagezerosum
表中的訊息表示是可以刪除訊息,
messagezerosum
表主要字段就是乙個訊息的
guid。
3.呼叫實際清理訊息作業
這一步驟呼叫
messagebox_message_ cleanup_biztalkmsgboxdb
作業,messagebox_message_ cleanup_biztalkmsgboxdb
作業也只有乙個步驟,是呼叫
bts_purgemessages
儲存過程,
bts_purgemessages
儲存過程又呼叫
int_purgemessagezerosumtable
儲存過程。
下面看一下
int_purgemessagezerosumtable
過程的功能: l
把spool
表中跟messagezerosum
表相關的訊息刪除。 l
清空messagezerosum表。
BizTalk 就是訊息傳遞系統加工作流
昨天按照biztalk server2006的學習教程試著做了乙個例子,很順利。覺得對biztalk有了一些理解。非常巧的是,我之前的乙個專案,給客戶做個乙個構件體系的架構,現在發現那個架構和biztalk驚人的相似,呵呵。我發現要學習biztalk,最好先學習訊息系統,有了基於訊息的系統的開發設計...
Kafka訊息保留 清理策略
kafka broker預設的訊息保留策略是 要麼保留一定時間,要麼保留到訊息達到一定大小的位元組數。當訊息達到設定的條件上限時,舊訊息就會過期並被刪除,所以,在任何時刻,可用訊息的總量都不會超過配置引數所指定的大小。topic可以配置自己的保留策略,可以將訊息保留到不再使用他們為止。因為在乙個大檔...
什麼時候清理物理訊息檔案?
那訊息檔案到底刪不刪,什麼時候刪?訊息儲存在commitlog之後,的確是會被清理的,但是這個清理只會在以下任一條件成立才會批量刪除訊息檔案 commitlog 1.訊息檔案過期 預設72小時 且到達清理時點 預設是凌晨4點 刪除過期檔案。2.訊息檔案過期 預設72小時 且磁碟空間達到了水位線 預設...