国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

分布式系統(tǒng)常見問題

這篇具有很好參考價(jià)值的文章主要介紹了分布式系統(tǒng)常見問題。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

一.概述

分布式系統(tǒng)存在網(wǎng)絡(luò),時(shí)鐘,以及許多不可預(yù)測的故障。分布式事務(wù),一致性與共識問題,迄今為止仍沒有得到很好的解決方案。要想完美地解決分布式系統(tǒng)中的問題不太可能,但是實(shí)踐中應(yīng)對特定問題仍有許多可靠的解決方案。本文不會談及諸如BASE, CAP, ACID 等空泛的理論,只基于實(shí)踐中遇到的問題提出可行的解決方案。

二.常見問題

1.讀自己的寫

現(xiàn)象: 用戶在發(fā)布頁發(fā)布了帖子,然后訪問自己的主頁查看帖子列表,并沒有馬上看到自己剛剛發(fā)布的帖子,等待1~2s后才看到

分析:后端db采取主從結(jié)構(gòu),復(fù)制任務(wù)在負(fù)載較高的情況下會有延遲。用戶讀取帖子列表查詢的是從節(jié)點(diǎn),所以無法及時(shí)看到剛剛發(fā)布的帖子。一般情況下延遲1~2s是可以接受的,但是為了更好的體驗(yàn),可以做一些改進(jìn)。

分布式系統(tǒng)常見問題

解決方案:

  • 如果用戶讀取的是自己的主頁,就訪問主節(jié)點(diǎn)。如果訪問是他人的主頁,就訪問從節(jié)點(diǎn)。只需要在db層路由即可。
  • 客戶端還可以記住最近更新時(shí)的時(shí)間戳,并附帶在讀請求中,據(jù)此信息,系統(tǒng)可以確保對該用戶提供讀服務(wù)時(shí)都應(yīng)該至少包含了該時(shí)間戳的更新。如果不夠新,要么交由另一個(gè)副本來處理,要么等待直到副本接收到了最近的更新

2.單調(diào)讀

現(xiàn)象:用戶查看某個(gè)帖子下面的評論,一會兒看到5條評論,一會兒看到6條評論。

分析:后端db采取主從結(jié)構(gòu),復(fù)制任務(wù)在負(fù)載較高的情況下會有延遲。用戶讀取評論列表查詢的是從節(jié)點(diǎn),但是兩次讀的是不同的從節(jié)點(diǎn),當(dāng)某個(gè)從節(jié)點(diǎn)具有明顯延遲就會出現(xiàn)數(shù)據(jù)反復(fù)的現(xiàn)象。

分布式系統(tǒng)常見問題

解決方案:

  • 確保同一個(gè)用戶每次都是讀取同一個(gè)副本,可以在db層進(jìn)行路由。這是一種典型的sticky 請求路由。

????replica = hash(user_id) % number_of_replica

3.負(fù)載傾斜與熱點(diǎn)問題

現(xiàn)象:某個(gè)分區(qū)的數(shù)據(jù)明顯比其他分區(qū)多,并且訪問頻率高,負(fù)載壓力大。

分析:在某些特殊的業(yè)務(wù)場景下,比如官方或者名人賬號有百萬粉絲,當(dāng)這些賬號發(fā)布消息事件時(shí),人們會對該消息進(jìn)行評論,如果評論數(shù)據(jù)存儲使用事件id進(jìn)行hash,就會造成某個(gè)分區(qū)的負(fù)載產(chǎn)生傾斜。

解決:

  • ??在關(guān)鍵詞,比如消息事件id,的開頭或者結(jié)尾添加一個(gè)隨機(jī)數(shù)。只需一個(gè)兩位數(shù)的十進(jìn)制隨機(jī)數(shù)就可以將關(guān)鍵字的寫做操作分布到100個(gè)不同的關(guān)鍵字上,從而分片到不同的分區(qū)上。這些特殊邏輯只應(yīng)用在一些特殊賬號上。

