2019-12-06

1.分布式:

分布式系統(tǒng)就是由多個節(jié)點(diǎn)(計算機(jī)服務(wù)器)組成的系統(tǒng)。而且這些節(jié)點(diǎn)一般不是孤立的,是互通的。這些聯(lián)通的節(jié)點(diǎn)上部署了我們的節(jié)點(diǎn),并且相互的操作會有協(xié)同。

2.微服務(wù):

通常而言,微服務(wù)是一種架構(gòu)風(fēng)格,一個大型復(fù)雜軟件應(yīng)用是由一個或多個微服務(wù)組成。系統(tǒng)中的各個微服務(wù)可被獨(dú)立部署,各個微服務(wù)之間是松耦合的。每個微服務(wù)僅關(guān)注于完成一件任務(wù)并很好的完成該任務(wù)。在所有情況下每個任務(wù)代表著一個小的業(yè)務(wù)能力。

傳統(tǒng)項(xiàng)目開發(fā)應(yīng)用程序都是單體型,所有的功能和業(yè)務(wù)模塊都集中在一個項(xiàng)目中,雖然開發(fā)部署比較方便,但是后期隨著業(yè)務(wù)的不斷增加,開發(fā)迭代和性能瓶頸等問題,將會困擾開發(fā)工作工作。微服務(wù)就是解決此問題的有效手段。要用微服務(wù),涉及到的技術(shù)大致如下:

流行的微服務(wù)java項(xiàng)目框架:SpringBoot

微服務(wù)治理:Dubbo,SpringCloud

涉及技術(shù):Zookeeper,Eureka,Redis,MQ等


3.分布式環(huán)境中如何實(shí)現(xiàn)單點(diǎn)登錄與session共享

在單服務(wù)器web應(yīng)用中,登錄用戶信息只需存在該服務(wù)的session中。在分布式系統(tǒng)中,微服務(wù)已成為主流,用戶登錄由某一個單點(diǎn)服務(wù)完成并存儲session后,在高并發(fā)量的請求到達(dá)服務(wù)端的時候通過負(fù)載均衡的方式分發(fā)到集群中的某個服務(wù)器,這樣就有可能導(dǎo)致同一個用戶的多次請求被分發(fā)到集群的不同服務(wù)器上,就會出現(xiàn)取不到session的情況;

目前實(shí)現(xiàn)session共享的解決方案:

(1)Session復(fù)制與共享 ?

多個server之間相互同步session,這樣每個server上都包含全部Service的session。

優(yōu)點(diǎn):tomcat等多數(shù)主流web服務(wù)器都支持此功能。

不足:session同步需要數(shù)據(jù)傳輸,占內(nèi)網(wǎng)帶寬,有時延。所有服務(wù)器都包含所有session數(shù)據(jù),特別是當(dāng)session中保存了較大的對象,而且對象變化較快時,性能下降顯著,這種特性使得web應(yīng)用的水平擴(kuò)展受到了限制。

(2)客戶端存儲法

服務(wù)端存儲所有用戶的session,內(nèi)存占用較大,也可以將session存儲到瀏覽器cookie中,每個端只要存儲一個用戶的數(shù)據(jù)了

優(yōu)點(diǎn):服務(wù)端不需要存儲

缺點(diǎn):每次http請求都攜帶session,占外網(wǎng)帶寬,數(shù)據(jù)存儲在端上,并在網(wǎng)絡(luò)傳輸,存在泄漏,篡改,竊取等安全隱患。Session存儲的數(shù)據(jù)大小受cookie限制。

(3)反向代理hash一致性

為了保證高可用,有多臺冗余,反向代理層能不能做一些事情,讓同一個用戶的請求保證落在一臺web服務(wù)上呢?

具體方案:反向代理層使用IP或http協(xié)議中的某些業(yè)務(wù)參數(shù)來做hash,以保證同一個瀏覽器用戶的請求落在同一個web服務(wù)器上。

優(yōu)點(diǎn):只需要改nginx配置,不用改應(yīng)用代碼,負(fù)載均衡,只要hash屬性是均勻的,多臺web服務(wù)器是均衡的??梢灾С謜eb服務(wù)器水平擴(kuò)展

缺點(diǎn):如果web服務(wù)器重啟,一部分session會丟失,產(chǎn)生業(yè)務(wù)影響,例如部分用戶重新登陸。如果web服務(wù)器水平擴(kuò)展,rehash后session重新分布,也會有一部分用戶路由不到正確的session。

(4)服務(wù)器端集中存儲

將session存儲在后端的存儲層,如:數(shù)據(jù)庫或者緩存??蛻舳嗣堪l(fā)一次請求,都會從存儲中獲取 ,再處理具體的業(yè)務(wù)邏輯。

優(yōu)點(diǎn):無安全隱患,可以水平擴(kuò)展,服務(wù)器重啟或者擴(kuò)容都不會造成session丟失。

