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

場景

        進入隊列的消息都會獲取一個毫秒級的時間戳,標識消息的進入隊列的時間,獲取的時間戳方式如下:

#include <chrono>

std::int64_t curTime = std::chrono::time_point_cast<std::chrono::milliseconds>(std::chrono::system_clock::now()).time_since_epoch().count();

    每個訪問隊列的消費者保存之前訪問的消息的時間戳,只有時間戳大於之前訪問的時間戳纔讀取出來

現象

    隊列的消息訪問不完整

原因

    當前時間戳是毫秒級別,如果機器性能非常好或者數據一下子全部進入隊列,會造成上述curTime返回的值都是同一個值,所以不同的消息攜帶相同的時間戳,就只有一個數據被訪問到

解決

    消息進入到隊列生成一個時間戳的時候,跟隊列中最大的時間戳進行對比,如果相等,生成的時間戳自動加1,就不會有相同的時間戳問題了。

思考

    採用微妙級別的時間計數器,是否又會遇到相同的兩個時間戳,畢竟CPU運行越來越快

std::int64_t curTime = std::chrono::time_point_cast<std::chrono::microseconds>(std::chrono::system_clock::now()).time_since_epoch().count();


引申

    實際上是否可以生成一個唯一的64位數字標識一條消息?這裏會有一個問題就是在什麼合適的時間刪除該消息記錄?再次增加一個時間戳,也是可以的,但沒有上述解決方案,簡單

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章