成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

面試官:為什么在系統中不推薦雙寫?

數據庫 其他數據庫
其實這篇文章所探討的數據同步策略并不限于某兩種固定的存儲系統之間,而想去探討一種通用的數據同步策略。主要分為以下三個部分。

引言

某日,阿雄跑去面試!于是有如下情形

面試官:"阿雄是吧,做做自我介紹!"

阿  雄:"我叫阿雄,來自某a國際電商公司!"

面試官:"我看你項目里用了elasticsearch,你是怎么同步數據的呢?"

阿  雄:"在代碼里寫入數據庫的時候,同時再寫入elasticsearch!"

面試官:"那你如何保證寫入數據庫,和寫入elasticsearch原子性問題呢?萬一寫入數據庫成功了,寫入elasticsearch失敗了怎么處理?"

阿  雄:"我還是回去等通知吧!"

OK,以上情形純屬虛構,如有雷同,絕對巧合!

其實這篇文章所探討的數據同步策略并不限于某兩種固定的存儲系統之間,而想去探討一種通用的數據同步策略。主要分為以下三個部分

  •  (1)背景介紹
  •  (2)雙寫缺點
  •  (3)改良方案

正文

背景介紹

話說阿雄在加入某a國際電商公司的時候,業務系統十分簡單,一個database就能搞定一切!

可是某a國際電商公司在產品韓的領導下,業務增長迅速,阿雄發現了數據庫越來越慢,于是乎阿雄加入了一些緩存,如redis來緩存一些數據,提高系統的響應能力。

又過了一段時間,產品韓發現搜索的速度灰常慢,讓阿雄去改。阿雄在網上發現,現在業內都用一些elasticsearch做一些全文檢索的操作,于是乎阿雄將一些需要全文檢索的數據放入elasticsearch,提高了系統的搜索能力!

隨著數據的膨脹,阿雄慢慢的發現了,對數據庫做一些數據分析操作,性能明顯的跟不上了。于是乎阿雄將數據庫里的數據,導入hadoop,然后進行數據分析。

(省略一萬字….)

最后,阿雄和產品韓幸福的在一起了。

OK,好,現在分析上面的場景!思考第一個問題

1、在database,redis,elasticsearch,hadoop中的數據是有關系的,還是彼此獨立的?

顯然是有關系的,在這幾個數據源中的數據都是相關的。只是格式不一樣而已!例如,對于一條Product數據,在數據庫里是