不足:增加了一次網(wǎng)絡(luò)調(diào)用,要修改應(yīng)用代碼。

總結(jié):一般對于單點(diǎn)登錄和session共享的處理,大都選擇在服務(wù)端集中存儲來實(shí)現(xiàn)。對于db存儲還是cache,肯定cache是首選。因?yàn)閟ession讀取的頻率很高,使用數(shù)據(jù)庫壓力會比較大。如果有session高可用需求,cache可以做高可用,但大部分情況下session可以丟失,一般也不需要考慮高可用。目前主流的實(shí)現(xiàn)方案是用redis實(shí)現(xiàn)session的存儲。

4.分布式環(huán)境下的事務(wù)處理方案

對于分布式事務(wù)來說,事務(wù)的每個操作步驟是運(yùn)行在不同機(jī)器上的服務(wù)的。本質(zhì)上說,分布式事務(wù)是為了保證不同數(shù)據(jù)庫的數(shù)據(jù)一致性。

事務(wù)的ACID特性:原子性,一致性,隔離性,持久性。

解決方案:

(1)消息事務(wù)+最終一致性

消息事務(wù)就是基于消息中間件的兩階段提交,本質(zhì)上是對消息中間件的一種特殊利用,它是將本地事務(wù)和發(fā)消息放在了一個分布式事務(wù)里,保證要么本地操作成功并且對外發(fā)消息成功,要么兩者都失敗。以支付寶轉(zhuǎn)賬到余額寶為例,當(dāng)支付寶賬戶扣除1萬后,只要生成一個憑證(消息)即可,這個憑證(消息)上寫著“讓余額寶賬戶增加1萬“,只要這個憑證能可靠保存,我們最終是可以拿著這個憑證讓余額寶賬戶增加1萬的,即我們能依靠這個憑證完成最終一致性。

(2)TCC編程模式

TCC提供了一個編程框架,將整個業(yè)務(wù)邏輯分為三塊:Try,Confirm和Cancel 三個操作。以在線下單為例,Try階段會去扣庫存,Confirm階段則是去更新訂單狀態(tài),如果更新訂單失敗,則進(jìn)入Cancel階段,會去恢復(fù)庫存??傊?,TCC就是通過代碼人為實(shí)現(xiàn)了兩階段提交,不同的業(yè)務(wù)場景所寫的代碼都不一樣,復(fù)雜度也不一樣,因此,這種模式并不能很好地被復(fù)用。

5.Zookeepeer的原理及選舉機(jī)制

Zookeeper是一個分布式的,開放源碼的分布式應(yīng)用程序協(xié)調(diào)服務(wù),是Google的Chubby一個開源的實(shí)現(xiàn),它是集群的管理者,監(jiān)視著集群中各個節(jié)點(diǎn)的狀態(tài)根據(jù)節(jié)點(diǎn)提交的反饋進(jìn)行下一步合理操作。Zookeeper 可以作為服務(wù)協(xié)調(diào)的注冊中心,還可以做分布式鎖。它作為注冊中心,主要存儲的數(shù)據(jù)是ip,端口,還有心跳機(jī)制。

Zookeeper做集群做好是奇數(shù)個,她的集群管理主要檢查是否有機(jī)器的退出和加入,選舉maste。Zookeeper的角色主要分為:Leader,Follower,Observer.Leader主機(jī)負(fù)責(zé)讀和寫,F(xiàn)ollower負(fù)責(zé)讀,并將寫操作轉(zhuǎn)發(fā)給Leader,Follower還參與Leader選舉投票。Observer充當(dāng)觀察者的角色,不參與投票。當(dāng)Leader不可用時,會重新選舉Leader。超過半數(shù)的Follower選舉投票即可。

6.使用Redis做緩存有哪些優(yōu)勢

Redis是內(nèi)存式緩存,它的存取是純內(nèi)存操作,因此性能非常出色,每秒可處理超過1 0萬次讀寫,它的優(yōu)勢如下:

a內(nèi)存式緩存,讀寫速度特別快;

b支持豐富的數(shù)據(jù)類型:String, list ,set, sorted set,hash;

c支持事務(wù),操作都是原子性,所謂原子性就是對數(shù)據(jù)的更改要么全部執(zhí)行,要么全部不執(zhí)行;

d豐富的特性:可用于緩存,消息,按key設(shè)置過期時間,過期后自動清除;

線程,單進(jìn)程,采用IO多路復(fù)用技術(shù);

7.分布式系統(tǒng)中如何生成唯一ID

1)數(shù)據(jù)庫自增長序列實(shí)現(xiàn)

優(yōu)點(diǎn):a簡單代碼方便,性能可以接受。

b數(shù)字ID天然排序,對分頁或者需要排序的結(jié)果很有幫助;

缺點(diǎn):

a不同數(shù)據(jù)庫語法和實(shí)現(xiàn)不同,數(shù)據(jù)庫遷移的時候或多數(shù)據(jù)庫版本支持的時候需 b要處理;