4.fencing令牌

現(xiàn)象:在采用分布式鎖的情況下,數(shù)據(jù)庫中的事務(wù)重復(fù)執(zhí)行。

分析:在分布式鎖環(huán)境中,客戶端A執(zhí)行事務(wù)超時(shí),分布式鎖被釋放??蛻舳薆執(zhí)行事務(wù)插入數(shù)據(jù)??蛻舳薃恢復(fù)后繼續(xù)執(zhí)行事務(wù),重復(fù)插入數(shù)據(jù)。

分布式系統(tǒng)常見問題

解決方案:

  • 這不是分布式事務(wù)的范疇。可以采用fencing令牌來解決。我們假設(shè)每次鎖服務(wù)授予鎖或租約時(shí),同時(shí)還會返回一個(gè)fencing令牌,該令牌每授予一次就會遞增。然后,要求客戶端每次向存儲系統(tǒng)發(fā)生寫請求時(shí),都必須包含所持有的fencing令牌。當(dāng)使用zookeeper 作為鎖服務(wù)時(shí),可以用事務(wù)標(biāo)識zxid,或節(jié)點(diǎn)版本cversion來充當(dāng)fencing令牌,這兩個(gè)都可以滿足單調(diào)遞增的要求。

分布式系統(tǒng)常見問題

5.Lamport時(shí)間戳

現(xiàn)象:客戶端從兩個(gè)分區(qū)獲取兩條不同的數(shù)據(jù),比如事件a, b;a的序號小于b,但事實(shí)上b比a先發(fā)生。

分析:常見的有以下幾種非因果序列發(fā)生器,產(chǎn)生的序列號與因果關(guān)系并不嚴(yán)格一致。

  • 每個(gè)節(jié)點(diǎn)單獨(dú)產(chǎn)生自己的一組序列號。
  • 把墻上時(shí)間戳信息(物理時(shí)鐘)附加在每個(gè)操作上。
  • 預(yù)先分配好序列號的區(qū)間范圍,比如節(jié)點(diǎn)A負(fù)責(zé)區(qū)間1~1000的序列號,節(jié)點(diǎn)B負(fù)責(zé)1001~2000。

解決方案:

  • 使用Lamport時(shí)間戳。Lamport時(shí)間戳是一個(gè)kv對(計(jì)數(shù)器,節(jié)點(diǎn)ID)。核心流程:每個(gè)節(jié)點(diǎn)以及每個(gè)客戶端都跟蹤迄今為止所見到的最大計(jì)數(shù)器,并在每個(gè)請求中附帶該最大計(jì)數(shù)器值。當(dāng)節(jié)點(diǎn)收到請求(或者回復(fù))時(shí),如果發(fā)現(xiàn)請求內(nèi)嵌的最大計(jì)數(shù)器大于節(jié)點(diǎn)自身的計(jì)數(shù)器,則它立即把自己的計(jì)數(shù)器修改為該最大值。

??分布式系統(tǒng)常見問題??

6.端到端的重復(fù)消除問題

現(xiàn)象:消息重復(fù)是非常普遍的,比如

  • 生產(chǎn)者發(fā)送消息到消費(fèi)者,消費(fèi)者消費(fèi)成功后宕機(jī),但是卻沒有更新消費(fèi)位置,消費(fèi)者重啟后就會重新消費(fèi)。
  • 常見的rpc調(diào)用,調(diào)用方因?yàn)榫W(wǎng)絡(luò)問題沒有收到被調(diào)用方的響應(yīng),選擇重試。
  • 2PC 分布式事務(wù)中,因?yàn)榫W(wǎng)絡(luò)問題,也可能出現(xiàn)重復(fù)事務(wù)的問題。
  • 用戶在頁面重復(fù)提交POST請求。

