MQ異常測試

2021-10-22 03:47:10 字數 2776 閱讀 8174

1、mq訊息體中某些必填引數為null,或者全部必填為null,字段型別、長度是否不符合約定

2、mq訊息體中引數位置錯誤

3、訊息重**送,只消費一條 —冪等性

一般根據訊息內容中唯一標識來去重

4、訊息到達順序不一致,導致業務異常

比如業務是有先後順序的

案例1:訂單下單後再取消,如果先收到取消的訊息,再收到下單訊息,就會有問題

案例2:一條政策新增後馬上刪除,政策同步時,政策刪除的訊息先到達,新增的訊息後到,就會導致最小價該條政策沒刪除,只能等全量同步的時候再刪除

5、訊息傳送失敗,重試次數

1)producer端重試

比如網路抖動導致生產者傳送訊息到mq失敗,可以手動設定傳送失敗重試的次數

2)consumer端重試

預設16次,重試時間間隔會越來越長,如果失敗的多,容易堆積

重試次數可自定義設定

消費者端失敗分2種

a、exception

如反序列化失敗

b、timeout

只有訊息推送失敗才需要重推,需要注意開發不要把其他失敗的情況也進行重試

如收到訊息,但解析訊息時,序列化失敗,這種算訊息傳送成功的

還比如政策同步時,消費者收到訊息,但特殊情況消費異常,也去做了重試

6、機器重啟時間段的訊息,消費者能否消費到

7、push的型別,需要測試當有生產者生成訊息時,消費者是否能及時得到資訊並消費

8、pull型別的消費者,需要測試拉取的時間間隔,間隔一段時間再有訊息延遲性

9、消費時消費節點測試

接線上已有的生產者,需要注意,必須設定消費開始時間,不然上線時會大批量訊息過來會造成堆積,造成故障

10、訊息丟失,業務是否相容,是否有補償或者監控機制

比如政策同步訊息丟失,還有全量航線同步進行補償;

**商退票先發訊息給**商,退訂這邊會監控,臨近跨退規節點,會去調**商介面檢查是否已推送**商退票,沒有退票的會自動再推一遍

11、消費模式注意,訊息爭用

如果是集群模式,同一topic下新增新的消費組,沒有申請新的group,導致一條訊息投遞過來,多個消費組爭搶

案例:有時候開發為了省事,預發和線上同乙個topic,消費組的group也一樣,上線後,可能有效訊息就被預發消費組消費了

知識點:

一、rocketmq訊息模式

1、集群模式

一條訊息投遞過來,只會被consumer 1、consumer 2、consumer 3中的乙個消費

2、廣播模式

當 consumer 使用廣播消費時,一條訊息投遞過來,會被 consumer 1、consumer 2、consumer 3都消費一次

目前我們用的比較多的是集群模式,集群模式可以模擬廣播消費

如果業務上確實需要使用廣播消費,那麼我們可以通過建立多個 consumer 例項,每個 consumer 例項屬於不同的 consumer group,但是它們都訂閱同乙個 topic。舉個例子,我們建立 3 個 consumer 例項,consumer 1(屬於consumer group 1)、consumer 2(屬於 consumer group 2)、consumer 3(屬於consumer group 3),它們都訂閱了 topic a ,那麼當 producer 傳送一條訊息到 topic a 上時,由於 3 個consumer 屬於不同的 consumer group,所以 3 個consumer都能收到訊息,也就達到了廣播消費的效果了。 除此之外,每個 consumer 例項的消費邏輯可以一樣也可以不一樣,每個consumer group還可以根據需要增加 consumer 例項,比起廣播消費來說更加靈活。

二、push 和 pull 的優缺點

push

優點:生產者主動推送給消費者,及時性很高

缺點:當消費者消費能力遠低於生產者生產能力,那麼一旦生產者推送大量訊息到消費者時,就會導致消費者訊息堆積,處理緩慢,甚至服務崩潰。(那麼如何解決這個問題呢?需要mq提供流控制,也就是依據消費者消費能力做流控。比如rabbitmq設定qos,限制消費數量。)生產者需要維護和每個消費者之間的會話。

優化方案:不採用 http 長連線的方法保持會話,採用 socket 監聽。

適用場景:對於資料實時性要求高的場景

pull

優點:消費者可以依據自己的消費能力進行消費;生產者不需要維護和消費者之間的會話。

缺點:拉取訊息的間隔不太好設定。間隔太短,對伺服器請求壓力過大。間隔時間過長,那麼必然會造成一部分資料的延遲。

實時性相對較低。

優化方案:長輪詢:消費者如果嘗試拉取失敗,不是直接 return,而是保持連線 wait,服務端如果有新的訊息到來,返回最新訊息。

適用場景:對於生產者生產訊息資料比較大時,而消費端處理比較複雜,消費能力相對較低

三、刷盤方式

同步刷盤:在訊息到達mq後,rocketmq需要將資料持久化,同步刷盤是指資料到達記憶體之後,必須刷到commitlog日誌之後才算成功,然後返回producer資料已經傳送成功。

非同步刷盤:是指資料到達記憶體之後,返回producer說資料已經傳送成功。,然後再寫入commitlog日誌。

commitlog:

commitlog就是來儲存所有的元資訊,包含訊息體,類似於mysql、oracle的redolog,所以主要有commitlog在,consume queue即使資料丟失,仍然可以恢復出來。

consumequeue:記錄資料的位置,以便consume快速通過consumequeue找到commitlog中的資料

JUnit三(異常測試)

異常測試是指可能希望測試 在給定無效輸入時丟擲正確的異常,這裡有兩種方法可以實現,第一種是將預期的exception新增到 test注釋中,另一種是在將預期的exception放在try catch中,下面分別給出兩個方法的實現 public class junitdemo1test test ex...

php Try Catch多層級異常測試

class a catch exception e class b catch exception e class c catch exception e try catch exception e echo end 頁面try catch裡使用c的 c1,c1裡使用b的b1,b1裡使用a的a1。預...

異常測試實踐與梳理

摘要 異常測試,是指通過人為製造異常,檢測系統的處理是否符合邏輯。結合在a專案中的實踐,梳理一下常見異常測試的型別 關注點及常用測試工具等。a專案是乙個典型的web前端 後台的專案,主要的業務是購買賬號及註冊賬號。從實踐來講,我覺得乙個專案的異常測試基本可以分為2大類 功能異常及服務端異常,功能異常...