c在單個數(shù)據(jù)庫或讀寫分離或一主多從的情況下,只有一個主庫可以生成,有單點(diǎn)故障的風(fēng)險

d在性能達(dá)不到要求的情況下,比較難于擴(kuò)展;

e如果遇見多個系統(tǒng)需要合并或者涉及到數(shù)據(jù)遷移會相當(dāng)復(fù)雜;

f分表分庫的時候會麻煩;

2)通過UUID實(shí)現(xiàn)

可以利用數(shù)據(jù)庫也可以利用程序生成

優(yōu)點(diǎn)A簡單,代碼方便

B基本不會有性能問題

C全球唯一,在遇見數(shù)據(jù)遷移,系統(tǒng)數(shù)據(jù)合并,或者數(shù)據(jù)庫變更等情況下,可以從容應(yīng)對。

缺點(diǎn):

A沒有排序,無法保證趨勢遞增。

B UUID往往使用字符串存儲,查詢的效率比較低

C存儲空間比較大,如果是海量數(shù)據(jù)庫,就需要考慮存儲量的問題了

D傳輸數(shù)據(jù)量大,不可讀。

3)Redis生成ID

當(dāng)使用數(shù)據(jù)庫來生成ID性能不夠要求的時候,可以使用Redis來生成ID。這主要依賴于Redis是單線程的,所以也可以生成全局唯一的ID??梢杂肦edis的原子操作INCR和INCRBY來實(shí)現(xiàn)。可以使用Redis集群來獲取更高的吞吐量。假如一個集群中有5臺Redis,可以初始化每臺Redis的值分別是1,2,3,4,5;然后步長都是5.各個Redis生成的ID為:

A:1,6,11,16,21

B: 2,7,12,17,22

C:3,8,13,18,23

D:4,9,14,19,24

E:5,10,15,20,25

優(yōu)點(diǎn):

A不依賴于數(shù)據(jù)庫,靈活方便,且性能優(yōu)于數(shù)據(jù)庫。

B數(shù)字ID天然排序,對分頁或者需要排序的結(jié)果很有幫助。

缺點(diǎn):

A如果系統(tǒng)中沒有Redis,還需要引入新的組件增加系統(tǒng)復(fù)雜度。

B需要編碼和配置的工作量比較大。

4)Twitter的snowflake算法

? ? Snowflake是Twitter開源的分布式ID生成算法,結(jié)果是一個long型的ID。其核心思 想是:使用41bit作為毫秒數(shù),10bit作為機(jī)器的ID(5個bit是數(shù)據(jù)中心,5個bit的機(jī) ??? 器ID),12bit作為毫秒內(nèi)的流水號(意味著每個節(jié)點(diǎn)在每毫秒可以產(chǎn)生4096個ID), 最后 ?? 還有一個符號位,永遠(yuǎn)是0。

? ? Snowflake算法可以根據(jù)自身項(xiàng)目需要進(jìn)行一定的修改,比如估算未來的數(shù)據(jù)中心個數(shù),每個數(shù)據(jù)中心的機(jī)器數(shù)以及統(tǒng)一毫秒可以并發(fā)數(shù)來調(diào)整在算法中所需要的bit數(shù)。

優(yōu)點(diǎn);

A不依賴于數(shù)據(jù)庫,靈活方便,且性能優(yōu)于數(shù)據(jù)庫。

B ID按照時間在單機(jī)上遞增的

缺點(diǎn);

A在單機(jī)上是遞增的,但是由于涉及到分布式環(huán)境,每臺機(jī)器上的時鐘不可能完 全同步,也許有時候也會出現(xiàn)不是全局遞增的情況。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一、微服務(wù)介紹 1. 什么是微服務(wù) 在介紹微服務(wù)時,首先得先理解什么是微服務(wù),顧名思義,微服務(wù)得從兩個方面去理解,...
    阿南的生活記錄閱讀 465評論 0 3
  • 在日常工作中,我們會有時會開慢查詢?nèi)ビ涗浺恍﹫?zhí)行時間比較久的SQL語句,找出這些SQL語句并不意味著完事了,些時我...
    菜鳥爬坑閱讀 123評論 0 0
  • 中三那年,男孩追著女孩的閨密,追著追著,女孩便跟男孩認(rèn)識了。兩個人雖然不是很熟,但女孩因?yàn)楸荒泻⒌臎Q心打動了,便幫...
    懿沫閱讀 485評論 0 0
  • 五月,立夏過后,春花凋謝,但小滿是一個充滿禪意的節(jié)氣,繁華已過,成熟未滿。小滿,承接著春天成長之美,在夏天撐開收獲...
    請叫我小婁閱讀 362評論 0 0
  • 一盞燈照亮 一座城尋找找一人 一路的顛沛流離 飛得越高 路過的世界就越寬
    走讀生Zoudusheng閱讀 98評論 0 0

友情鏈接更多精彩內(nèi)容