毫秒時間戳標識消息致使數據丟失的問題排查

場景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位數字標識一條消息?這裏會有一個問題就是在什麼合適的時間刪除該消息記錄?再次增長一個時間戳,也是能夠的,但沒有上述解決方案,簡單

相關文章
相關標籤/搜索