flink時間視窗計算將計算結果寫入druid.io的拓補圖結構如下:
flink從kafka消費資料,進行分別進行計量和及時的計算,最終將計算結果寫入到kafka,最終druid.io使用kafka-inex-service從kafka中拉取資料,將結果寫入到druid.io
在程式執行的過程中,由於非常偶然的原因,flink程式異常了,然後flink從最近的checkpoint中恢復資料,但是在druid.io的記過中發現,在checkpoit這段時間內,資料發生了重複,雖然該問題出現概率非常小,但是由於系統對精度要求比較搞,對於該問題,還是需要處理的.
解決方案如下:
1.調整checkpoint快照的市價間隔,如果時間間隔比較小,那麼發生該資料重複的概率就會更小,
2.可以實現在結果資料寫入到kafka時,使用kafka producer實現寫入的冪等性來保證重複的資料無法寫入到druid.io
由於需要考慮到程式的資料恢復問題,方法二能夠很好的兼顧資料恢復的問題,所以下面就討論一下如果實現kakka producer的冪等性問題.
為了實現冪等性,那麼久必須保證已經寫入的資料,不會再在寫入了,為了充分利用redis的高並發行,以及考慮到程式的高並發行,所以要盡可能的減少redis的操作次數,這樣很容易實現10w/s的併發.那麼根據redis的setnx的操作,這樣分布式鎖目前來看,是比較符合我們的要求的.
**實現如下:
/**
* 計算結果寫入到kafka冪等性的實現
** @param json
* @return
*/public boolean idempotent(string json)
redispool.returnresource(jedis);
} catch (exception e)
return false;
}```
優點:1.程式可以分組,可以分布式,亦可以用於資料恢復程式
2.減少了對redis操作頻度,提高了程式的併發性.
分布式鎖 使用Redis實現分布式鎖
關於分布式鎖的實現,我的前一篇文章講解了如何使用zookeeper實現分布式鎖。關於分布式鎖的背景此處不再做贅述,我們直接討論下如何使用redis實現分布式鎖。關於redis,筆主不打算做長篇大論的介紹,只介紹下redis優秀的特性。支援豐富的資料型別,如string list map set zs...
redis實現分布式鎖
隨便 系統越來越大,各功能模組除了垂直切割以外,同時也得做集群處理,那麼問題來了,在多執行緒情況下對於資源的競爭就需要乙個統一的訪問限制。以選課系統為例子,集群中各節點對課程可選數量同時操作,這裡就需要同步了,否則會導致最後選到的數量比可選的數量大,這裡我們的分布式鎖就派上用場了。利用redis來實...
redis實現分布式鎖
分布式鎖可以基於很多種方式實現,比如zookeeper redis.不管哪種方式,他的 基本原理是不變的 用乙個狀態值表示鎖,對鎖的占用和釋放通過狀態值來標識。1 使用redis的setnx命令實現分布式鎖 1 實現的原理 redis為單程序單執行緒模式,採用佇列模式將併發訪問變成序列訪問,且多客戶...