或者:如何保證從消息隊列里拿到的數據按順序執行?
解決方案的關鍵是在消費者消費之前,將有相關性的數據按順序寫入同一個隊列(queue或者是內存隊列)
1、rabbitMQ 中,有個默認是數據1進入一個queue並且只會被一個消費者消費
場景:(1queue對多consumer)三個消息按順序寫進了1個queue,但是這個queue對應了三個consumer,最終插入DB的順序錯亂了,原本是增刪改,可能最后變成了改增刪
圖例:
解決方法:拆分多個queue,每個queue對應一個consumer,有相關性的數據按順序寫入一個queue,consumer按順序消費。consumer內部用內存隊列做排隊,然后分發給底層不同worker來處理。
2、kafka 默認是一個partition只能被一個消費者消費
場景:在最后消費的時候,由於追求吞吐量,采用了多線程處理消費,數據的順序寫庫亂了
解決方案:消費者采用多線程消費消息之前,將相同訂單ID的數據,訂單ID數據hash一下寫入同一個內存隊列(是有順序的),然后交給線程去處理。
注:由於單線程一條消息要處理幾十ms,一秒鍾只能處理幾十條,吞吐量太低了。
多線程壓測最高是消費者是4核8G的機器 單機,32條線程,最高每秒處理上千條消息。