松花皮蛋的黑板報
  • 分享在京東工作的技術感悟,還有JAVA技術和業內最佳實踐,大部分都是務實的、能看懂的、可復現的

掃一掃
關注公眾號

ARTS-13-分布式系統入門和實踐筆記

博客首頁文章列表 松花皮蛋me 2019-06-09 21:17

ARTS的初衷

Algorithm: 主要是為了編程訓練和學習。

Review:主要是為了學習英文

Tip:主要是為了總結和歸納在日常工作中所遇到的知識點。學習至少一個技術技巧。在工作中遇到的問題,踩過的坑,學習的點滴知識。

Share:主要是為了建立影響力,能夠輸出價值觀。分享一篇有觀點和思考的技術文章

https://www.zhihu.com/question/301150832

一、Algorithm

Plus One

Given a non-empty array of digits representing a non-negative integer, plus one to the integer.

The digits are stored such that the most significant digit is at the head of the list, and each element in the array contain a single digit.

You may assume the integer does not contain any leading zero, except the number 0 itself.

Example 1:

Input: [1,2,3]
Output: [1,2,4]
Explanation: The array represents the integer 123.
Example 2:

Input: [4,3,2,1]
Output: [4,3,2,2]
Explanation: The array represents the integer 4321.

class Solution {
    public int[] plusOne(int[] digits) {
        if(digits==null || digits.length==0) {
            return digits;
        }
        //123 => 124,999=>1000
        int tmp = 1;
        for(int i=digits.length-1;i>=0;i--) {
            int digit = (digits[i]+tmp)%10;
            tmp = (digits[i]+tmp)/10;
            digits[i] = digit;
            if(tmp==0) {
                return digits;
            }
        }
        int[] res =  new int[digits.length+1];
        res[0] = 1;
        return res;
    }
}

二、Review

分布式系統設計的基礎-CAP理論,描述的是在異步網絡中的讀寫存儲系統中無法同時滿足下面的三個條件

1、一致性,所有節點看到的讀寫操作結果都是一樣的(Consistency – all executions of reads and writes seen by all nodes be atomic or linearizably consistent)
2、可靠性,請求總能獲取正常響應(Availability – a request made to the data store always eventually complete)
3、分區容忍性,允許網絡中的消息丟失(Partition tolerance – the network is allowed to drop any messages)

出于可靠性的考慮,數據通常會被復制為多個副本,所以還需要強一致性保證讀寫行為

一致性里面還有一種形態是最終一致性。無法做到強一致性時,采用適合的方式達到最終一致性,這其實就是BASE理論,ES和Kafka都是最終一致性系統

然而異步網絡并不總是可靠的,一致性和可靠性必須二選一,在這種情況下你只能返回一個不是最新的值,或者擁塞等待(長時間等待potentially forever)同步,后者不可取