分析:端到端的重復(fù)問題是非常普遍的,在TCP 網(wǎng)絡(luò)中也需要處理重復(fù)數(shù)據(jù)包的問題。有以下兩種解決辦法:

  • 最有效的辦法之一是使操作滿足冪等性,即無論執(zhí)行一次還是多次,確保具有相同的結(jié)果。比如以下語句無論執(zhí)行多少次效果都是一致的。

???update table set v = v2 where v = v1

  • 可以為操作生成一個(gè)唯一的標(biāo)識符如(UUID),服務(wù)端對此UUID 進(jìn)行去重校驗(yàn)。

??分布式系統(tǒng)常見問題

  • 在典型的電商下單接口中采用了以上兩種方法的結(jié)合:使用唯一標(biāo)識符來進(jìn)行去重,如果寫入異常返回之前的訂單。
create table order(
  # ...
  dedup_key varchar(60) not null comment 'key to pretend order duplication',
  client_id,
  # ...
  unique uniq_dedup_key(dedup_key, client_id)
);


@Transactional
Order createOrder(Integer userId, String prodCode, Decimal amount, String dedupKey) {
  try {
    String orderId = createOrder(userId, prodCode, amount, deupKey); // insert a new order
    Order order = getOrderById(orderId); // read order from db
    order.setDuplicated(false); // 標(biāo)記是否有重復(fù)下單
    return order;
  } catch(UniqueKeyViolationException e) {
    // if duplicated order has existed, return previous order
    Order order = getOrderByDedupKey(dedupKey, clientId);
    order.setDuplicated(true);
    return order;
  } catch (Exception e) {
    // hanlde other errors and rollback transaction ...
  }
}

7.唯一性約束

現(xiàn)象:在集群高并發(fā)的環(huán)境下,用戶A創(chuàng)建用戶marquezzzz,用戶B同時(shí)創(chuàng)建了用戶marquezzzz,兩者的用戶名相同,這違背了唯一性約束。

分析:創(chuàng)建用戶名的邏輯是,先去db中查詢是否有對應(yīng)的用戶名(步驟1),如果沒有就創(chuàng)建,如果存在就更新用戶的其他信息(步驟2)。用戶A執(zhí)行了步驟1, 用戶B執(zhí)行了步驟1和2,然后用戶A執(zhí)行了步驟2,這樣生成了兩個(gè)同名的用戶。

解決方案:

  • 串行化請求,將創(chuàng)建用戶的請求串行化,比如發(fā)送到隊(duì)列中,這樣可以確保全局唯一性。
  • 在db層進(jìn)行唯一性約束,比如使用唯一索引,考慮到龐大的數(shù)據(jù)量,性能會下降。如果做了分表,唯一索引的方法也不太可行。
  • 使用分布式鎖,比如redis, zookeeper,redis偽代碼如下:
boolean r = redisClient.setnx("userName", currentThread, 10s); // 使用 setnx 原子命令
if (!r) {
    return false;
}

// 步驟1 查找db確保沒有重名

// 步驟2 插入用戶

redisClient.delete("userName");

8.時(shí)鐘問題

現(xiàn)象:在許多app中,客戶端會上報(bào)事件,但是事件的發(fā)生時(shí)間不準(zhǔn)確

分析:app客戶端時(shí)鐘可能不準(zhǔn)確,或者用戶手動(dòng)調(diào)整過系統(tǒng)時(shí)鐘。

解決方案:

為了調(diào)整不正確的設(shè)備時(shí)鐘,一種方法是記錄三個(gè)時(shí)間戳:

  1. 根據(jù)設(shè)備的時(shí)鐘,記錄事件發(fā)生的時(shí)間, device_event_time
  2. 根據(jù)設(shè)備的時(shí)鐘,記錄將事件發(fā)生到服務(wù)器的時(shí)間, device_send_time
  3. 根據(jù)服務(wù)器時(shí)鐘,記錄服務(wù)器收到事件的時(shí)間, server_receive_time

事件真實(shí)發(fā)生時(shí)間 = device_event_time + (server_receive_time - device_send_time)

三.參考

