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

字節終面:為什么在系統中不推薦雙寫?

開發 前端 開發工具
去某大廠面試,到了終面,面試官問我:為什么在系統中不推薦雙寫?我竟然沒答上來......

[[422466]]

圖片來自 包圖網

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

  • 面試官:"阿雄是吧,做做自我介紹!"
  • 阿雄:"我叫阿雄,來自某 a 國際電商公司!"
  • 面試官:"我看你項目里用了 Elasticsearch,你是怎么同步數據的呢?"
  • 阿雄:"在代碼里寫入數據庫的時候,同時再寫入 Elasticsearch!"
  • 面試官:"那你如何保證寫入數據庫,和寫入 Elasticsearch 原子性問題呢?萬一寫入數據庫成功了,寫入 Elasticsearch 失敗了怎么處理?"
  • 阿雄:"我還是回去等通知吧!"

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

主要分為以下三個部分:

  • 背景介紹
  • 雙寫缺點
  • 改良方案

背景介紹

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

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

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

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

省略一萬字….最后,阿雄和產品韓幸福的在一起了。OK,好,現在分析上面的場景!思考第一個問題。

①在 DataBase,Redis,Elasticsearch,Hadoop 中的數據是有關系的,還是彼此獨立的?

顯然是有關系的,在這幾個數據源中的數據都是相關的。只是格式不一樣而已!

例如,對于一條 Product 數據,在數據庫里是:

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

  1. {       "pId""1"
  2.     "productName""macbook" 

如上所示,只是數據格式不一樣而已!那好,現在思考第二個問題。

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

一種比較簡單且容易想到的方案是,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 中獲取數據,避免了直接雙寫從而導致一致性和原子性問題。

總結

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

作者:孤獨煙

編輯:陶家龍

出處:轉載自公眾號孤獨煙(ID:zrj_guduyan)

責任編輯:武曉燕 來源: 孤獨煙
相關推薦

2020-08-24 10:55:41

數據庫雙寫代碼

2021-07-19 09:27:42

SSD內存Linux

2022-01-11 10:29:32

Docker文件掛載

2024-11-29 08:20:22

Autowired場景項目

2024-11-26 08:52:34

SQL優化Kafka

2024-06-04 00:10:00

開發拷貝

2024-11-12 10:30:54

Docker部署數據庫

2018-11-29 14:30:42

數據庫外鍵約束應用程序

2024-09-12 08:32:42

2025-05-16 02:00:00

HashMapJava代碼

2022-01-17 14:24:09

共享字節面試

2015-08-06 12:50:47

技術人員博客

2015-09-29 10:18:22

2024-04-03 09:01:34

SpringTomcat容器

2021-08-23 13:02:50

MySQLJOIN數據庫

2020-07-02 14:12:52

C++語言編程

2023-11-06 13:04:59

Python日志庫

2023-09-27 23:03:01

Java虛擬線程

2014-06-03 09:39:25

蘋果移動操作系統

2024-10-10 14:34:49

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成人在线视频看看 | 免费污视频 | 天天综合网91 | 在线播放一区二区三区 | 日韩av免费在线观看 | 亚洲福利 | 日本久久精品视频 | 日本涩涩网 | 91麻豆久久久 | 九色在线观看 | 欧美成人a∨高清免费观看 色999日韩 | 日韩精品一区二区三区中文在线 | 日韩欧美1区2区 | 久草福利| 成人性生交大片免费看r链接 | 91精品国产91久久综合桃花 | 99精品久久久久久中文字幕 | 久久69精品久久久久久国产越南 | 欧美激情久久久 | 日日天天| 国产精品视频久久久久 | 偷拍亚洲色图 | 久久久精品天堂 | 2019天天操 | 一区二区三区电影网 | 欧美在线一区二区三区 | 国产一区二区在线免费观看 | 亚洲第1页 | 精品丝袜在线 | 国产分类视频 | 国产 日韩 欧美 制服 另类 | 国产精品久久久久久久久久免费 | 日韩精品无码一区二区三区 | 国产高清在线视频 | av在线亚洲天堂 | 亚洲一区二区三区在线观看免费 | 午夜资源| 成人午夜影院 | 国产欧美视频一区二区三区 | 久久国产亚洲 | 我要看黄色录像一级片 |