大白話講解分佈式緩存併發衝突問題及其解決方案:zk分佈式鎖 原 薦

大白話講解分佈式緩存併發衝突問題及其解決方案:zk分佈式鎖

一、背景介紹

如果您更喜歡看視頻教程,可以看本頭條號發佈的視頻教程,絕對大白話,手把手帶你體驗整個衝突的演示過程及解決方案:兩種方式,隨機挑選 緩存架構之實戰演練基於zk分佈式鎖解決分佈式緩存併發衝突問題

1、源架構:

2、分佈式緩存併發衝突問題

二、項目整合

1、廣告服務系統

**功能:**爲媒體提供廣告的源頭服務

  • 從本地緩存中獲取廣告
  • 從redis緩存中獲取廣告
  • 從db獲取廣告,並更新到redis緩存

2、 緩存服務系統

  • 消息監聽,實時增量更新redis緩存
  • 定時全量更新redis緩存

3、廣告管理系統

  • 廣告的增刪改查
  • 發送廣告更改的mq消息

三、rabbitmq消息重複解決方案

1、是什麼造成了消息的重複呢?

生產者在使用publisher confirm機制的時候,發送完一條消息等待RabbitMQ返回確認通知,此時網絡斷開,生產者捕獲到異常情況,爲了確保消息可靠性,選擇重新發送,這樣RabbitMQ中就有兩條同樣的消息。這樣,在消費者消費的時候,就會重複消費,尤其是在交易系統/充值系統/銀行轉賬系統……中,這問題就大了。

2、解決方案

這裏進介紹下思路,簡單說下處理方案,後面我們將分佈式事務的時候,再詳細介紹可靠性這一塊

  • 生產者對於發的每條消息,都帶一個唯一UUID
  • 消費者通過這個UUID來校驗消息的重複性 唯一UUID:
    • 生產者:兩次發送的key必須一致(所以發送前,這個key必須持久化)
    • 唯一key可以存儲到分佈式緩存中,如:redis,可以設置個緩存時間
public class AdMessage {

    /**
     * 操作類型:1爲新增,2是修改
     */
    private int operation;

    /**
     * 主鍵字段,值爲具體的ID值
     */
    private Long id;

    /**
     * 消息的唯一key:用於消息去重
     */
    private String uuidKey;

    /**
     * 廣告信息:
     */
    private String content;
}

四、實戰演練基於zk分佈式鎖解決分佈式緩存併發衝突問題

代碼下載地址https://gitee.com/jikeh/JiKeHCN-RELEASE.git

項目名: 廣告服務系統:spring-boot-ad-service 緩存服務系統:spring-boot-cache 廣告管理系統:spring-boot-ad

1、zk分佈式鎖

  • 原生zookeeper實現分佈式鎖
  • 使用curator框架實現zookeeper分佈式鎖

2、廣告服務系統應用zk分佈式鎖

3、廣告緩存系統應用zk分佈式鎖

4、實戰演練

1)模擬併發衝突場景
  • 廣告服務系統redis緩存更新:設置一個sleep阻塞時間

  • 啓動廣告服務系統

  • 訪問接口:等待刷新redis(舊數據)

  • 啓動緩存服務系統

  • 啓動廣告管理系統

  • 修改廣告,瞬時更新redis緩存 (新數據)

  • 廣告服務系統成功更新redis:舊數據舊覆蓋了新數據==>造成緩存衝突問題

2)併發正常演示

更多內容,請關注: 頭條號:極客慧

個人網站:極客慧 更多資料分享,請入羣討論:375412858

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