《數(shù)據(jù)密集型應(yīng)用系統(tǒng)設(shè)計(jì)》

https://cloud.tencent.com/developer/article/1121727文章來源地址http://www.zghlxwxcb.cn/news/detail-442037.html

到了這里,關(guān)于分布式系統(tǒng)常見問題的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 分布式系統(tǒng)(Distributed Systems)概述

    分布式系統(tǒng)(Distributed Systems)概述

    隨著互聯(lián)網(wǎng)的持續(xù)發(fā)展(以Web應(yīng)用為代表)、計(jì)算機(jī)應(yīng)用的深入、分布式系統(tǒng)構(gòu)建技術(shù)的日益成熟,分布式系統(tǒng)逐漸深入到人們的日常生活,并滲透到社會、經(jīng)濟(jì)、文化生活的各個(gè)方面?,F(xiàn)如今,分布式系統(tǒng)已成為主流的軟件系統(tǒng)。本文主要介紹下分布式系統(tǒng)的特征和在進(jìn)行分

    2024年02月14日
    瀏覽(23)
  • HDFS Hadoop分布式文件存儲系統(tǒng)整體概述

    HDFS Hadoop分布式文件存儲系統(tǒng)整體概述

    整體概述舉例: 包括機(jī)架 rack1、rack2 包括5個(gè)Datanode,一個(gè)Namenode( 主角色 )帶領(lǐng)5個(gè)Datanode( 從角色 ),每一個(gè)rack中包含不同的block模塊文件為 分塊存儲模式 。塊與塊之間通過replication進(jìn)行 副本備份 ,進(jìn)行冗余存儲,Namenode對存儲的 元數(shù)據(jù)進(jìn)行記錄 。該架構(gòu)可以概括為一個(gè) 抽象

    2024年02月16日
    瀏覽(88)
  • rsync+inotify實(shí)時(shí)同步 和 GFS分布式文件系統(tǒng)概述

    rsync+inotify實(shí)時(shí)同步 和 GFS分布式文件系統(tǒng)概述

    目錄 一、rsync+inotify實(shí)時(shí)同步 1.1.實(shí)時(shí)同步的優(yōu)點(diǎn) 1.2.Linux內(nèi)核的inotify機(jī)制 1.3.發(fā)起端配置rsync+Inotify 1.4.配置遠(yuǎn)程登陸 1.4.1.修改rsync源服務(wù)器配置192.168.190.101 ?編輯 ?1.4.2.配置server 192.168.190.102 二、GFS 2.1.GlusterFS簡介 2.2.GlusterFS特點(diǎn) 2.3.GlusterFS術(shù)語 2.4.模塊化堆模式架構(gòu) 2.5.Gluste

    2024年04月16日
    瀏覽(26)
  • Zabbix分布式監(jiān)控系統(tǒng)概述、部署、自定義監(jiān)控項(xiàng)、郵件告警

    Zabbix分布式監(jiān)控系統(tǒng)概述、部署、自定義監(jiān)控項(xiàng)、郵件告警

    目錄 前言 (一)業(yè)務(wù)架構(gòu) (二)運(yùn)維架構(gòu) 一、Zabbix分布式監(jiān)控平臺 (一)Zabbix概述 (二)Zabbix監(jiān)控原理 (三)Zabbix 6.0 新特性 1. Zabbix server高可用 2. Zabbix 6.0 LTS新增Kubernetes監(jiān)控功能 (四)Zabbix 6.0 功能組件 1.Zabbix Server (1)Zabbix datdbdse (2)Zabbix web 2.?Zabbix Agent (1)主動(dòng)

    2024年01月21日
    瀏覽(60)
  • 解釋什么是分布式數(shù)據(jù)庫,列舉幾種常見的分布式數(shù)據(jù)庫系統(tǒng)

    敏感信息和隱私保護(hù)是指在收集、存儲和使用個(gè)人數(shù)據(jù)時(shí),需要采取一系列措施來保護(hù)這些數(shù)據(jù)的安全和機(jī)密性,防止數(shù)據(jù)被未經(jīng)授權(quán)的第三方訪問、使用或泄露。這些措施包括加密、訪問控制、數(shù)據(jù)脫敏、數(shù)據(jù)加密、隱私政策等。 在隱私保護(hù)的技術(shù)手段方面,常用的技術(shù)包

    2024年02月08日
    瀏覽(32)
  • 在學(xué)習(xí)分布式系統(tǒng)時(shí)遇到的五個(gè)常見誤解

    哈嘍大家好,我是咸魚 我們知道,隨著企業(yè)規(guī)模或者說業(yè)務(wù)規(guī)模的不斷擴(kuò)大,為了應(yīng)對不斷增長的業(yè)務(wù)需求和提高系統(tǒng)的可伸縮性、可靠性和性能,計(jì)算機(jī)系統(tǒng)由一開始的單體系統(tǒng)逐漸發(fā)展成分布式系統(tǒng) 那么今天咸魚給大家介紹一些關(guān)于小白在學(xué)習(xí)分布式系統(tǒng)遇到的一些常

    2024年02月07日
    瀏覽(17)
  • (快手一面)分布式系統(tǒng)是什么?為什么要分布式系統(tǒng)?分布式環(huán)境下會有哪些問題?分布式系統(tǒng)是如何實(shí)現(xiàn)事務(wù)的?

    《分布式系統(tǒng)原理與泛型》中這么定義分布式系統(tǒng): “ 分布式系統(tǒng)是若干獨(dú)立計(jì)算機(jī)的集合, 這些計(jì)算機(jī)對于用戶來說就像單個(gè)相關(guān)系統(tǒng) ”, 分布式系統(tǒng)(distributed system)是建立在網(wǎng)絡(luò)之上的軟件系統(tǒng)。 就比如:用戶在使用京東這個(gè)分布式系統(tǒng)的時(shí)候,會感覺是在使用一

    2024年02月08日
    瀏覽(26)
  • 分布式鏈路追蹤概述

    分布式鏈路追蹤概述

    隨著系統(tǒng)設(shè)計(jì)變得日趨復(fù)雜,越來越多的組件開始走向分布式化,如微服務(wù)、分布式數(shù)據(jù)庫、分布式緩存等,使得后臺服務(wù)構(gòu)成了一種復(fù)雜的分布式網(wǎng)絡(luò)。往往前端的一個(gè)請求需要經(jīng)過多個(gè)微服務(wù)、跨越多個(gè)數(shù)據(jù)中心才能最終獲取到結(jié)果,如下圖 并且隨著業(yè)務(wù)的不斷擴(kuò)張,服

    2024年02月13日
    瀏覽(25)
  • PyTorch 分布式概述

    這是 torch.distributed 包的概述頁面。 由于在不同位置添加了越來越多的文檔,示例和教程,因此不清楚要針對特定??問題咨詢哪個(gè)文檔或教程,或者閱讀這些內(nèi)容的最佳順序是什么。 該頁面的目的是通過將文檔分類為不同的主題并簡要描述每個(gè)主題來解決此問題。 如果這是

    2024年02月13日
    瀏覽(17)
  • 分布式id的概述與實(shí)現(xiàn)

    分布式id的概述與實(shí)現(xiàn)

    隨著業(yè)務(wù)的增長,數(shù)據(jù)表可能要占用很大的物理存儲空間,為了解決該問題,后期使用數(shù)據(jù)庫分片技術(shù)。將一個(gè)數(shù)據(jù)庫進(jìn)行拆分,通過數(shù)據(jù)庫中間件連接。如果數(shù)據(jù)庫中該表選用ID自增策略,則可能產(chǎn)生重復(fù)的ID,此時(shí)應(yīng)該使用分布式ID生成策略來生成ID。 提示:以下是本篇文

    2024年02月07日
    瀏覽(18)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包