在redis里就是key為 product:pId:1,value是 

  1. {     
  2.     "pId": "1",  
  3.     "productName": "macbook"  

如上所示,只是數據格式不一樣而已!

那好,現在思考第二個問題

2、既然這些數據源之間數據是相關的,如何保證這幾個數據源之間數據一致性!

一種比較簡單且容易想到的方案是,hardcode在程序中

例如現在有兩個數據源DataSouce1和DataSource2,我們往里頭寫數據,代碼如下 

  1. ProductService{  
  2.     \\省略  
  3.     public void syncData(){  
  4.         x1. writeDataSource1();  
  5.         x2. writeDataSource2();  
  6.     }  

這就是我們標題中所提到的雙寫!那么,雙寫會帶來什么壞處呢?OK,繼續往下看!

雙寫缺點

一致性問題

打個比方我們現在有兩個client,同時往兩個DataSouce寫數據。

  •  一個client往里頭入X為1
  •  一個client往里頭入X為5

那么會有如下情形出現

如圖所示,兩個DataSouce的數據就不一致了,一個為1,一個為5。除非接下來有一個新的請求,對x數據發生了變更,才能修正這種現象!否則,你可能永遠都發現不了。

原子性問題

因為我們需要同時往DataSource1和DataSource2一起寫數據,你需要保證 

  1. x1. writeDataSource1();  
  2. x2. writeDataSource2(); 

這兩個操作一起成功,或者一起失敗!如果采用雙寫的方法,是避不開這個問題的!

那么有沒有通用的辦法來解決這些問題呢?

有的,只要能按順序記錄數據的變更即可!那具體怎么做呢,我們繼續往下看!

改良方案

假設,如果我們能將數據按順序記錄,寫入某個消息隊列,然后其他系統按消息順序恢復數據,看看what happen?

此時架構圖如下

在該架構下,所有的數據變更寫入一個消息隊列里去。其他各數據源從消息隊列里恢復數據即可!

那么,此時還有一致性問題,和原子性問題么?

一致性問題

OK,這種情況下,各個數據源之間數據肯定是一致的。因為寫入順序已經在消息隊列中定義好,各數據源按照消息隊列中的消息順序,恢復數據即可,并不存在競爭現象。因此,不會出現不一致的問題!

原子性問題

OK,這種情況下,如果寫入DataSource失敗會怎么樣?例如出現了網絡問題,這條消息恢復失敗了。這個問題其實好解決,一般我們在順序根據消息恢復數據的時候,會記錄下坐標。如果寫入失敗,停止恢復數據。下次從該坐標處恢復數據即可。

但是在上面那張圖中,寫入DataBase是異步寫入的。這樣就不符合很多業務場景的"寫后即讀"的要求,因此,在實際落地中,做了一些變更!通用做法是去提取數據庫的變化!

如下圖所示

在該圖中的中間件,例如oracle中的oracle golden gate可以提取數據變化。mysql中的canal能提取數據的變化。至于消息隊列,可以選用kafka。直接提取數據變化到kafka中,其他數據源從kafka中獲取數據,避免了直接雙寫從而導致一致性和原子性問題。

總結

本問討論了在項目中常見的數據同步問題,希望大家有所收獲。 

 

責任編輯:龐桂玉 來源: 數據庫開發
相關推薦

2021-09-08 07:58:58

字節系統雙寫

2022-07-06 13:48:24

RedisSentinel機制

2023-12-06 09:10:28

JWT微服務

2020-10-24 15:50:54

Java值傳遞代碼

2021-02-19 10:02:57

HTTPSJava安全

2021-01-21 07:53:29

面試官Promis打印e

2021-12-20 10:30:33

forforEach前端

2025-05-14 00:00:00

MySQL雙主架構循環復制

2024-03-13 07:53:57

弱引用線程工具

2021-08-05 12:41:57

高并發性能CAS

2023-12-20 14:35:37

Java虛擬線程

2022-12-27 08:39:54

MySQL主鍵索引

2023-07-05 08:17:38

JDK動態代理接口

2022-12-22 14:32:37

JavaScript編程語言

2023-06-05 07:57:53

Kafka消息事務消息

2021-09-07 10:44:33

Java 注解開發

2023-11-30 08:16:19

SpringjarTomcat

2020-12-23 13:29:15

微服務架構面試官

2024-01-11 08:12:20

重量級監視器

2025-06-18 08:20:00

Redis數據庫線程
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久精品99 | 天天碰夜夜操 | 综合久久综合久久 | 红色av社区 | 国产精品日韩欧美一区二区三区 | 欧美日韩一 | 99pao成人国产永久免费视频 | 成人精品鲁一区一区二区 | 综合久久av | 欧美激情亚洲激情 | 人妖一区 | 天天色天天色 | 成人精品国产一区二区4080 | 欧美精品欧美精品系列 | 北条麻妃一区二区三区在线观看 | 综合色久 | 91精品一区二区三区久久久久久 | 在线看h| 日韩精品福利 | 人人草天天草 | 午夜精品在线观看 | 久久久91精品国产一区二区三区 | 国产丝袜一区二区三区免费视频 | 国产高清在线精品 | 亚洲精品一区二区三区在线 | 日本一区二区电影 | 精品日本中文字幕 | 国产香蕉视频 | 91在线看片 | 99热播精品| 国产九九精品 | 国产激情91久久精品导航 | www视频在线观看 | 成人国产精品一级毛片视频毛片 | 香蕉一区 | 欧美性视频在线播放 | 国产极品车模吞精高潮呻吟 | 在线免费看黄 | 涩涩视频大全 | www国产成人免费观看视频,深夜成人网 | 在线一区 |