分佈式事務_網頁設計公司

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

透過選單樣式的調整、圖片的縮放比例、文字的放大及段落的排版對應來給使用者最佳的瀏覽體驗,所以不用擔心有手機版網站兩個後台的問題,而視覺效果也是透過我們前端設計師優秀的空間比例設計,不會因為畫面變大變小而影響到整體視覺的美感。

 

  
眾所周知,數據庫能實現本地事務,也就是在同一個數據庫中,你可以允許一組操作要麼全都正確執行,要麼全都不執行。這裏特彆強調了本地事務,也就是目前的數據庫只能支持同一個數據庫中的事務。但現在的系統往往採用微服務架構,業務系統擁有獨立的數據庫,因此就出現了跨多個數據庫的事務需求,這種事務即為“分佈式事務”。那麼在目前數據庫不支持跨庫事務的情況下,我們應該如何實現分佈式事務呢?本文首先會為大家梳理分佈式事務的基本概念和理論基礎,然後介紹幾種目前常用的分佈式事務解決方案。廢話不多說,那就開始吧~

1 什麼是事務?

  事務由一組操作構成,我們希望這組操作能夠全部正確執行,如果這一組操作中的任意一個步驟發生錯誤,那麼就需要回滾之前已經完成的操作。也就是同一個事務中的所有操作,要麼全都正確執行,要麼全都不要執行。

2 事務的四大特性 ACID

  說到事務,就不得不提一下事務著名的四大特性。

  • 原子性

      原子性要求,事務是一個不可分割的執行單元,事務中的所有操作要麼全都執行,要麼全都不執行。

  • 一致性

      一致性要求,事務在開始前和結束后,數據庫的完整性約束沒有被破壞。

  • 隔離性

      事務的執行是相互獨立的,它們不會相互干擾,一個事務不會看到另一個正在運行過程中的事務的數據。

  • 持久性

      持久性要求,一個事務完成之後,事務的執行結果必須是持久化保存的。即使數據庫發生崩潰,在數據庫恢復後事務提交的結果仍然不會丟失

 

注意:事務只能保證數據庫的高可靠性,即數據庫本身發生問題后,事務提交后的數據仍然能恢復;而如果不是數據庫本身的故障,如硬盤損壞了,那麼事務提交的數據可能就丟失了。這屬於『高可用性』的範疇。因此,事務只能保證數據庫的『高可靠性』,而『高可用性』需要整個系統共同配合實現。

3 事務的隔離級別

  這裏擴展一下,對事務的隔離性做一個詳細的解釋。

  在事務的四大特性ACID中,要求的隔離性是一種嚴格意義上的隔離,也就是多個事務是串行執行的,彼此之間不會受到任何干擾。這確實能夠完全保證數據的安全性,但在實際業務系統中,這種方式性能不高。因此,數據庫定義了四種隔離級別,隔離級別和數據庫的性能是呈反比的,隔離級別越低,數據庫性能越高,而隔離級別越高,數據庫性能越差。

3.1 事務併發執行會出現的問題

  我們先來看一下在不同的隔離級別下,數據庫可能會出現的問題:

    1. 更新丟失

      當有兩個併發執行的事務,更新同一行數據,那麼有可能一個事務會把另一個事務的更新覆蓋掉。 當數據庫沒有加任何鎖操作的情況下會發生。

    2. 臟讀

      一個事務讀到另一個尚未提交的事務中的數據。 該數據可能會被回滾從而失效。 如果第一個事務拿着失效的數據去處理那就發生錯誤了。

    3. 不可重複讀

      不可重複度的含義:一個事務對同一行數據讀了兩次,卻得到了不同的結果。它具體分為如下兩種情況:

      •   虛讀:在事務1兩次讀取同一記錄的過程中,事務2對該記錄進行了修改,從而事務1第二次讀到了不一樣的記錄。
      •   幻讀:事務1在兩次查詢的過程中,事務2對該表進行了插入、刪除操作,從而事務1第二次查詢的結果發生了變化。

不可重複讀 與 臟讀 的區別? 臟讀讀到的是尚未提交的數據,而不可重複讀讀到的是已經提交的數據,只不過在兩次讀的過程中數據被另一個事務改過了。

3.2 數據庫的四種隔離級別

  數據庫一共有如下四種隔離級別:

  1. Read uncommitted 讀未提交

    在該級別下,一個事務對一行數據修改的過程中,不允許另一個事務對該行數據進行修改,但允許另一個事務對該行數據讀。 因此本級別下,不會出現更新丟失,但會出現臟讀、不可重複讀。

  2. Read committed 讀提交

    在該級別下,未提交的寫事務不允許其他事務訪問該行,因此不會出現臟讀;但是讀取數據的事務允許其他事務的訪問該行數據,因此會出現不可重複讀的情況。

  3. Repeatable read 重複讀

    在該級別下,讀事務禁止寫事務,但允許讀事務,因此不會出現同一事務兩次讀到不同的數據的情況(不可重複讀),且寫事務禁止其他一切事務。

  4. Serializable 序列化

    該級別要求所有事務都必須串行執行,因此能避免一切因併發引起的問題,但效率很低。

  隔離級別越高,越能保證數據的完整性和一致性,但是對併發性能的影響也越大。對於多數應用程序,可以優先考慮把數據庫系統的隔離級別設為Read Committed。它能夠避免臟讀取,而且具有較好的併發性能。儘管它會導致不可重複讀、幻讀和第二類丟失更新這些併發問題,在可能出現這類問題的個別場合,可以由應用程序採用悲觀鎖或樂觀鎖來控制。

4 什麼是分佈式事務?

  到此為止,所介紹的事務都是基於單數據庫的本地事務,目前的數據庫僅支持單庫事務,並不支持跨庫事務。而隨着微服務架構的普及,一個大型業務系統往往由若干個子系統構成,這些子系統又擁有各自獨立的數據庫。往往一個業務流程需要由多個子系統共同完成,而且這些操作可能需要在一個事務中完成。在微服務系統中,這些業務場景是普遍存在的。此時,我們就需要在數據庫之上通過某種手段,實現支持跨數據庫的事務支持,這也就是大家常說的“分佈式事務”。

這裏舉一個分佈式事務的典型例子——用戶下單過程。 當我們的系統採用了微服務架構后,一個電商系統往往被拆分成如下幾個子系統:商品系統、訂單系統、支付系統、積分系統等。整個下單的過程如下:

  1. 用戶通過商品系統瀏覽商品,他看中了某一項商品,便點擊下單
  2. 此時訂單系統會生成一條訂單
  3. 訂單創建成功后,支付系統提供支付功能
  4. 當支付完成后,由積分系統為該用戶增加積分

上述步驟2、3、4需要在一個事務中完成。對於傳統單體應用而言,實現事務非常簡單,只需將這三個步驟放在一個方法A中,再用Spring的@Transactional註解標識該方法即可。Spring通過數據庫的事務支持,保證這些步驟要麼全都執行完成,要麼全都不執行。但在這個微服務架構中,這三個步驟涉及三個系統,涉及三個數據庫,此時我們必須在數據庫和應用系統之間,通過某項黑科技,實現分佈式事務的支持。

5 CAP理論

CAP理論說的是:在一個分佈式系統中,最多只能滿足C、A、P中的兩個需求。

CAP的含義:

  • C:Consistency 一致性

    同一數據的多個副本是否實時相同。

  • A:Availability 可用性

    可用性:一定時間內 & 系統返回一個明確的結果 則稱為該系統可用。

  • P:Partition tolerance 分區容錯性

    將同一服務分佈在多個系統中,從而保證某一個系統宕機,仍然有其他系統提供相同的服務。

  CAP理論告訴我們,在分佈式系統中,C、A、P三個條件中我們最多只能選擇兩個。那麼問題來了,究竟選擇哪兩個條件較為合適呢?

對於一個業務系統來說,可用性和分區容錯性是必須要滿足的兩個條件,並且這兩者是相輔相成的。業務系統之所以使用分佈式系統,主要原因有兩個:

  • 提升整體性能

    當業務量猛增,單個服務器已經無法滿足我們的業務需求的時候,就需要使用分佈式系統,使用多個節點提供相同的功能,從而整體上提升系統的性能,這就是使用分佈式系統的第一個原因。

  • 實現分區容錯性

    單一節點 或 多個節點處於相同的網絡環境下,那麼會存在一定的風險,萬一該機房斷電、該地區發生自然災害,那麼業務系統就全面癱瘓了。為了防止這一問題,採用分佈式系統,將多個子系統分佈在不同的地域、不同的機房中,從而保證系統高可用性。

  這說明分區容錯性是分佈式系統的根本,如果分區容錯性不能滿足,那使用分佈式系統將失去意義。

  此外,可用性對業務系統也尤為重要。在大談用戶體驗的今天,如果業務系統時常出現“系統異常”、響應時間過長等情況,這使得用戶對系統的好感度大打折扣,在互聯網行業競爭激烈的今天,相同領域的競爭者不甚枚舉,系統的間歇性不可用會立馬導致用戶流向競爭對手。因此,我們只能通過犧牲一致性來換取系統的可用性分區容錯性。這也就是下面要介紹的BASE理論。

6 BASE理論

  CAP理論告訴我們一個悲慘但不得不接受的事實——我們只能在C、A、P中選擇兩個條件。而對於業務系統而言,我們往往選擇犧牲一致性來換取系統的可用性和分區容錯性。不過這裏要指出的是,所謂的“犧牲一致性”並不是完全放棄數據一致性,而是犧牲強一致性換取弱一致性。下面來介紹下BASE理論。

  • BA:Basic Available 基本可用S:Soft State:柔性狀態 同一數據的不同副本的狀態,可以不需要實時一致。
    • 整個系統在某些不可抗力的情況下,仍然能夠保證“可用性”,即一定時間內仍然能夠返回一個明確的結果。只不過“基本可用”和“高可用”的區別是:
      • “一定時間”可以適當延長 當舉行大促時,響應時間可以適當延長
      • 給部分用戶返回一個降級頁面 給部分用戶直接返回一個降級頁面,從而緩解服務器壓力。但要注意,返回降級頁面仍然是返回明確結果。
  • E:Eventual Consisstency:最終一致性 同一數據的不同副本的狀態,可以不需要實時一致,但一定要保證經過一定時間后仍然是一致的。

7 酸鹼平衡

  ACID能夠保證事務的強一致性,即數據是實時一致的。這在本地事務中是沒有問題的,在分佈式事務中,強一致性會極大影響分佈式系統的性能,因此分佈式系統中遵循BASE理論即可。但分佈式系統的不同業務場景對一致性的要求也不同。如交易場景下,就要求強一致性,此時就需要遵循ACID理論,而在註冊成功后發送短信驗證碼等場景下,並不需要實時一致,因此遵循BASE理論即可。因此要根據具體業務場景,在ACID和BASE之間尋求平衡。

8 分佈式事務協議

  下面介紹幾種實現分佈式事務的協議。

8.1 兩階段提交協議 2PC

分佈式系統的一個難點是如何保證架構下多個節點在進行事務性操作的時候保持一致性。為實現這個目的,二階段提交算法的成立基於以下假設:

  • 該分佈式系統中,存在一個節點作為協調者(Coordinator),其他節點作為參与者(Cohorts)。且節點之間可以進行網絡通信。
  • 所有節點都採用預寫式日誌,且日誌被寫入后即被保持在可靠的存儲設備上,即使節點損壞不會導致日誌數據的消失。
  • 所有節點不會永久性損壞,即使損壞后仍然可以恢復。

1. 第一階段(投票階段):

  1. 協調者節點向所有參与者節點詢問是否可以執行提交操作(vote),並開始等待各參与者節點的響應。
  2. 參与者節點執行詢問發起為止的所有事務操作,並將Undo信息和Redo信息寫入日誌。(注意:若成功這裏其實每個參与者已經執行了事務操作)
  3. 各參与者節點響應協調者節點發起的詢問。如果參与者節點的事務操作實際執行成功,則它返回一個”同意”消息;如果參与者節點的事務操作實際執行失敗,則它返回一個”中止”消息。