異步網絡是指存在系統時鐘差異(Your nodes have clocks that may drift apart)和消息延遲傳遞(System processes may arbitrarily delay delivery of a message (due to retries, or GC pauses)

三選二組合模型有,CA模型,它不能容忍網絡錯誤或者節點錯誤,比如兩階段提交(2PC);CP模型,它關注的是保證大多數節點數據一致,比如Paxos共識算法;AP模型,它關注的可用性和分區容忍性

分布式系統中還有一種常常被相提并論的FLP不可能性理論(FLP result),它描述的是:在網絡可靠,并且允許節點失效(即便只有一個)的最小化異步模型系統中,不存在一個可以解決一致性問題的確定性共識算法。FLP理論與CAP理論的區別是它是靜默失敗的,同時不允許消息丟失(FLP permits the possibility of one ‘failed’ node which is totally partitioned from the network and does not have to respond to requests。Otherwise, FLP does not allow message loss; the network is only asynchronous but not lossy。FLP deals with consensus, which is a similar but different problem to atomic storage)

分布式系統實踐筆記:

1、Distributed systems are different because they fail often。分布式系統并不是將數據傳輸到多臺主機中,失敗時簡單地一直重試直到成功。有可能僅僅是部分失敗,也有可能是成功將數據寫入領導者,由于GC導致無法將數據復制給追隨者,所以分布式系統中需要充分考慮好失敗設計
2、Writing robust distributed systems costs more than writing robust single-machine systems。資源使用更多
3、Robust, open source distributed systems are much less common than robust, single-machine systems。健壯性不如單機應用
4、Coordination is very hard。Paxos共享算法應該是從知道到放棄最經典的詮釋了,少有工程師能實現這個算法,可想而知CP模型實現是有多困難
5、If you can fit your problem in memory, it’s probably trivial,將單機應用的問題排查技巧生搬硬套到分布式系統中是徒勞的
6、 “It’s slow” is the hardest problem you’ll ever debug。Dapper和Zipkin鏈路跟蹤系統為此而生
7、 Implement backpressure throughout your system。數據流從上游生產者向下游消費者傳輸的過程中,上游生產速度大于下游消費速度,導致下游的Buffer溢出,這種現象就叫做Backpressure出現,這種現象出現時我們需要將部分數據扔掉或者將錯誤直接返回,避免雪崩。另外在進行RPC連接時實現超時設計和指數補償是完全有必要的,當連接失敗時,睡眠一段時間后再重試,每失敗一次睡眠的時間就延長一些
8、Find ways to be partially available。大部分搜索系統設計都滿足部分可用原則,當超時時間到達時,無論檢索出什么結果都先返回給用戶
9、Metrics are the only way to get your job done。監控
10、Use percentiles, not averages,監控指標衡量使用百分比(50th, 99th, 99.9th, 99.99th)而不是平均數\中位數,因為它能讓我們更好地了解真實分布
11、Learn to estimate your capacity,學會估算系統的承載力,感興趣的讀者自行閱讀http://bigocheatsheet.com/和http://www.cs.cornell.edu/projects/ladis2009/talks/dean-keynote-ladis2009.pdf
12、Feature flags are how infrastructure is rolled out. 通過AB測試獲取功能反饋
13、Choose id spaces wisely 保證序列號標識ID充足,不推薦使用DB默認的自增生成,容易暴露業務如一天訂單情況
14、Exploit data-locality。每當CPU要讀取內存的時候,它會讀取一整個緩存頁,你能把越多你可能用到的數據擠到這個數據頁里面,你就跑得更快,所以盡可能地提高數據的局部性
15、Writing cached data back to persistent storage is bad。If the implementers talk about “Russian-doll caching”, you have a large chance of hitting highly visible bugs,一種稱為「俄羅斯套娃」的緩存機制(緩存嵌套)有潛在的可見性bugs,和標題好像不相關啊?我認為它描述的是更新數據時,如果處理緩存和DB才能保證可見性吧。我的理解是,讀請求,不要求強一致性的讀請求,走緩存,要求強一致性的直接從DB讀取。寫請求,數據首先都寫到數據庫,之后更新緩存(先寫緩存再寫DB的話,寫入失敗后事務回滾可能會造成緩存與DB數據不一致)。刪除操作,先刪除DB再刪除緩存
16、Computers can do more than you think they can。嗯嗯,CPU處理能力確實以火箭的速度在提升,IO處理能力則是以火車的速度
17、Use the CAP theorem to critique systems. 使用CAP原則重構系統
18、Extract services。分層設計,隱藏內部實現,對外提供服務API,類似七層計算機模型,只需要關注下一層的實現而不用關心更低層的實現

參考英文文章:

https://www.the-paper-trail.org/page/cap-faq/
https://www.the-paper-trail.org/blog/a-brief-tour-of-flp-impossibility/
https://www.somethingsimilar.com/2013/01/14/notes-on-distributed-systems-for-young-bloods/
https://en.wikipedia.org/wiki/Exponential_backoff
https://www.dynatrace.com/news/blog/why-averages-suck-and-percentiles-are-great/

三、Tip

1、618大促要來臨了,友商開始蠢蠢欲動,開屏廣告和點擊彈窗跳轉,流量劫持一般是修改js文件,這里推薦一個前端神器Subresource Integrity,它是通過生成文件的唯一hash值進行對比校驗的,它能有效減少劫持

2、JAVA8中的Stream是如何高效遍歷集合的?

List<String> names = Arrays.asList(" 張三 ", " 李四 ", " 王老五 ", " 李三 ", " 劉老四 ", " 王小二 ", " 張四 ", " 張五六七 ");

String maxLenStartWithZ = names.stream()
                    .parallel()
                    .filter(name -> name.startsWith(" 張 "))
                    .mapToInt(String::length)
                    .max()
                    .toString();

從大的設計方向上來說,Stream將整個操作分解為了鏈式結構,不僅簡化了遍歷操作,還為實現了并行計算打下了基礎。從小的分類方向上來說,Stream將遍歷元素的操作和對元素的計算分為中間操作和終結操作,而中間操作又根據元素之間狀態有無干擾分為有狀態和無狀態操作,實現了鏈結構中的不同階段

在串行處理操作中,Stream在執行每一步中間操作時,并不會做實際的數據操作處理,而是將這些中間操作串聯起來,最終由終結操作觸發,生成一個數據處理鏈表,通過Java8中的Spliterator迭代器進行數據處理;此時,每執行一次迭代,就對所有的無狀態的中間操作進行數據處理,而對有狀態的中間操作,就需要迭代處理完所有的數據,再進行處理操作;最后就是進行終結操作的數據處理

在并行處理操作中,Stream對中間操作基本跟串行處理方式是一樣的,但在終結操作中,Stream將結合 ForkJoin框架對集合進行切片處理,ForkJoin框架將每個切片的處理結果Join合并起來

四、Share

我們應該從JAVA集合中學到什么

我為什么會義無反顧地支持付費閱讀

黑龙江6+1开奖结果查询