場景ide
進入隊列的消息都會獲取一個毫秒級的時間戳,標識消息的進入隊列的時間,獲取的時間戳方式以下:性能
#include <chrono>隊列
std::int64_t curTime = std::chrono::time_point_cast<std::chrono::milliseconds>(std::chrono::system_clock::now()).time_since_epoch().count();it
每一個訪問隊列的消費者保存以前訪問的消息的時間戳,只有時間戳大於以前訪問的時間戳纔讀取出來ast
現象class
隊列的消息訪問不完整im
緣由時間戳
當前時間戳是毫秒級別,若是機器性能很是好或者數據一會兒所有進入隊列,會形成上述curTime返回的值都是同一個值,因此不一樣的消息攜帶相同的時間戳,就只有一個數據被訪問到數據
解決di
消息進入到隊列生成一個時間戳的時候,跟隊列中最大的時間戳進行對比,若是相等,生成的時間戳自動加1,就不會有相同的時間戳問題了。
思考
採用微妙級別的時間計數器,是否又會遇到相同的兩個時間戳,畢竟CPU運行愈來愈快
std::int64_t curTime = std::chrono::time_point_cast<std::chrono::microseconds>(std::chrono::system_clock::now()).time_since_epoch().count();引伸
其實是否能夠生成一個惟一的64位數字標識一條消息?這裏會有一個問題就是在什麼合適的時間刪除該消息記錄?再次增長一個時間戳,也是能夠的,但沒有上述解決方案,簡單