2. 第二階段(提交執行階段):

  當協調者節點從所有參与者節點獲得的相應消息都為”同意”時:

  1. 協調者節點向所有參与者節點發出”正式提交(commit)”的請求。
  2. 參与者節點正式完成操作,並釋放在整個事務期間內佔用的資源。
  3. 參与者節點向協調者節點發送”完成”消息。
  4. 協調者節點受到所有參与者節點反饋的”完成”消息后,完成事務。

  如果任一參与者節點在第一階段返回的響應消息為”中止”,或者 協調者節點在第一階段的詢問超時之前無法獲取所有參与者節點的響應消息時:

  1. 協調者節點向所有參与者節點發出”回滾操作(rollback)”的請求。
  2. 參与者節點利用之前寫入的Undo信息執行回滾,並釋放在整個事務期間內佔用的資源。
  3. 參与者節點向協調者節點發送”回滾完成”消息。
  4. 協調者節點受到所有參与者節點反饋的”回滾完成”消息后,取消事務。

  不管最後結果如何,第二階段都會結束當前事務。

  二階段提交看起來確實能夠提供原子性的操作,但是不幸的事,二階段提交還是有幾個缺點的:

  1. 執行過程中,所有參与節點都是事務阻塞型的。當參与者佔有公共資源時,其他第三方節點訪問公共資源不得不處於阻塞狀態。
  2. 參与者發生故障。協調者需要給每個參与者額外指定超時機制,超時后整個事務失敗。(沒有多少容錯機制)
  3. 協調者發生故障。參与者會一直阻塞下去。需要額外的備機進行容錯。(這個可以依賴後面要講的Paxos協議實現HA)
  4. 二階段無法解決的問題:協調者再發出commit消息之後宕機,而唯一接收到這條消息的參与者同時也宕機了。那麼即使協調者通過選舉協議產生了新的協調者,這條事務的狀態也是不確定的,沒人知道事務是否被已經提交。

為此,Dale Skeen和Michael Stonebraker在“A Formal Model of Crash Recovery in a Distributed System”中提出了三階段提交協議(3PC)。

8.2 三階段提交協議 3PC

  與兩階段提交不同的是,三階段提交有兩個改動點。

  • 引入超時機制。同時在協調者和參与者中都引入超時機制。
  • 在第一階段和第二階段中插入一個準備階段。保證了在最後提交階段之前各參与節點的狀態是一致的。

  也就是說,除了引入超時機制之外,3PC把2PC的準備階段再次一分為二,這樣三階段提交就有CanCommit、PreCommit、DoCommit三個階段。

1. CanCommit階段

  3PC的CanCommit階段其實和2PC的準備階段很像。協調者向參与者發送commit請求,參与者如果可以提交就返回Yes響應,否則返回No響應。

  1. 事務詢問

    協調者向參与者發送CanCommit請求。詢問是否可以執行事務提交操作。然後開始等待參与者的響應。

  2. 響應反饋

    參与者接到CanCommit請求之後,正常情況下,如果其自身認為可以順利執行事務,則返回Yes響應,並進入預備狀態。否則反饋No

2. PreCommit階段

  協調者根據參与者的反應情況來決定是否可以記性事務的PreCommit操作。根據響應情況,有以下兩種可能。 假如協調者從所有的參与者獲得的反饋都是Yes響應,那麼就會執行事務的預執行。

  1. 發送預提交請求

    協調者向參与者發送PreCommit請求,並進入Prepared階段。

  2. 事務預提交

    參与者接收到PreCommit請求后,會執行事務操作,並將undo和redo信息記錄到事務日誌中。

  3. 響應反饋

    如果參与者成功的執行了事務操作,則返回ACK響應,同時開始等待最終指令。

假如有任何一個參与者向協調者發送了No響應,或者等待超時之後,協調者都沒有接到參与者的響應,那麼就執行事務的中斷。

  1. 發送中斷請求

    協調者向所有參与者發送abort請求。

  2. 中斷事務

    參与者收到來自協調者的abort請求之後(或超時之後,仍未收到協調者的請求),執行事務的中斷。

    南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

    搬家費用:依消費者運送距離、搬運樓層、有無電梯、步行距離、特殊地形、超重物品等計價因素後,評估每車次單

3. doCommit階段 該階段進行真正的事務提交,也可以分為以下兩種情況。

  該階段進行真正的事務提交,也可以分為以下兩種情況。

3.1 執行提交

  1. 發送提交請求

    協調接收到參与者發送的ACK響應,那麼他將從預提交狀態進入到提交狀態。並向所有參与者發送doCommit請求。

  2. 事務提交

    參与者接收到doCommit請求之後,執行正式的事務提交。並在完成事務提交之後釋放所有事務資源。

  3. 響應反饋

    事務提交完之後,向協調者發送Ack響應。

  4. 完成事務

    協調者接收到所有參与者的ack響應之後,完成事務。

3.2 中斷事務 協調者沒有接收到參与者發送的ACK響應(可能是接受者發送的不是ACK響應,也可能響應超時),那麼就會執行中斷事務。

  1. 發送中斷請求

    協調者向所有參与者發送abort請求

  2. 事務回滾

    參与者接收到abort請求之後,利用其在階段二記錄的undo信息來執行事務的回滾操作,並在完成回滾之後釋放所有的事務資源。

  3. 反饋結果

    參与者完成事務回滾之後,向協調者發送ACK消息

  4. 中斷事務

    協調者接收到參与者反饋的ACK消息之後,執行事務的中斷。

9 分佈式事務的解決方案

  分佈式事務的解決方案有如下幾種:

  • 全局消息
  • 基於可靠消息服務的分佈式事務
  • TCC
  • 最大努力通知

9.1 方案1:全局事務(DTP模型)

  全局事務基於DTP模型實現。DTP是由X/Open組織提出的一種分佈式事務模型——X/Open Distributed Transaction Processing Reference Model。它規定了要實現分佈式事務,需要三種角色:

  • AP:Application 應用系統

    它就是我們開發的業務系統,在我們開發的過程中,可以使用資源管理器提供的事務接口來實現分佈式事務。

  • TM:Transaction Manager 事務管理器

    • 分佈式事務的實現由事務管理器來完成,它會提供分佈式事務的操作接口供我們的業務系統調用。這些接口稱為TX接口。
    • 事務管理器還管理着所有的資源管理器,通過它們提供的XA接口來同一調度這些資源管理器,以實現分佈式事務。
    • DTP只是一套實現分佈式事務的規範,並沒有定義具體如何實現分佈式事務,TM可以採用2PC、3PC、Paxos等協議實現分佈式事務。
  • RM:Resource Manager 資源管理器

    • 能夠提供數據服務的對象都可以是資源管理器,比如:數據庫、消息中間件、緩存等。大部分場景下,數據庫即為分佈式事務中的資源管理器。
    • 資源管理器能夠提供單數據庫的事務能力,它們通過XA接口,將本數據庫的提交、回滾等能力提供給事務管理器調用,以幫助事務管理器實現分佈式的事務管理。
    • XA是DTP模型定義的接口,用於向事務管理器提供該資源管理器(該數據庫)的提交、回滾等能力。
    • DTP只是一套實現分佈式事務的規範,RM具體的實現是由數據庫廠商來完成的。
  1. 有沒有基於DTP模型的分佈式事務中間件?
  1. DTP模型有啥優缺點?

9.2 方案2:基於可靠消息服務的分佈式事務

  這種實現分佈式事務的方式需要通過消息中間件來實現。假設有A和B兩個系統,分別可以處理任務A和任務B。此時系統A中存在一個業務流程,需要將任務A和任務B在同一個事務中處理。下面來介紹基於消息中間件來實現這種分佈式事務。

 

 

  • 在系統A處理任務A前,首先向消息中間件發送一條消息
  • 消息中間件收到后將該條消息持久化,但並不投遞。此時下游系統B仍然不知道該條消息的存在。
  • 消息中間件持久化成功后,便向系統A返回一個確認應答;
  • 系統A收到確認應答后,則可以開始處理任務A;
  • 任務A處理完成后,向消息中間件發送Commit請求。該請求發送完成后,對系統A而言,該事務的處理過程就結束了,此時它可以處理別的任務了。 但commit消息可能會在傳輸途中丟失,從而消息中間件並不會向系統B投遞這條消息,從而系統就會出現不一致性。這個問題由消息中間件的事務回查機制完成,下文會介紹。
  • 消息中間件收到Commit指令后,便向系統B投遞該消息,從而觸發任務B的執行;
  • 當任務B執行完成后,系統B向消息中間件返回一個確認應答,告訴消息中間件該消息已經成功消費,此時,這個分佈式事務完成。

上述過程可以得出如下幾個結論:

  1. 消息中間件扮演者分佈式事務協調者的角色。
  2. 系統A完成任務A后,到任務B執行完成之間,會存在一定的時間差。在這個時間差內,整個系統處於數據不一致的狀態,但這短暫的不一致性是可以接受的,因為經過短暫的時間后,系統又可以保持數據一致性,滿足BASE理論。

上述過程中,如果任務A處理失敗,那麼需要進入回滾流程,如下圖所示:

 

  • 若系統A在處理任務A時失敗,那麼就會向消息中間件發送Rollback請求。和發送Commit請求一樣,系統A發完之後便可以認為回滾已經完成,它便可以去做其他的事情。

  • 消息中間件收到回滾請求后,直接將該消息丟棄,而不投遞給系統B,從而不會觸發系統B的任務B。

此時系統又處於一致性狀態,因為任務A和任務B都沒有執行。

  上面所介紹的Commit和Rollback都屬於理想情況,但在實際系統中,Commit和Rollback指令都有可能在傳輸途中丟失。那麼當出現這種情況的時候,消息中間件是如何保證數據一致性呢?——答案就是超時詢問機制。

 

 

  系統A除了實現正常的業務流程外,還需提供一個事務詢問的接口,供消息中間件調用。當消息中間件收到一條事務型消息后便開始計時,如果到了超時時間也沒收到系統A發來的Commit或Rollback指令的話,就會主動調用系統A提供的事務詢問接口詢問該系統目前的狀態。該接口會返回三種結果:

  • 提交

    若獲得的狀態是“提交”,則將該消息投遞給系統B。

  • 回滾

    若獲得的狀態是“回滾”,則直接將條消息丟棄。

  • 處理中

    若獲得的狀態是“處理中”,則繼續等待。

消息中間件的超時詢問機制能夠防止上游系統因在傳輸過程中丟失Commit/Rollback指令而導致的系統不一致情況,而且能降低上游系統的阻塞時間,上游系統只要發出Commit/Rollback指令后便可以處理其他任務,無需等待確認應答。而Commit/Rollback指令丟失的情況通過超時詢問機制來彌補,這樣大大降低上游系統的阻塞時間,提升系統的併發度。

  下面來說一說消息投遞過程的可靠性保證。 當上游系統執行完任務並向消息中間件提交了Commit指令后,便可以處理其他任務了,此時它可以認為事務已經完成,接下來消息中間件**一定會保證消息被下游系統成功消費掉!**那麼這是怎麼做到的呢?這由消息中間件的投遞流程來保證。

  消息中間件向下游系統投遞完消息后便進入阻塞等待狀態,下游系統便立即進行任務的處理,任務處理完成后便向消息中間件返回應答。消息中間件收到確認應答后便認為該事務處理完畢!

  如果消息在投遞過程中丟失,或消息的確認應答在返回途中丟失,那麼消息中間件在等待確認應答超時之後就會重新投遞,直到下游消費者返回消費成功響應為止。當然,一般消息中間件可以設置消息重試的次數和時間間隔,比如:當第一次投遞失敗后,每隔五分鐘重試一次,一共重試3次。如果重試3次之後仍然投遞失敗,那麼這條消息就需要人工干預。

 

 

 

有的同學可能要問:消息投遞失敗後為什麼不回滾消息,而是不斷嘗試重新投遞?

這就涉及到整套分佈式事務系統的實現成本問題。 我們知道,當系統A將向消息中間件發送Commit指令后,它便去做別的事情了。如果此時消息投遞失敗,需要回滾的話,就需要讓系統A事先提供回滾接口,這無疑增加了額外的開發成本,業務系統的複雜度也將提高。對於一個業務系統的設計目標是,在保證性能的前提下,最大限度地降低系統複雜度,從而能夠降低系統的運維成本。

不知大家是否發現,上游系統A向消息中間件提交Commit/Rollback消息採用的是異步方式,也就是當上游系統提交完消息后便可以去做別的事情,接下來提交、回滾就完全交給消息中間件來完成,並且完全信任消息中間件,認為它一定能正確地完成事務的提交或回滾。然而,消息中間件向下游系統投遞消息的過程是同步的。也就是消息中間件將消息投遞給下游系統后,它會阻塞等待,等下游系統成功處理完任務返回確認應答后才取消阻塞等待。為什麼這兩者在設計上是不一致的呢?

  首先,上游系統和消息中間件之間採用異步通信是為了提高系統併發度。業務系統直接和用戶打交道,用戶體驗尤為重要,因此這種異步通信方式能夠極大程度地降低用戶等待時間。此外,異步通信相對於同步通信而言,沒有了長時間的阻塞等待,因此系統的併發性也大大增加。但異步通信可能會引起Commit/Rollback指令丟失的問題,這就由消息中間件的超時詢問機制來彌補。

  那麼,消息中間件和下游系統之間為什麼要採用同步通信呢?

  異步能提升系統性能,但隨之會增加系統複雜度;而同步雖然降低系統併發度,但實現成本較低。因此,在對併發度要求不是很高的情況下,或者服務器資源較為充裕的情況下,我們可以選擇同步來降低系統的複雜度。 我們知道,消息中間件是一個獨立於業務系統的第三方中間件,它不和任何業務系統產生直接的耦合,它也不和用戶產生直接的關聯,它一般部署在獨立的服務器集群上,具有良好的可擴展性,所以不必太過於擔心它的性能,如果處理速度無法滿足我們的要求,可以增加機器來解決。而且,即使消息中間件處理速度有一定的延遲那也是可以接受的,因為前面所介紹的BASE理論就告訴我們了,我們追求的是最終一致性,而非實時一致性,因此消息中間件產生的時延導致事務短暫的不一致是可以接受的。

9.3 方案3:最大努力通知(定期校對)

  最大努力通知也被稱為定期校對,其實在方案二中已經包含,這裏再單獨介紹,主要是為了知識體系的完整性。這種方案也需要消息中間件的參与,其過程如下:

 

 

  • 上游系統在完成任務后,向消息中間件同步地發送一條消息,確保消息中間件成功持久化這條消息,然後上游系統可以去做別的事情了;
  • 消息中間件收到消息后負責將該消息同步投遞給相應的下游系統,並觸發下游系統的任務執行;
  • 當下游系統處理成功后,向消息中間件反饋確認應答,消息中間件便可以將該條消息刪除,從而該事務完成。

上面是一個理想化的過程,但在實際場景中,往往會出現如下幾種意外情況:

  1. 消息中間件向下游系統投遞消息失敗
  2. 上游系統向消息中間件發送消息失敗

  對於第一種情況,消息中間件具有重試機制,我們可以在消息中間件中設置消息的重試次數和重試時間間隔,對於網絡不穩定導致的消息投遞失敗的情況,往往重試幾次后消息便可以成功投遞,如果超過了重試的上限仍然投遞失敗,那麼消息中間件不再投遞該消息,而是記錄在失敗消息表中,消息中間件需要提供失敗消息的查詢接口,下游系統會定期查詢失敗消息,並將其消費,這就是所謂的“定期校對”。

如果重複投遞和定期校對都不能解決問題,往往是因為下游系統出現了嚴重的錯誤,此時就需要人工干預。

  對於第二種情況,需要在上游系統中建立消息重發機制。可以在上游系統建立一張本地消息表,並將 任務處理過程向本地消息表中插入消息 這兩個步驟放在一個本地事務中完成。如果向本地消息表插入消息失敗,那麼就會觸發回滾,之前的任務處理結果就會被取消。如果這量步都執行成功,那麼該本地事務就完成了。接下來會有一個專門的消息發送者不斷地發送本地消息表中的消息,如果發送失敗它會返回重試。當然,也要給消息發送者設置重試的上限,一般而言,達到重試上限仍然發送失敗,那就意味着消息中間件出現嚴重的問題,此時也只有人工干預才能解決問題。

  對於不支持事務型消息的消息中間件,如果要實現分佈式事務的話,就可以採用這種方式。它能夠通過重試機制+定期校對實現分佈式事務,但相比於第二種方案,它達到數據一致性的周期較長,而且還需要在上游系統中實現消息重試發布機制,以確保消息成功發布給消息中間件,這無疑增加了業務系統的開發成本,使得業務系統不夠純粹,並且這些額外的業務邏輯無疑會佔用業務系統的硬件資源,從而影響性能。

因此,盡量選擇支持事務型消息的消息中間件來實現分佈式事務,如RocketMQ。

9.4 方案4:TCC(兩階段型、補償型)

  TCC即為Try Confirm Cancel,它屬於補償型分佈式事務。顧名思義,TCC實現分佈式事務一共有三個步驟:

  • Try:嘗試待執行的業務
    • 這個過程並未執行業務,只是完成所有業務的一致性檢查,並預留好執行所需的全部資源
  • Confirm:執行業務
    • 這個過程真正開始執行業務,由於Try階段已經完成了一致性檢查,因此本過程直接執行,而不做任何檢查。並且在執行的過程中,會使用到Try階段預留的業務資源。
  • Cancel:取消執行的業務
    • 若業務執行失敗,則進入Cancel階段,它會釋放所有佔用的業務資源,並回滾Confirm階段執行的操作。

下面以一個轉賬的例子來解釋下TCC實現分佈式事務的過程。

假設用戶A用他的賬戶餘額給用戶B發一個100元的紅包,並且餘額系統和紅包系統是兩個獨立的系統。

  • Try

    • 創建一條轉賬流水,並將流水的狀態設為交易中
    • 將用戶A的賬戶中扣除100元(預留業務資源)
    • Try成功之後,便進入Confirm階段
    • Try過程發生任何異常,均進入Cancel階段
  • Confirm

    • 向B用戶的紅包賬戶中增加100元
    • 將流水的狀態設為交易已完成
    • Confirm過程發生任何異常,均進入Cancel階段
    • Confirm過程執行成功,則該事務結束
  • Cancel

    • 將用戶A的賬戶增加100元
    • 將流水的狀態設為交易失敗

  在傳統事務機制中,業務邏輯的執行和事務的處理,是在不同的階段由不同的部件來完成的:業務邏輯部分訪問資源實現數據存儲,其處理是由業務系統負責;事務處理部分通過協調資源管理器以實現事務管理,其處理由事務管理器來負責。二者沒有太多交互的地方,所以,傳統事務管理器的事務處理邏輯,僅需要着眼於事務完成(commit/rollback)階段,而不必關注業務執行階段。

TCC全局事務必須基於RM本地事務來實現全局事務

  TCC服務是由Try/Confirm/Cancel業務構成的, 其Try/Confirm/Cancel業務在執行時,會訪問資源管理器(Resource Manager,下文簡稱RM)來存取數據。這些存取操作,必須要參与RM本地事務,以使其更改的數據要麼都commit,要麼都rollback。

這一點不難理解,考慮一下如下場景:

 

 

  假設圖中的服務B沒有基於RM本地事務(以RDBS為例,可通過設置auto-commit為true來模擬),那麼一旦[B:Try]操作中途執行失敗,TCC事務框架後續決定回滾全局事務時,該[B:Cancel]則需要判斷[B:Try]中哪些操作已經寫到DB、哪些操作還沒有寫到DB:假設[B:Try]業務有5個寫庫操作,[B:Cancel]業務則需要逐個判斷這5個操作是否生效,並將生效的操作執行反向操作。

  不幸的是,由於[B:Cancel]業務也有n(0<=n<=5)個反向的寫庫操作,此時一旦[B:Cancel]也中途出錯,則後續的[B:Cancel]執行任務更加繁重。因為,相比第一次[B:Cancel]操作,後續的[B:Cancel]操作還需要判斷先前的[B:Cancel]操作的n(0<=n<=5)個寫庫中哪幾個已經執行、哪幾個還沒有執行,這就涉及到了冪等性問題。而對冪等性的保障,又很可能還需要涉及額外的寫庫操作,該寫庫操作又會因為沒有RM本地事務的支持而存在類似問題。。。可想而知,如果不基於RM本地事務,TCC事務框架是無法有效的管理TCC全局事務的。

反之,基於RM本地事務的TCC事務,這種情況則會很容易處理:[B:Try]操作中途執行失敗,TCC事務框架將其參与RM本地事務直接rollback即可。後續TCC事務框架決定回滾全局事務時,在知道“[B:Try]操作涉及的RM本地事務已經rollback”的情況下,根本無需執行[B:Cancel]操作。

換句話說,基於RM本地事務實現TCC事務框架時,一個TCC型服務的cancel業務要麼執行,要麼不執行,不需要考慮部分執行的情況。

TCC事務框架應該提供Confirm/Cancel服務的冪等性保障

  一般認為,服務的冪等性,是指針對同一個服務的多次(n>1)請求和對它的單次(n=1)請求,二者具有相同的副作用。

在TCC事務模型中,Confirm/Cancel業務可能會被重複調用,其原因很多。比如,全局事務在提交/回滾時會調用各TCC服務的Confirm/Cancel業務邏輯。執行這些Confirm/Cancel業務時,可能會出現如網絡中斷的故障而使得全局事務不能完成。因此,故障恢復機制後續仍然會重新提交/回滾這些未完成的全局事務,這樣就會再次調用參与該全局事務的各TCC服務的Confirm/Cancel業務邏輯。

  既然Confirm/Cancel業務可能會被多次調用,就需要保障其冪等性。 那麼,應該由TCC事務框架來提供冪等性保障?還是應該由業務系統自行來保障冪等性呢? 個人認為,應該是由TCC事務框架來提供冪等性保障。如果僅僅只是極個別服務存在這個問題的話,那麼由業務系統來負責也是可以的;然而,這是一類公共問題,毫無疑問,所有TCC服務的Confirm/Cancel業務存在冪等性問題。TCC服務的公共問題應該由TCC事務框架來解決;而且,考慮一下由業務系統來負責冪等性需要考慮的問題,就會發現,這無疑增大了業務系統的複雜度。


作者:大閑人柴毛毛


鏈接:https://juejin.im/post/5ab0d1a3f265da23731448e0


來源:掘金


著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

    本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

節能減碳愛地球是景泰電動車的理念,是創立景泰電動車行的初衷,滿意態度更是服務客戶的最高品質,我們的成長來自於你的推薦。

TCP 半連接隊列和全連接隊列滿了會發生什麼?又該如何應對?_網頁設計

※推薦評價好的iphone維修中心

擁有專業的維修技術團隊,同時聘請資深iphone手機維修專家,現場說明手機問題,快速修理,沒修好不收錢

前言

網上許多博客針對增大 TCP 半連接隊列和全連接隊列的方式如下:

  • 增大 TCP 半連接隊列的方式是增大 /proc/sys/net/ipv4/tcp_max_syn_backlog;
  • 增大 TCP 全連接隊列的方式是增大 listen() 函數中的 backlog;

這裏先跟大家說下,上面的方式都是不準確的。

“你怎麼知道不準確?”

很簡單呀,因為我做了實驗和看了 TCP 協議棧的內核源碼,發現要增大這兩個隊列長度,不是簡簡單單增大某一個參數就可以的。

接下來,就會以實戰 + 源碼分析,帶大家解密 TCP 半連接隊列和全連接隊列。

“源碼分析,那不是勸退嗎?我們搞 Java 的看不懂呀”

放心,本文的源碼分析不會涉及很深的知識,因為都被我刪減了,你只需要會條件判斷語句 if、左移右移操作符、加減法等基本語法,就可以看懂。

另外,不僅有源碼分析,還會介紹 Linux 排查半連接隊列和全連接隊列的命令。

“哦?似乎很有看頭,那我姑且看一下吧!”

行,沒有被勸退的小夥伴,值得鼓勵,下面這圖是本文的提綱:

本文提綱

正文

什麼是 TCP 半連接隊列和全連接隊列?

在 TCP 三次握手的時候,Linux 內核會維護兩個隊列,分別是:

  • 半連接隊列,也稱 SYN 隊列;
  • 全連接隊列,也稱 accepet 隊列;

服務端收到客戶端發起的 SYN 請求后,內核會把該連接存儲到半連接隊列,並向客戶端響應 SYN+ACK,接着客戶端會返回 ACK,服務端收到第三次握手的 ACK 后,內核會把連接從半連接隊列移除,然後創建新的完全的連接,並將其添加到 accept 隊列,等待進程調用 accept 函數時把連接取出來。

半連接隊列與全連接隊列

不管是半連接隊列還是全連接隊列,都有最大長度限制,超過限制時,內核會直接丟棄,或返回 RST 包。

實戰 – TCP 全連接隊列溢出

如何知道應用程序的 TCP 全連接隊列大小?

在服務端可以使用 ss 命令,來查看 TCP 全連接隊列的情況:

但需要注意的是 ss 命令獲取的 Recv-Q/Send-Q 在「LISTEN 狀態」和「非 LISTEN 狀態」所表達的含義是不同的。從下面的內核代碼可以看出區別:

在「LISTEN 狀態」時,Recv-Q/Send-Q 表示的含義如下:

  • Recv-Q:當前全連接隊列的大小,也就是當前已完成三次握手並等待服務端 accept() 的 TCP 連接;
  • Send-Q:當前全連接最大隊列長度,上面的輸出結果說明監聽 8088 端口的 TCP 服務,最大全連接長度為 128;

在「非 LISTEN 狀態」時,Recv-Q/Send-Q 表示的含義如下:

  • Recv-Q:已收到但未被應用進程讀取的字節數;
  • Send-Q:已發送但未收到確認的字節數;

如何模擬 TCP 全連接隊列溢出的場景?

測試環境

實驗環境:

  • 客戶端和服務端都是 CentOs 6.5 ,Linux 內核版本 2.6.32
  • 服務端 IP 192.168.3.200,客戶端 IP 192.168.3.100
  • 服務端是 Nginx 服務,端口為 8088

這裏先介紹下 wrk 工具,它是一款簡單的 HTTP 壓測工具,它能夠在單機多核 CPU 的條件下,使用系統自帶的高性能 I/O 機制,通過多線程和事件模式,對目標機器產生大量的負載。

本次模擬實驗就使用 wrk 工具來壓力測試服務端,發起大量的請求,一起看看服務端 TCP 全連接隊列滿了會發生什麼?有什麼觀察指標?

客戶端執行 wrk 命令對服務端發起壓力測試,併發 3 萬個連接:

在服務端可以使用 ss 命令,來查看當前 TCP 全連接隊列的情況:

其間共執行了兩次 ss 命令,從上面的輸出結果,可以發現當前 TCP 全連接隊列上升到了 129 大小,超過了最大 TCP 全連接隊列。

當超過了 TCP 最大全連接隊列,服務端則會丟掉後續進來的 TCP 連接,丟掉的 TCP 連接的個數會被統計起來,我們可以使用 netstat -s 命令來查看:

上面看到的 41150 times ,表示全連接隊列溢出的次數,注意這個是累計值。可以隔幾秒鐘執行下,如果這個数字一直在增加的話肯定全連接隊列偶爾滿了。

從上面的模擬結果,可以得知,當服務端併發處理大量請求時,如果 TCP 全連接隊列過小,就容易溢出。發生 TCP 全連接隊溢出的時候,後續的請求就會被丟棄,這樣就會出現服務端請求數量上不去的現象。

全連接隊列溢出

Linux 有個參數可以指定當 TCP 全連接隊列滿了會使用什麼策略來回應客戶端。

實際上,丟棄連接只是 Linux 的默認行為,我們還可以選擇向客戶端發送 RST 複位報文,告訴客戶端連接已經建立失敗。

tcp_abort_on_overflow 共有兩個值分別是 0 和 1,其分別表示:

  • 0 :如果全連接隊列滿了,那麼 server 扔掉 client 發過來的 ack ;
  • 1 :如果全連接隊列滿了,server 發送一個 reset 包給 client,表示廢掉這個握手過程和這個連接;

如果要想知道客戶端連接不上服務端,是不是服務端 TCP 全連接隊列滿的原因,那麼可以把 tcp_abort_on_overflow 設置為 1,這時如果在客戶端異常中可以看到很多 connection reset by peer 的錯誤,那麼就可以證明是由於服務端 TCP 全連接隊列溢出的問題。

通常情況下,應當把 tcp_abort_on_overflow 設置為 0,因為這樣更有利於應對突發流量。

舉個例子,當 TCP 全連接隊列滿導致服務器丟掉了 ACK,與此同時,客戶端的連接狀態卻是 ESTABLISHED,進程就在建立好的連接上發送請求。只要服務器沒有為請求回復 ACK,請求就會被多次重發。如果服務器上的進程只是短暫的繁忙造成 accept 隊列滿,那麼當 TCP 全連接隊列有空位時,再次接收到的請求報文由於含有 ACK,仍然會觸發服務器端成功建立連接。

所以,tcp_abort_on_overflow 設為 0 可以提高連接建立的成功率,只有你非常肯定 TCP 全連接隊列會長期溢出時,才能設置為 1 以儘快通知客戶端。

如何增大 TCP 全連接隊列呢?

是的,當發現 TCP 全連接隊列發生溢出的時候,我們就需要增大該隊列的大小,以便可以應對客戶端大量的請求。

TCP 全連接隊列足最大值取決於 somaxconn 和 backlog 之間的最小值,也就是 min(somaxconn, backlog)。從下面的 Linux 內核代碼可以得知:

  • somaxconn 是 Linux 內核的參數,默認值是 128,可以通過 /proc/sys/net/core/somaxconn 來設置其值;
  • backloglisten(int sockfd, int backlog) 函數中的 backlog 大小,Nginx 默認值是 511,可以通過修改配置文件設置其長度;

前面模擬測試中,我的測試環境:

  • somaxconn 是默認值 128;
  • Nginx 的 backlog 是默認值 511

所以測試環境的 TCP 全連接隊列最大值為 min(128, 511),也就是 128,可以執行 ss 命令查看:

現在我們重新壓測,把 TCP 全連接隊列搞大,把 somaxconn 設置成 5000:

接着把 Nginx 的 backlog 也同樣設置成 5000:

最後要重啟 Nginx 服務,因為只有重新調用 listen() 函數 TCP 全連接隊列才會重新初始化。

重啟完后 Nginx 服務后,服務端執行 ss 命令,查看 TCP 全連接隊列大小:

從執行結果,可以發現 TCP 全連接最大值為 5000。

增大 TCP 全連接隊列后,繼續壓測

客戶端同樣以 3 萬個連接併發發送請求給服務端:

服務端執行 ss 命令,查看 TCP 全連接隊列使用情況:

從上面的執行結果,可以發現全連接隊列使用增長的很快,但是一直都沒有超過最大值,所以就不會溢出,那麼 netstat -s 就不會有 TCP 全連接隊列溢出個數的显示:

說明 TCP 全連接隊列最大值從 128 增大到 5000 后,服務端抗住了 3 萬連接併發請求,也沒有發生全連接隊列溢出的現象了。

如果持續不斷地有連接因為 TCP 全連接隊列溢出被丟棄,就應該調大 backlog 以及 somaxconn 參數。

實戰 – TCP 半連接隊列溢出

如何查看 TCP 半連接隊列長度?

很遺憾,TCP 半連接隊列長度的長度,沒有像全連接隊列那樣可以用 ss 命令查看。

但是我們可以抓住 TCP 半連接的特點,就是服務端處於 SYN_RECV 狀態的 TCP 連接,就是在 TCP 半連接隊列。

於是,我們可以使用如下命令計算當前 TCP 半連接隊列長度:

如何模擬 TCP 半連接隊列溢出場景?

模擬 TCP 半連接溢出場景不難,實際上就是對服務端一直發送 TCP SYN 包,但是不回第三次握手 ACK,這樣就會使得服務端有大量的處於 SYN_RECV 狀態的 TCP 連接。

這其實也就是所謂的 SYN 洪泛、SYN 攻擊、DDos 攻擊。

測試環境

實驗環境:

  • 客戶端和服務端都是 CentOs 6.5 ,Linux 內核版本 2.6.32
  • 服務端 IP 192.168.3.200,客戶端 IP 192.168.3.100
  • 服務端是 Nginx 服務,端口為 8088

注意:本次模擬實驗是沒有開啟 tcp_syncookies,關於 tcp_syncookies 的作用,後續會說明。

台北網頁設計公司這麼多該如何選擇?

網動是一群專業、熱情、向前行的工作團隊,我們擁有靈活的組織與溝通的能力,能傾聽客戶聲音,激發創意的火花,呈現完美的作品

本次實驗使用 hping3 工具模擬 SYN 攻擊:

當服務端受到 SYN 攻擊后,連接服務端 ssh 就會斷開了,無法再連上。只能在服務端主機上執行查看當前 TCP 半連接隊列大小:

同時,還可以通過 netstat -s 觀察半連接隊列溢出的情況:

上面輸出的數值是累計值,表示共有多少個 TCP 連接因為半連接隊列溢出而被丟棄。隔幾秒執行幾次,如果有上升的趨勢,說明當前存在半連接隊列溢出的現象

大部分人都說 tcp_max_syn_backlog 是指定半連接隊列的大小,是真的嗎?

很遺憾,半連接隊列的大小並不單單隻跟 tcp_max_syn_backlog 有關係。

上面模擬 SYN 攻擊場景時,服務端的 tcp_max_syn_backlog 的默認值如下:

但是在測試的時候發現,服務端最多只有 256 個半連接隊列,而不是 512,所以半連接隊列的最大長度不一定由 tcp_max_syn_backlog 值決定的

接下來,走進 Linux 內核的源碼,來分析 TCP 半連接隊列的最大值是如何決定的。

TCP 第一次握手(收到 SYN 包)的 Linux 內核代碼如下,其中縮減了大量的代碼,只需要重點關注 TCP 半連接隊列溢出的處理邏輯:

從源碼中,我可以得出共有三個條件因隊列長度的關係而被丟棄的:

  1. 如果半連接隊列滿了,並且沒有開啟 tcp_syncookies,則會丟棄;
  2. 若全連接隊列滿了,且沒有重傳 SYN+ACK 包的連接請求多於 1 個,則會丟棄;
  3. 如果沒有開啟 tcp_syncookies,並且 max_syn_backlog 減去 當前半連接隊列長度小於 (max_syn_backlog >> 2),則會丟棄;

關於 tcp_syncookies 的設置,後面在詳細說明,可以先給大家說一下,開啟 tcp_syncookies 是緩解 SYN 攻擊其中一個手段。

接下來,我們繼續跟一下檢測半連接隊列是否滿的函數 inet_csk_reqsk_queue_is_full 和 檢測全連接隊列是否滿的函數 sk_acceptq_is_full :

從上面源碼,可以得知:

  • 連接隊列的最大值是 sk_max_ack_backlog 變量,sk_max_ack_backlog 實際上是在 listen() 源碼里指定的,也就是 min(somaxconn, backlog)
  • 連接隊列的最大值是 max_qlen_log 變量,max_qlen_log 是在哪指定的呢?現在暫時還不知道,我們繼續跟進;

我們繼續跟進代碼,看一下是哪裡初始化了半連接隊列的最大值 max_qlen_log:

從上面的代碼中,我們可以算出 max_qlen_log 是 8,於是代入到 檢測半連接隊列是否滿的函數 reqsk_queue_is_full :

也就是 qlen >> 8 什麼時候為 1 就代表半連接隊列滿了。這計算這不難,很明顯是當 qlen 為 256 時,256 >> 8 = 1

至此,總算知道為什麼上面模擬測試 SYN 攻擊的時候,服務端處於 SYN_RECV 連接最大隻有 256 個。

可見,半連接隊列最大值不是單單由 max_syn_backlog 決定,還跟 somaxconn 和 backlog 有關係。

在 Linux 2.6.32 內核版本,它們之間的關係,總體可以概況為:

  • 當 max_syn_backlog > min(somaxconn, backlog) 時, 半連接隊列最大值 max_qlen_log = min(somaxconn, backlog) * 2;
  • 當 max_syn_backlog < min(somaxconn, backlog) 時, 半連接隊列最大值 max_qlen_log = max_syn_backlog * 2;

半連接隊列最大值 max_qlen_log 就表示服務端處於 SYN_REVC 狀態的最大個數嗎?

依然很遺憾,並不是。

max_qlen_log 是理論半連接隊列最大值,並不一定代表服務端處於 SYN_REVC 狀態的最大個數。

在前面我們在分析 TCP 第一次握手(收到 SYN 包)時會被丟棄的三種條件:

  1. 如果半連接隊列滿了,並且沒有開啟 tcp_syncookies,則會丟棄;
  2. 若全連接隊列滿了,且沒有重傳 SYN+ACK 包的連接請求多於 1 個,則會丟棄;
  3. 如果沒有開啟 tcp_syncookies,並且 max_syn_backlog 減去 當前半連接隊列長度小於 (max_syn_backlog >> 2),則會丟棄;

假設條件 1 當前半連接隊列的長度 「沒有超過」理論的半連接隊列最大值 max_qlen_log,那麼如果條件 3 成立,則依然會丟棄 SYN 包,也就會使得服務端處於 SYN_REVC 狀態的最大個數不會是理論值 max_qlen_log。

似乎很難理解,我們繼續接着做實驗,實驗見真知。

服務端環境如下:

配置完后,服務端要重啟 Nginx,因為全連接隊列最大和半連接隊列最大值是在 listen() 函數初始化。

根據前面的源碼分析,我們可以計算出半連接隊列 max_qlen_log 的最大值為 256:

客戶端執行 hping3 發起 SYN 攻擊:

服務端執行如下命令,查看處於 SYN_RECV 狀態的最大個數:

可以發現,服務端處於 SYN_RECV 狀態的最大個數並不是 max_qlen_log 變量的值。

這就是前面所說的原因:如果當前半連接隊列的長度 「沒有超過」理論半連接隊列最大值 max_qlen_log,那麼如果條件 3 成立,則依然會丟棄 SYN 包,也就會使得服務端處於 SYN_REVC 狀態的最大個數不會是理論值 max_qlen_log。

我們來分析一波條件 3 :

從上面的分析,可以得知如果觸發「當前半連接隊列長度 > 192」條件,TCP 第一次握手的 SYN 包是會被丟棄的。

在前面我們測試的結果,服務端處於 SYN_RECV 狀態的最大個數是 193,正好是觸發了條件 3,所以處於 SYN_RECV 狀態的個數還沒到「理論半連接隊列最大值 256」,就已經把 SYN 包丟棄了。

所以,服務端處於 SYN_RECV 狀態的最大個數分為如下兩種情況:

  • 如果「當前半連接隊列」沒超過「理論半連接隊列最大值」,但是超過 max_syn_backlog – (max_syn_backlog >> 2),那麼處於 SYN_RECV 狀態的最大個數就是 max_syn_backlog – (max_syn_backlog >> 2);
  • 如果「當前半連接隊列」超過「理論半連接隊列最大值」,那麼處於 SYN_RECV 狀態的最大個數就是「理論半連接隊列最大值」;

每個 Linux 內核版本「理論」半連接最大值計算方式會不同。

在上面我們是針對 Linux 2.6.32 版本分析的「理論」半連接最大值的算法,可能每個版本有些不同。

比如在 Linux 5.0.0 的時候,「理論」半連接最大值就是全連接隊列最大值,但依然還是有隊列溢出的三個條件:

如果 SYN 半連接隊列已滿,只能丟棄連接嗎?

並不是這樣,開啟 syncookies 功能就可以在不使用 SYN 半連接隊列的情況下成功建立連接,在前面我們源碼分析也可以看到這點,當開啟了 syncookies 功能就不會丟棄連接。

syncookies 是這麼做的:服務器根據當前狀態計算出一個值,放在己方發出的 SYN+ACK 報文中發出,當客戶端返回 ACK 報文時,取出該值驗證,如果合法,就認為連接建立成功,如下圖所示。

開啟 syncookies 功能

syncookies 參數主要有以下三個值:

  • 0 值,表示關閉該功能;
  • 1 值,表示僅當 SYN 半連接隊列放不下時,再啟用它;
  • 2 值,表示無條件開啟功能;

那麼在應對 SYN 攻擊時,只需要設置為 1 即可:

如何防禦 SYN 攻擊?

這裏給出幾種防禦 SYN 攻擊的方法:

  • 增大半連接隊列;
  • 開啟 tcp_syncookies 功能
  • 減少 SYN+ACK 重傳次數

方式一:增大半連接隊列

在前面源碼和實驗中,得知要想增大半連接隊列,我們得知不能只單純增大 tcp_max_syn_backlog 的值,還需一同增大 somaxconn 和 backlog,也就是增大全連接隊列。否則,只單純增大 tcp_max_syn_backlog 是無效的。

增大 tcp_max_syn_backlog 和 somaxconn 的方法是修改 Linux 內核參數:

增大 backlog 的方式,每個 Web 服務都不同,比如 Nginx 增大 backlog 的方法如下:

最後,改變了如上這些參數后,要重啟 Nginx 服務,因為半連接隊列和全連接隊列都是在 listen() 初始化的。

方式二:開啟 tcp_syncookies 功能

開啟 tcp_syncookies 功能的方式也很簡單,修改 Linux 內核參數:

方式三:減少 SYN+ACK 重傳次數

當服務端受到 SYN 攻擊時,就會有大量處於 SYN_REVC 狀態的 TCP 連接,處於這個狀態的 TCP 會重傳 SYN+ACK ,當重傳超過次數達到上限后,就會斷開連接。

那麼針對 SYN 攻擊的場景,我們可以減少 SYN+ACK 的重傳次數,以加快處於 SYN_REVC 狀態的 TCP 連接斷開。

巨人的肩膀

[1] 系統性能調優必知必會.陶輝.極客時間.

[2] https://www.cnblogs.com/zengkefu/p/5606696.html

[3] https://blog.cloudflare.com/syn-packet-handling-in-the-wild/

小林是專為大家圖解的工具人,Goodbye,我們下次見!

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

網頁設計最專業,超強功能平台可客製化

窩窩以「數位行銷」「品牌經營」「網站與應用程式」「印刷品設計」等四大主軸,為每一位客戶客製建立行銷脈絡及洞燭市場先機。

神差距!工信部油耗是5個 為什麼你總是開出來8個多油?_貨運

※評比南投搬家公司費用收費行情懶人包大公開

搬家價格與搬家費用透明合理,不亂收費。本公司提供下列三種搬家計費方案,由資深專業組長到府估價,替客戶量身規劃選擇最經濟節省的計費方式

音響基本都開吧。等等,而這些,同樣也會讓油耗值發生一定的變化,要明白,一輛車絕大部分的設備都是在靠油為燃料去運作的,雖然影響不算太多。>>>>為什麼不人工測試。這很簡單,那麼多需要測試的車輛,如果要一輛一個人去測試的話,很浪費人力物力,而且也存在一定的誤差,也就是所說個人駕駛習慣。

油耗,是一個老生常談的話題,對於同一樣車而言,可能會出現好幾種油耗,畢竟開的人不同,但是都有一個共同點,基本是很少人能開到工信部的油耗,都是比工信部油耗比較高一些,那麼,就會很多人問了,為什麼我怎麼開都開不到工信部的油耗,其實很簡單,方式不同。

工信部的油耗是怎麼測出來?

工信部測試油耗的的車輛,基本都是過了3000公里磨合期的車。而測試的方式也很多種,有台架測試,實際道路測試等,而工信部所採用的測試方式,就是台架測試,簡單說,就是放在一個測試機器上,通過各種路況,車速,換擋等等情況模擬去測試,最後通過測量碳排放,利用碳平衡的方法來測量油耗。

所以簡單來說,工信部的測試過程,是很流暢的,是非常極致的理想工況模擬,類似你上高速前清零了,

※智慧手機時代的來臨,RWD網頁設計為架站首選

網動結合了許多網際網路業界的菁英共同研發簡單易操作的架站工具,及時性的更新,為客戶創造出更多的網路商機。

然後直接上高速,開着巡航的瞬間油耗,在加上工信部的測試中,並沒有計算到風阻,各種突發的情況,加上個人的駕駛習慣,而三種都會讓油耗產生一定的變化,特別是個人的駕駛習慣。

還有一點就是,在日常用車當中,空調不可能不開吧?燈光不可能不開吧?音響基本都開吧?等等,而這些,同樣也會讓油耗值發生一定的變化,要明白,一輛車絕大部分的設備都是在靠油為燃料去運作的,雖然影響不算太多。

為什麼不人工測試?

這很簡單,那麼多需要測試的車輛,如果要一輛一個人去測試的話,很浪費人力物力,而且也存在一定的誤差,也就是所說個人駕駛習慣。而工信部目前的一輛車測試的時間不到20分鐘,在這個時間裏面,測試的工況有四個市區和一個郊區,並且是理想的,平均下來一個模擬工況才4分鐘左右,最後根據一些方式計算出相信燃油消耗。

可不可信?

這沒有可不可信的問題,工信部油耗之所以叫工信部油耗,就是給你在買車的時候一個參考值而已,因為,所有的車輛都是這樣測試出來,還是會有車輛油耗的高低之分,這對於選車買車時候有一定幫助。當然,在一些垂直汽車網站上也可以得到用戶的口碑的油耗,從中和工信部油耗做個對比,在和你選擇車型之間做個對比,自然就可以得出大概的結論,哪輛車是真的比較省油,哪輛車比較耗油,不過,到了真正使用的時候,還是得看你個人的駕駛情況了。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

※回頭車貨運收費標準

宇安交通關係企業,自成立迄今,即秉持著「以誠待人」、「以實處事」的企業信念

基於RBAC的權限控制淺析(結合Spring Security)_網頁設計公司

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

節能減碳愛地球是景泰電動車的理念,是創立景泰電動車行的初衷,滿意態度更是服務客戶的最高品質,我們的成長來自於你的推薦。

 

嗯,昨天面試讓講我的項目,讓我講講項目里權限控制那一塊的,講的很爛。所以整理一下。

按照面試官的提問流程來講:

一、RBAC是個啥東西了?

RBACRole-Based Access Control ),即基於角色的訪問控制模型,我的項目是基於RBAC0模型.由於之相對應的數據實體構成.由用戶表,角色映射表,角色表,權限表,權限映射表構成.

 

 

1 RBAC0模型圖

二、你可以講講權限控制大概執行流程嗎?

 用戶登錄之後首先進行身份驗證,成功之後獲取當前用戶的所有角色,之後根據角色加載對應的權限菜單,這裏默認不加載沒有權限的菜單,當存在直接輸入URL路徑的情況時,對於登錄用戶的每一個請求,都會通過鑒權處理,分析角色.最後通過權限的判斷分析是否可以訪問菜單資源.

在 spring Security,對用登錄的請先通過FilterInvocationSecurityMetadataSource的實現類獲取當前請求,分析需要的角色,該類的主要功能就是通過當前的請求地址,獲取該地址需要的用戶角色。

1、獲取當前訪問路徑的URL路徑

2、獲取所有資源URL,即所有的菜單URL路徑

3、當前的訪問URL和返回的每個URL基於Ant風格比較,如果相等,獲取當前訪問URL的所有角色。如果沒有相等的,定義資源為公告資源,並且給予一個公告資源的角色。

4、當為公共資源時,判斷用戶是否登錄。登錄放行。返回資源

5、當為角色資源時,登錄用戶的角色列表和該資源的角色列表進行比較,如果有相同角色,放行,返回資源

6、當即不是公共資源也沒有相匹配的角色的時候。拋異常,沒有權限

圖2 系統訪問控制流程圖

 代碼:

鑒權:

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

透過選單樣式的調整、圖片的縮放比例、文字的放大及段落的排版對應來給使用者最佳的瀏覽體驗,所以不用擔心有手機版網站兩個後台的問題,而視覺效果也是透過我們前端設計師優秀的空間比例設計,不會因為畫面變大變小而影響到整體視覺的美感。

@Component
public class CustomFilterInvocationSecurityMetadataSource implements FilterInvocationSecurityMetadataSource {
    @Autowired
    MenuService menuService;
    //路徑比較工具
    AntPathMatcher antPathMatcher = new AntPathMatcher();
    Logger logger = Logger.getLogger("com.liruilong.hros.config.ustomFilterInvocationSecurityMetadataSource");
    /**
     * @return java.util.Collection<org.springframework.security.access.ConfigAttribute> * 返回值是 Collection<ConfigAttribute>,表示當前請求 URL 所需的角色。
     * @Author Liruilong
     * @Description 當前請求需要的角色,該方法的參數是一個 FilterInvocation, 開發者可以從 Filterlnvocation 中提取出當前請求的 URL,
     * @Date 18:13 2019/12/24
     * @Param [object]
     **/
    @Override
    public Collection<ConfigAttribute> getAttributes(Object object) throws IllegalArgumentException {
        //獲取當前請求路徑
        String requestUrl = ((FilterInvocation) object).getRequestUrl();
        logger.warning(requestUrl);
        //獲取所有的菜單url路徑
        List<Menu> menus = menuService.getAllMenusWithRole();
        // AntPathMatcher,主要用來實現 ant 風格的 URL 匹配。
         for (Menu menu : menus) {
            if (antPathMatcher.match(menu.getUrl(), requestUrl)) {
                //擁有當前菜單權限的角色
                List<Role> roles = menu.getRoles();
                String[] strings = new String[roles.size()];
                for (int i = 0; i < roles.size(); i++) {
                    strings[i] = roles.get(i).getName();
                }
                return SecurityConfig.createList(strings);
            }
        }
        // 沒匹配上的資源都是登錄,或者為公共資源
        return SecurityConfig.createList("ROLE_LOGIN");
    }

 

 @Override
    public void decide(Authentication authentication, Object object, Collection<ConfigAttribute> configAttributes)
            throws AccessDeniedException, InsufficientAuthenticationException {
        for (ConfigAttribute configAttribute : configAttributes) {
            String needRole = configAttribute.getAttribute();
            if ("ROLE_LOGIN".equals(needRole)) {
                if (authentication instanceof AnonymousAuthenticationToken) {
                    throw new AccessDeniedException("尚未登錄,請登錄!");
                } else {
                    return;
                }
            }
            Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities();
            for (GrantedAuthority authority : authorities) {
                if (authority.getAuthority().equals(needRole)) {
                    return;
                }
            }
        }
        throw new AccessDeniedException("權限不足,請聯繫管理員!");
    }

 

 

 

三、你可以把對應的SQL和表結構寫一下嗎?

 

加載所有的菜單資源;返回所有的菜單資源和對應的角色集合,Service端和訪問的URL的比較,存在判斷角色。(鑒權)


select m.*,r.`id` as rid,r.`name` as rname,r.`namezh` as rnamezh
from menu m,menu_role mr,role r
where m.`id`=mr.`mid` and mr.`rid`=r.`id` order by m.`id`
根據用戶ID返回當前用戶的全部菜單資源(授權)
   select m1.`id`,m1.url,m1.`path`,m1.`component`,m1.`iconCls`,m1.`name`,m1.`requireAuth`,m1.keepAlive,m1.enabled,
       m2.id as id2,m2.url as url2,m2.name as name2,m2.`component` as component2,m2.`iconCls` as iconCls2,m2.`keepAlive` as keepAlive2,m2.`path` as path2,m2.`requireAuth` as requireAuth2,m2.enabled as enabled2,m2.parentId as parentId2
       from menu m1,menu m2
       where m1.`id`=m2.`parentId` and m1.`id`!=1 and m2.`id`
       in(select mr.`mid` from hr_role h_r,menu_role mr where h_r.`rid`=mr.`rid` and h_r.`hrid`=#{hrId})
       and m2.`enabled`=true order by m1.`id`,m2.`id`

 

2 ERBAC數據實體關係圖

用戶登錄之後首先進行身份驗證,成功之後獲取當前用戶的所有角色,之後根據角色加載對應的權限菜單,這裏默認不加載沒有權限的菜單,當存在直接輸入URL路徑的情況時,對於登錄用戶的每一個請求,都會通過鑒權處理,分析角色.最後通過權限的判斷分析是否可以訪問菜單資源.

用戶表:

 

 角色表:

 

用戶角色映射表:

 

權資源表:

 

 

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

搬家費用:依消費者運送距離、搬運樓層、有無電梯、步行距離、特殊地形、超重物品等計價因素後,評估每車次單

Java動態代理與靜態代理以及它能為我們做什麼_網頁設計公司

南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

搬家費用:依消費者運送距離、搬運樓層、有無電梯、步行距離、特殊地形、超重物品等計價因素後,評估每車次單

  相信我們在網上和平時學習和工作中或多或少都接觸過Java的代理模式,經常聽到什麼靜態代理、動態代理的一些名詞。但我們是否真的很清楚這些呢?至少我在面試時,發現很多人並不很清楚。

  首先代理比較好理解,就是幫一個人,或者一類人做一些事情。遷移到面向對象的程序設計中,代理就是幫一個類去做一些事情,而這個代理的工具我們就稱為代理類。

  通過代理的方式去做事有什麼好處呢?這就好比工廠和分銷商做的事情一樣,工廠可以直賣一些自己的產品,分銷商同樣也可以賣工廠生產的產品,那麼為什麼還有分銷商的存在呢?因為分銷商可以提供一些額外的服務,或者在銷售的過程中能夠完成一些其他的事情,比如組合銷售、根據本地情況做活動等,而這些可能是工廠不想關心或者也管不過來的。這樣的功能和角色承包給代理商就會使得分工比較明晰,並且又能夠提供一些額外或者定製的服務。

 

靜態代理

  Java中的代理方式可以分為靜態代理和動態代理。靜態代理的含義是代理類/對象在我們關心的程序運行前就已經確定或存在。靜態代理比較好理解,我們在日常工作中也是經常用到,比如一個已經存在的接口,我們不期望去更改它,但是現在要在原邏輯上新加一些邏輯或功能,比如原接口方法調用完成后發送一個消息之類的。於是我們可以創建一個類,同樣實現原接口,並且把之前存在的接口當做成員變量注入進來,調用其中的方法,並添加我們需要的功能。

  靜態代理的類圖如下所示,需要被代理的實現類和代理類都實現了抽象接口AbstractInterface,而InterfaceProxy和InterfaceImpl間是聚合關係。

  

 

 

 

   來看一段示例代碼,ProductAuditCallbackService 是我們已有的一個接口,出於某些原因,這個接口不能繼續對外使用,我們需要定義一個新的接口並且名稱還要一樣(主要是方便客戶理解和對應原接口),但是我們需要添加一點“新邏輯”。因此我們可以同樣實現 ProductAuditCallbackService,ProductAuditCallbackServiceProxy 就是我們的代理類,之後外部調用就可以實例化我們的代理類,調用同名方法就好了。

 

 1 public class ProductAuditCallbackServiceProxy implements ProductAuditCallbackService {
 2 
 3     @Resource
 4     private ProductAuditCallbackService productAuditCallbackService;
 5 
 6     @Override
 7     public Result<Void> auditProduct(ProductAuditRequest request, String auditStatus) {
 8         if (auditStatus == "DELETED") {
 9             return new Result<>();
10         }
11         return productAuditCallbackService.auditProduct(request, auditStatus);
12     }
13 
14 
15 ...
16 }

 

 

 

 

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

節能減碳愛地球是景泰電動車的理念,是創立景泰電動車行的初衷,滿意態度更是服務客戶的最高品質,我們的成長來自於你的推薦。

動態代理

  動態代理的作用和靜態代理一樣,主要的區別就在於需要在運行時生成代理類。在使用動態代理時,我們還需要定義一個在代理類和委託類之間的中介類,並且中介類需要實現 java.lang.reflect.InvocationHandler 接口。

 1 package java.lang.reflect;
 2 
 3 /**
 4  * {@code InvocationHandler} is the interface implemented by
 5  * the <i>invocation handler</i> of a proxy instance.
 6  *
 7  * <p>Each proxy instance has an associated invocation handler.
 8  * When a method is invoked on a proxy instance, the method
 9  * invocation is encoded and dispatched to the {@code invoke}
10  * method of its invocation handler.
11  *
12  * @author      Peter Jones
13  * @see         Proxy
14  * @since       1.3
15  */
16 public interface InvocationHandler {
17 
18     public Object invoke(Object proxy, Method method, Object[] args)
19         throws Throwable;
20 }

  

  動態代理在框架類的代碼中用到的頻率並不低,而且能夠使我們的代碼看起來更高級一些,所以何樂而不為呢? 讓我們來看一些實際的例子。

  MethodInvocationHandler是一个中介類,實現了InvocationHandler接口,MethodMonitor 這個類的功能就是要統計我們的委託類的對象business中的方法被調用的次數和耗時,由於其主要功能不是我們關注的主要內容,所以忽略其實現。

 1 public class MethodInvocationHandler implements InvocationHandler {
 2 
 3     //被代理對象
 4     private Object business;
 5 
 6     private final MethodMonitor methodMonitor;
 7 
 8     public MethodInvocationHandler(MethodMonitor methodMonitor) {
 9         this.methodMonitor = methodMonitor;
10     }
11 
12     /**
13      * 代理方法
14      */
15     @Override
16     public Object invoke(Object proxy, Method method, Object[] args)
17             throws Throwable {
18 
19         long startTime = System.currentTimeMillis();
20 
21         Object result = method.invoke(this.business, args);
22 
23         //方法調用統計
24         this.methodMonitor.methodCount(this.business.getClass().getSimpleName() + POINT + method.getName(), startTime);
25         return result;
26     }
27 
28 }

  其餘示例代碼及外部調用示例如下,我們的Business類裏面擁有三個方法。MethodSampleClient 則是一個封裝起來的客戶端。我們不想讓外部客戶端感知我們的實現以及和Business的關係,於是我們在MethodSampleClient中定義了一個成員變量proxy,當外部需要Business提供的一些功能時,我們通過proxy為其提供。Proxy.newProxyInstance() 則是我們實例化一個代理類的方式,喲,這還是個工廠模式,可以閱讀一些這個方法的說明,需要傳入的三個參數依次是:需要被代理的類的ClassLoader,被代理類需要被代理的接口的集合,中介處理類的實例。

  這裏Business我寫的是一個確定的類,其實真正在實際開發工作中,我們往往定義的抽象的接口或抽象類,知道運行時才會確定到底是哪個實現類的實例,這樣可能更容易理解一些:運行時確定委託類的實現類,運行時生成代理類,並調用對應的委託類的方法。

 

 1 public class Business {
 2 
 3     public void createJob() {
 4         System.out.println("test createJob");
 5     }
 6 
 7 
 8     public void processJob() {
 9         System.out.println("test processJob");
10     }
11 
12     public void closeJob() {
13         System.out.println("test closeJob");
14     }
15 
16 }
17 
18 
19 
20 public class MethodSampleClient {
21 
22     private Business business;
23 
24     @Getter
25     private Object proxy;
26 
27     private InvocationHandler invocationHandler;
28 
29 
30     public void init() {
31         this.business = new Business();
32         this.invocationHandler = new MethodInvocationHandler(new MethodMonitor());
33         this.proxy = bind(this.business, invocationHandler);
34     }
35 
36     /**
37      * 綁定對象, 直接初始化並返回代理類供客戶端使用
38      */
39     public Object bind(Object business, InvocationHandler invocationHandler) {
40         return Proxy.newProxyInstance(
41                 //被代理類的ClassLoader
42                 business.getClass().getClassLoader(),
43                 //要被代理的接口,本方法返回對象會自動聲稱實現了這些接口
44                 business.getClass().getInterfaces(),
45                 //代理處理器對象
46                 invocationHandler);
47     }
48     
49 }    
50 
51 
52 /**
53 *  A simple client test class
54 */
55 public class Test {
56 
57     public void main(String[] args) {
58         MethodSampleClient methodSampleClient = new MethodSampleClient();
59         methodSampleClient.init();
60 
61         methodSampleClient.getProxy().createJob();
62         methodSampleClient.getProxy().processJob();
63         methodSampleClient.getProxy().closeJob();
64     }
65 
66 }

   

  為了說清楚這個過程,竟然還真的寫了不少代碼,看起來比較繁瑣。總結一下,動態代理無非按照下面的步驟來編寫代碼:

  • 首先明確需要被代理的委託類。
  • 實現 InvocationHandler 接口,定義一个中介類。
  • 用 Proxy.newProxyInstance() 實例化代理類,並在客戶端代碼中直接使用。

  好了,大概差不多了,最重要的是能夠在實際工作中有意識地去使用並體會其作用 —— 軟件開發是經驗驅動不是知識驅動。

 

 

 

 

  

 

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

透過選單樣式的調整、圖片的縮放比例、文字的放大及段落的排版對應來給使用者最佳的瀏覽體驗,所以不用擔心有手機版網站兩個後台的問題,而視覺效果也是透過我們前端設計師優秀的空間比例設計,不會因為畫面變大變小而影響到整體視覺的美感。

國外玩家反應 Epic Games 啟動器會導致 AMD 與 Intel CPU 溫度提升,還會發送數據到某個網址_網頁設計公司

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

透過選單樣式的調整、圖片的縮放比例、文字的放大及段落的排版對應來給使用者最佳的瀏覽體驗,所以不用擔心有手機版網站兩個後台的問題,而視覺效果也是透過我們前端設計師優秀的空間比例設計,不會因為畫面變大變小而影響到整體視覺的美感。

EPIC Games Store 正推出連續 15 天都送免費遊戲的活動(雖然有點沒誠意),相信很多人每天都準時收藏起來,不過如果你平常沒用 EPIC Games 啟動器的話,最好把它整個關閉,也就是不要縮小在右下角,因為最近有玩家發現,Epic Games 啟動器會導致 AMD 與 Intel CPU 溫度提升,不僅差了十幾度,還有外媒實測揭露,Epic Games 啟動器會持續在背景發送數據到某個網址。

國外玩家反應 Epic Games 啟動器會導致 AMD 與 Intel CPU 溫度提升

最近在國外 Reddit 論壇上,一名網友指出他發現把 EPIC Games 啟動器關掉之後,自己的 AMD Ryzen 5800X 處理器從 50 度降到 37 度,少了 13 度,他甚至用不要再打開這惡意軟體來形容,如果想玩 EPIC 遊戲,請使用另一套 Legendary,免費遊戲則透過網頁版領取就好:

隨後下方陸續有其他網友表示,他也碰到相同狀況,不過處理器是 AMD Ryzen 5900X。另外還有 Ryzen 5 2600,這位網友說他看 YouTube 時溫度是 46,原本以為還可以,但把 EPIC Games 啟動器整個關掉後,立刻降到 38 度:

Intel 處理器也有案例,不過他碰到的是 EPIC Games 啟動器的使用率達 15~20%,沒特別提溫度,不過既然使用率提升,溫度基本上也會上升:

關於這點,外媒 Hot Hardware 也進行了實測,結果發現不只是處理器溫度變高,還悄悄在背後持續發送數據到一個指定網址。

下方是尚未開啟 EPIC Games 啟動器的截圖,AMD Ryzen 9 5950X 的 CPU 溫度為 34.28:

EPIC Games 啟動器打開之後,溫度立刻提升到 56.78,差了 20 度,比 Reddit 網友反應的還多:

雖然很多遊戲啟動器打開時(如:Steam、GOG),CPU 使用率與溫度都會提升,但基本上過一陣子後就會降低,不像 EPIC Games 啟動器是一直保持這種狀態。

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

節能減碳愛地球是景泰電動車的理念,是創立景泰電動車行的初衷,滿意態度更是服務客戶的最高品質,我們的成長來自於你的推薦。

因此,他們還透過一款 Glasswire 網路流量監控工具來檢測 EPIC Games 啟動器,結果發現,它會持續將數據傳送到 22 台不同伺服器上,無論是打開還是最小隱藏啟動器都會:

EpicWebHelper 還會發送一些數據到這個網址:

  • tracking-website-prod07-epic-961842049.us-east-1.elb.amazonaws.com

相較於 Steam 與 NVIDIA GeForce Experience,EPIC 發送的數量是 14 倍以上。不過不確定這跟 CPU 使用率和溫度提升是否有關連。

所以說,如果你平常沒在使用 EPIC Games 啟動器,建議就整個關掉,不要最小化隱藏在右小角中。對於擔心個人隱私的人,也能嘗試看看 Legendary。

資料來源:Reddit、Hot Hardware

EPIC、Spotify 等公司成立應用程式公平聯盟,對抗 Apple 的 30% 抽成

您也許會喜歡:

【推爆】終身$0月租 打電話只要1元/分

立達合法徵信社-讓您安心的選擇

南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

搬家費用:依消費者運送距離、搬運樓層、有無電梯、步行距離、特殊地形、超重物品等計價因素後,評估每車次單

AirPods Pro 2 零件現蹤,可能將像 Apple Watch 一樣有雙尺寸?_網頁設計公司

南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

搬家費用:依消費者運送距離、搬運樓層、有無電梯、步行距離、特殊地形、超重物品等計價因素後,評估每車次單

看到將蘋果自家耳機產品推上價格「Max」值的 AirPods Max,雖說也不至於貴到遙不可及,甚至也有傳將會有更入門的版本。但就生活使用來講,似乎還是同樣具備主動降噪機能與空間音訊等功能的 AirPods Pro 比較適合自己?看來,蘋果應該也沒打算放掉這個產品系列,現在被發現已經默默在準備新品當中 — 而且這次將可能像旗下智慧型手錶那樣,提供更客製化的尺寸選項(!)。繼續閱讀 AirPods Pro 2 零件現蹤,可能將像 Apple Watch 那樣具備雙尺寸報導內文。

▲圖片來源:Mr·White

AirPods Pro 2 零件現蹤,可能將像 Apple Watch 一樣有雙尺寸?

AirPods 無疑已經是現階對最受歡迎的真無線耳機。而儘管目前看來此系列的產品已經被 AirPods Max 給奪下了最高階的寶座,不過這不代表蘋果沒打算持續精進相對低價且易用的產品系列 — 畢竟市場上的對手也早已開始端出更小尺寸的版本。

▲圖片來源:Apple

從最近在社群網站上由 Mr·White 所貼出的疑似 AirPods Pro 2 零件照看來,蘋果似乎不僅準備帶來新的真無線耳塞耳機還。可能像 Apple Watch 那樣,疑似準備提供兩種不同的尺寸來對應使用者的需求。

雖說還是採用 W2 的晶片,不過根據爆料者的猜測,新世代的 AirPods Pro 很可能會有大小兩種尺寸可供選擇。對照先前媒體報導,新世代 AirPods Pro 很可能移除底部的控制桿造型,帶來僅剩下 Earbuds 耳機本體的新設計。

▲圖片來源:Mr·White

是說,儘管這樣「耳機豆」的設計在其他品牌已經不算少見,但畢竟 AirPods Pro 小小一顆耳機裡面塞入包括動態追蹤、光學感測器、加速度計與力度感測器等,可以配合蘋果生態系帶來有趣功能的硬體配置。所以某種程度來講,能在保有舊有配置更進一步縮小機身體積,甚至加入新功能與帶來不同尺寸的版本,應該也是十分不容易的事。

不過,更小的耳機本體雖然應該會看起來更美型,相應而來的電力與表現是否會有所落差,應該也會是許多人會想關注的重點。總之,畢竟目前也僅有零件洩漏而已,一切就等更多相關消息浮現再來看看有些什麼樣令人驚豔的可能性吧。

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

節能減碳愛地球是景泰電動車的理念,是創立景泰電動車行的初衷,滿意態度更是服務客戶的最高品質,我們的成長來自於你的推薦。

本篇圖片 / 引用來源

延伸閱讀:

傳明年中 Apple 將推出更便宜的 AirPods Max Sport 運動版,售價 400 美元

340 萬台,據報 PS5 破 PlayStation 首月出貨最高紀錄

您也許會喜歡:

【推爆】終身$0月租 打電話只要1元/分

立達合法徵信社-讓您安心的選擇

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

透過選單樣式的調整、圖片的縮放比例、文字的放大及段落的排版對應來給使用者最佳的瀏覽體驗,所以不用擔心有手機版網站兩個後台的問題,而視覺效果也是透過我們前端設計師優秀的空間比例設計,不會因為畫面變大變小而影響到整體視覺的美感。

7萬落地買到合資車!漂亮三廂車車主們愛嗎?_網頁設計公司

南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

搬家費用:依消費者運送距離、搬運樓層、有無電梯、步行距離、特殊地形、超重物品等計價因素後,評估每車次單

5L左右,比較省油,操作起來很輕鬆。尚有不足:車漆比較薄,隔音有待提升,畢竟價位擺在那裡了。車主二購買車型:2016款 1。4L 自動領先型GLX裸車價格:7。59萬最值得表揚的地方:現代流體雕塑的設計理念出來的車子就是好看,還有就是空間了,雖然是小型車,但是後排坐3個人都不是很擁擠的,1。

北京現代-瑞納

指導價:7.39-10.69萬

基本資料

長*寬*高(mm) 4375*1700*1460

軸距(mm) 2570

動力系統

1.4L/1.6L+5擋手動/4擋自動變速器

車主一

購買車型:2016款 1.4L 手動智能型GLS

裸車價格:6.05萬

最值得表揚的地方:這車最滿意的首先就是外觀了,設計得非常流暢,其次就是優惠幅度大,物超所值,再者就是用車成本了,百公里綜合油耗在6.5L左右,比較省油,操作起來很輕鬆。

尚有不足:車漆比較薄,

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

透過選單樣式的調整、圖片的縮放比例、文字的放大及段落的排版對應來給使用者最佳的瀏覽體驗,所以不用擔心有手機版網站兩個後台的問題,而視覺效果也是透過我們前端設計師優秀的空間比例設計,不會因為畫面變大變小而影響到整體視覺的美感。

隔音有待提升,畢竟價位擺在那裡了。

車主二

購買車型:2016款 1.4L 自動領先型GLX

裸車價格:7.59萬

最值得表揚的地方:現代流體雕塑的設計理念出來的車子就是好看,還有就是空間了,雖然是小型車,但是後排坐3個人都不是很擁擠的,1.4的動力就別要求什麼推背感了,反正日常駕駛代步足矣,優惠幅度大,配置比較齊全,而且油耗低,總體而言性價比很高。

尚有不足:內飾塑料感比較強,燈光是蠟燭燈,離地間隙較低。

編輯點評:瑞納的市場表現還是挺不錯的,車子操作起來很輕鬆靈活,動力日常使用也是足夠,當然配置上還是稍微欠缺的,加上現在市場優惠巨大,總體來說。適合剛工作不久的年輕人。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

節能減碳愛地球是景泰電動車的理念,是創立景泰電動車行的初衷,滿意態度更是服務客戶的最高品質,我們的成長來自於你的推薦。

新式數位身分證容易危害資安問題?_網頁設計公司

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

透過選單樣式的調整、圖片的縮放比例、文字的放大及段落的排版對應來給使用者最佳的瀏覽體驗,所以不用擔心有手機版網站兩個後台的問題,而視覺效果也是透過我們前端設計師優秀的空間比例設計,不會因為畫面變大變小而影響到整體視覺的美感。

台灣新式身分證「數位身分識別證(New eID)」將於明年元月在新竹市試行換發,明年七月全面換發。由於身分證是個人最重要的個人身分憑證,但內政部對於「數位身分識別證(New eID)」揭露的資訊目前並不夠充分,導致不少專家與民眾對於數位身分證的資安問題有不少疑慮,讓新式身分證全面換發出現許多雜音,連原本要試辦的新竹市也釀釀喊卡。
台灣新式身分證「數位身分識別證(New eID)」是什麼? 由紙本變數位化的目的為何? 新式身分證資安破口會在哪裡呢? 以下作一解析:

掌握最新電信資費訊息,請加入小丰子3C俱樂部粉絲頁!

小丰子3C俱樂部

 

1.什麼是「數位身分識別證(New eID)」? 有何功能與用途?

「數位身分證」乃是將過去紙本身分證升級為具晶片功能的「數位身分證」,除了安全防偽性加強外,更可整合自然人憑證功能,成為一把數位鑰匙與虛擬世界的「數位分身」。

Note: 以上新式身分證圖樣非最終正式發行圖樣

 

過去台灣因為線上身分認證機制並不完善,民眾辦理各項政府或民間業務,都必須本人持身分證正本前往辦理。外來身分證數位化(晶片化)後,民眾就可以僅憑一張卡片,就可以申請與辦理如網路報稅、公民投票、申請電子病歷、數位金融交易、退休金查詢、申請各種社福津貼與補助..等等逾80%的線上政府業務,大幅簡化民眾多處申請服務的個人資料重複註冊與節省往返奔波時間,也可以省下老是在印身分證影本的麻煩。

 

根據臺灣大學生醫電資所資訊組研究生何明洋的研究,至今已有47國發行eID數位身分證,歐洲國家數量最多,但馬來西亞是全球第一。 相較於國外eID身分證還可以用做為i-Voting線上投票、健保卡、登入銀行帳號..等等多元應用,台灣數位身分證受限於朝野的不信任目前僅能作為身分證明、自然人憑證及供國內通關ICAO國際旅行證件使用。根據內政部報告指出,2021年全球預計89%的國家採用晶片身分證, 可見數位身分證是國際趨勢,別人已經上太空,我們還是在殺豬公,實在有辱台灣是科技之島美名。

 

2.「數位身分識別證(New eID)」更容易洩漏個資及危害資安問題嗎?

反對全面換發「數位身分識別證(New eID)」的理由之一就是對於台灣eID資安問題有疑慮。身份證由現行紙本改為晶片化後,會更容易洩漏個資及危害資安問題嗎? 以下作一探討:

A.數位身分識別證(New eID)個資隱私保護比紙本更好:
台灣「數位身分識別證(New eID)」的「卡面資料」比現行國民身分證更少,正面欄位資訊僅提供:姓名、身分證字號、出生日期、個人大頭照等 4 項目個資,背面有:結婚狀態、製證日期、應換領日期、證件號碼條碼、身分證字號條碼、機讀區(MRZ)。上方印有中華民國國旗與「中華民國國民身分證 TAIWAN, REPUBLIC OF CHINA」字樣。傳統身分證上的配偶名字、父母名字、戶籍地址、役別、出生地等 5 項個資,則儲存於晶片內,須授權才可讀取。
換言之,過去紙本身分證上的個資只要被影印或遺失被撿走通通被看光光,改為數位化後,需要輸入密碼才能看到,對個資隱私保護一定比較好。

 

B.數位身分識別證只是通往數位應用的「鑰匙」,並無用戶個人其他數位歷程或資訊會被揭露:
台灣「數位身分識別證」並無儲存功能,並不會有多餘原本紙本身分證可揭露資訊以外更多資訊會被揭露,這與現行健保卡或勞保卡可以直接讀取個人就醫或勞退保相關資訊是完全不一樣的。
至於有些民眾對數位足跡的擔憂,內政部表示相關讀卡記錄不會傳回內政部或者憑證管理中心,政府不會掌控民眾的數位足跡,民眾可以安心。

 

另外,內政部表示數位身分證採雙晶片備援機制,晶片均通過國際安全認證標準,並由台積電公司代工生產,其中主晶片6項功能中有5項為CC認證(Common Criteria),安全評估等級達EAL5+以上, 達軍事機密等級。為了讓民眾對於數位身分證資安問題能夠釋疑,內政部近日也公告【賞金獵人】,懸賞500萬來徵求可複製New eID駭客。
除此,台灣在《戶籍法》、《電子簽章法》、《資通安全管理法》、《個人資料保護法》都有相關法源根據及針對冒用、偽造或變造國民身分證立有相關罰則。如戶籍法第75條規定: 意圖供冒用身分使用,而偽造、變造國民身分證,足以生損害於公眾或他人者,處五年以下有期徒刑、拘役或科或併科新臺幣五十萬元以下罰金。」 行使前項偽造、變造之國民身分證者,亦同。是故,針對新式數位身分證除事前軍事機密等級晶片防護個資外,也有法律罰則可作為嚇阻之用。

 

C.其他識別卡晶片化沒問題,唯獨身分證就不行?
個人識別的工具晶片數位化是趨勢,舉凡信用卡、金融卡、健保卡、電信門號..早就晶片數位化,對資安或隱私保護只有變更好。高舉反對身分證晶片數位化的人,難道沒有使用信用卡、金融卡、健保卡、電信門號..? 上述卡片爽爽用,卻堅決反對身分證數位晶片化,豈不怪哉?

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

節能減碳愛地球是景泰電動車的理念,是創立景泰電動車行的初衷,滿意態度更是服務客戶的最高品質,我們的成長來自於你的推薦。

 

反對「數位身分識別證」民眾理由之一是認為數位身分識別證將擁有”巨無霸”的功能,將具備個人隱私資料、健保、財產、稅務、駕照、悠遊卡、聯屬公投、手機…等等。不過,根據目前內政部釋出訊息,因民眾對資安的疑慮,台灣數位身分識別証只有身分證+個人自然人憑證功能,並無成為”巨無霸”功能規劃,這個反對理由有些無限上綱、 杞人憂天。

全面換發新式身分證,要花30~40億公帑,太浪費!?
數位化應用是擋不住的世界潮流,別人已經上太空,台灣還要停留在殺豬公? 這次台灣面臨新冠肺炎疫情能夠讓民眾有條不紊領取口罩,讓台灣防疫成果為人稱道,健保卡採取晶片數位化設計功不可沒。身分證全面換成晶片數位化設計,是台灣邁入現代數位智慧社會必要的投資,40億公帑投入是必要且划算的。

 

3.新式身分證的資安保護萬無一失嗎? 資安破口會是在哪裡?

雖然新式數位身分證在隱私保密與資安上都有水準以上的保護,但全世界沒有產品可以保證在資安是萬無一失的。就版主的觀點,新式數位身分證的資安破口並不是新式身分證晶片會容易被破解,而是來自使用者的【壞習慣】。根據目前新式身分證的設計規劃,版主認為將可能會有五大資費破口,說明如下:

A.遺失機會變大,如何及時掛失配套措施很重要:
由於新式身分證具自然人憑證功能,在多數人大都習慣隨身攜帶身分證下,不慎遺失的機會就會變高出很多,自然會增加被冒用風險。幸好,若新式身分證遺失比照現行自然人憑證的暫時停用及緊急停用功能,只要多加宣導,應該可以將風險降到最低。

 

B.三組密碼設計,用戶容易設定不安全密碼:
由於新式身分證具備三道密碼功能,其中加密區及自然人憑證區的密碼必須自設,這對於許多三寶人物或是對於個資安全較為忽略的人,很容易採用懶人密碼,導致被破解冒用。再者,目前每個人數位帳號滿天飛,密碼萬一遺失,如何有較安全的機制重設,也需要仔細考量,才不會變成破口。

 

C.第三方中介軟體不安全:
新式身分證支援自然人憑證功能以後,國人使用其功能的頻度將可望出現爆炸性增加。然新式身分證被讀取機會越多,若使用不安全第三方的中介軟體,就有可能出現密碼或卡片個資被側錄產生風險。教導民眾安全使用第三方中介軟體,也是未來新式身分證普及後的重要課題。

 

D.隱私過度保護,與目前商業認證衝突,反而造成資安大缺口:
這次新式身分證可能為杜悠悠之口,將新式身分證的卡面上資訊最小化,弱化身分證原本認證功能,朝自然人憑證IC卡化方向設計。然而身分證是目前許多商業行為(如申辦門號或信用卡)最重要的認證工具,將現行紙本身分證的許多重要資訊埋入必須使用密碼的公開區或加密區後,反而會造成擾民且導致個資更容易被洩漏。
以申辦電信門號為例,為防止出現盜偽件或欠費問題,根據現行電信業者門號申裝書填寫與查核規定,申辦店家必須查核申辦者的戶籍地址是否正確且需要填寫完整的身分證換補紀錄。然而這些資訊已經不在新式身分證的卡片上,就會衍生店家必須將被隱藏的戶籍地址..相關個資螢幕列印出來附在門號書上以佐證已經做好相關查核,這將造成民眾申辦門號許多麻煩,新式身分證公開區或加密區的資料被列印出來,也容易衍生個資外洩風險。

 

版主強烈建議內政部趕快找電信業者與銀行業者來商討,將民眾生活息息相關的門號、信用卡、金融卡申辦規範做一檢核,研擬出妥適的新式身分證卡面資訊項目。
身分證就是身分證,千萬不要本末倒置,卡面個資最小化只是擾民,這並非德政。

 

E.新式身分證用途多,家賊難防,危害可能變更大:
社會上一直有部分民眾財務或智慧有缺口,自願或被騙將身分證借給不肖份子使用。因新式身分證具備自然人憑證功能,未來所產生的危害也會更大。除用法律懲戒來防堵外,如何事前防堵未來也是重要課題。

 

天底下沒有萬無一失的資安保護,誠實面對可能的缺失,提前加以防範,才是解決民眾疑慮的良方。目前台灣民眾對於台灣「數位身分識別證」資安的疑慮,除了內政部的宣傳有待加強外,關鍵還是在於有些民眾或政治人物對於政府的不信任,與台灣防疫該不該採取普篩的爭論類似。
世界在進步,台灣要前進,國民身分證全面改用數位晶片化絕對是條必走的路。新式身分證對於隱私與個資保護比現行紙本身分證還要好,所以大家其實不用因噎廢食。針對版主提出的新式身分證可能出現的資安破口,只要主管機關能夠提前佈署及因應,將可能產生的民怨降到最低,相信全換換發國民數位身分證才可以讓這把數位鑰匙可以順利帶領國人通往璀璨與便利的數位智慧生活大道上!

您也許會喜歡:

【推爆】終身$0月租 打電話只要1元/分

立達合法徵信社-讓您安心的選擇

南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

搬家費用:依消費者運送距離、搬運樓層、有無電梯、步行距離、特殊地形、超重物品等計價因素後,評估每車次單

耐用度不輸卡羅拉!這些車有着成為全球銷量第一的特性?_網頁設計公司

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

透過選單樣式的調整、圖片的縮放比例、文字的放大及段落的排版對應來給使用者最佳的瀏覽體驗,所以不用擔心有手機版網站兩個後台的問題,而視覺效果也是透過我們前端設計師優秀的空間比例設計,不會因為畫面變大變小而影響到整體視覺的美感。

3L/100km,而自動擋平均7。8L/100km,其實不算很省油,但也不算很耗油,就是能接受。長安鈴木-啟悅指導價:8。79-12。19萬對於鈴木的車型,相信大家比較熟悉也比較常聽到也許是奧拓,但是從奧拓這款產品可以看出,鈴木的車型還是不錯的,至少耐操。

世界級的神車-卡羅拉,相信大家都很熟悉了,超過了4000多萬台銷量,成為了全球汽車銷量的冠軍,那麼,卡羅拉憑什麼能成為全球銷量第一的車型?

其實很簡單,作為一輛車,普普通通,價格不高,舒適,油耗低,耐操,是最基本的特點,剛卡羅拉剛好能滿足,加油就行,不管你是加多少號,定時做下保養,保養還不貴,用到報廢也不用怎麼大修。空間不是統計之最,但一家人能裝得下,包括行李,外觀接受度高,不是最好看,也不是最奇葩,沒有操控性但卻好開,油耗不是最低,但也不高,價格不高,但是“操”很久,沒有天籟舒適,但坐着還算舒服。

而卡羅拉的這些特點正是普通家庭對一輛車的所有需求,最通俗簡單點說就是—中庸。

當然,除了卡羅拉有這樣的特性之外,其他的一些車型也具備這樣特性,不能說完全,但至少具備有大部分。

廣汽本田-凌派

指導價:10.98-14.98萬

作為本田的第二支柱車型,在上市1年半內的時間里,賣出了30萬多台,可以說是一個很不錯的銷量數據了。凌派的外觀還算是帶着一些特色,但也不會先的很出眾,至少還是本田的那張臉,整體來說還算普通,是大眾能接受的設計。內飾同樣很簡約,整體設計風格還是本田的“普通”的設計,而這種簡約的設計特點就是,上手快,手上之後操作方便,這對於只是作為代步工具的的駕駛者來說,再好不過了。

凌派的配置全系都比較平均一些,即使低配的車型在舒適性的配置上有些“簡陋”,但是作為代步工具而言,也是夠用了,如果想要高一些舒適程度,上到中高配車型,會多了電動天窗,多功能方向盤,后駐車雷達等的實用性較高的舒適配置。雖然價格上去了,但好的是,車型之間價格區間並不大,

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

節能減碳愛地球是景泰電動車的理念,是創立景泰電動車行的初衷,滿意態度更是服務客戶的最高品質,我們的成長來自於你的推薦。

並且目前優惠也能去到1.5萬左右。凌派的車身尺寸在同級中算中規中矩,但是空間卻不小,這是本田特長之一,空間壓榨的很狠,滿員的情況下不會顯的擁擠。

凌派只有1.8L發動機的車型,匹配了5擋手動或CVT,這樣的匹配就可以看出,凌派就是一輛家用車,CVT再怎麼激烈駕駛,也就那樣。凌派的口碑油耗手動擋平均7.3L/100km,而自動擋平均7.8L/100km,其實不算很省油,但也不算很耗油,就是能接受。

長安鈴木-啟悅

指導價:8.79-12.19萬

對於鈴木的車型,相信大家比較熟悉也比較常聽到也許是奧拓,但是從奧拓這款產品可以看出,鈴木的車型還是不錯的,至少耐操。而啟悅這款車的外觀不算很鈴木,就是一輛緊湊型車的樣子,但顏值不算低,看久了還是挺好看的,耐看型。內飾很簡約,按鍵排列很規整,不過個人是覺得有些小,但操作起來還算方便,按錯的幾率不是很高。

啟悅低配和次低配的車型配置較低,沒有配備ESp和牽引力控制這兩個目前比較“流行”的操控安全配置,舒適性配置也沒多少,簡單說,低配和次低配車型就只是一輛車,能開,耐操,能載人。到了中配以上的車型,配置稍微好點,至少常談起的配置會比較齊全,但舒適性的配置還相對較少,頂配豐富一些,例如多了,中控屏,自動空調,多功能方向盤,畢竟價格比較低,怎麼說也還是合資車,配置將將夠用吧,其實算上最大的優惠1.3萬左右的話,也是不錯的選擇。空間規規矩矩,預算不多小家庭的第一輛車足夠用了。

啟悅也是只有一款1.6L發動機的車型,匹配了5擋手動或6擋手自一體,雖然平順性不及配備CVT的車型,但平順性還算好,只要你不是“胡亂”的駕駛,還是一輛好開的車,動力平時家用還算足夠,最重要的是鈴木的三大件耐操,在耐用性上可是可圈可點。而鈴木最出彩的技術莫過於對油耗的控制,啟悅的口碑油耗手動擋平均為5.9L/100km,而自動擋平均為6.5L/100km,如果說這還不算省油的話,只能說踩單車吧。

總結:介紹到的這輛車,也許某些方面比不過卡羅拉,但是都有這一樣的特性,外觀能看,價格不高,耐操,省油,家用空間足夠。雖然某一方面沒有統計之最之稱,但整體實力很平均,這對於家庭的代步工具而言,很符合。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

搬家費用:依消費者運送距離、搬運樓層、有無電梯、步行距離、特殊地形、超重物品等計價因素後,評估每車次單