分佈式系統(distributed system)是創建在網絡之上的軟件系統。正是由於軟件的特性,因此分佈式系統具備高度的內聚性和透明性。所以,網絡和分佈式系統之間的區別更多的在於高層軟件(特別是操做系統),而不是硬件。前端
爲何使用 MQ?java
如何保證 MQ 的高可用?node
MQ 的常見問題有:算法
消息的順序問題sql
消息有序指的是能夠按照消息的發送順序來消費。數據庫
假如生產者產生了 2 條消息:M一、M2,假定 M1 發送到 S1,M2 發送到 S2,若是要保證 M1 先於 M2 被消費,怎麼作?json
解決方案:(1)保證生產者 - MQServer - 消費者是一對一對一的關係緩存
缺陷:並行度就會成爲消息系統的瓶頸(吞吐量不夠)安全
更多的異常處理,好比:只要消費端出現問題,就會致使整個處理流程阻塞,咱們不得不花費更多的精力來解決阻塞的問題。 (2)經過合理的設計或者將問題分解來規避。bash
不關注亂序的應用實際大量存在
隊列無序並不意味着消息無序 因此從業務層面來保證消息的順序而不只僅是依賴於消息系統,是一種更合理的方式。
消息的重複問題
形成消息重複的根本緣由是:網絡不可達。
因此解決這個問題的辦法就是繞過這個問題。那麼問題就變成了:若是消費端收到兩條同樣的消息,應該怎樣處理?
消費端處理消息的業務邏輯保持冪等性。只要保持冪等性,無論來多少條重複消息,最後處理的結果都同樣。保證每條消息都有惟一編號且保證消息處理成功與去重表的日誌同時出現。利用一張日誌表來記錄已經處理成功的消息的 ID,若是新到的消息 ID 已經在日誌表中,那麼就再也不處理這條消息。
Kafka, ActiveMQ, RabbitMQ, RocketMQ 各有什麼優缺點?
若是您對java技術很感興趣能夠加入個人粉絲學習交流羣java架構交流羣:571617441通過一段時間整理了一些資料,包括但不限於:分佈式架構、高可擴展、高性能、高併發、Jvm性能調優、Spring,MyBatis,Nginx源碼分析,Redis,ActiveMQ、、Mycat、Netty、Kafka、Mysql、Zookeeper、Tomcat、Docker、Dubbo、Nginx等多個知識點高級進階乾貨,但願對大家的技術提高有必定的參考和幫助
Dubbo 的實現過程?
節點角色:
調用關係:
Dubbo 負載均衡策略有哪些?
Random
RoundRobin
LeastActive
ConsistentHash
Dubbo 集羣容錯策略 ?
動態代理策略?
Dubbo 做爲 RPC 框架,首先要完成的就是跨系統,跨網絡的服務調用。消費方與提供方遵循統一的接口定義,消費方調用接口時,Dubbo 將其轉換成統一格式的數據結構,經過網絡傳輸,提供方根據規則找到接口實現,經過反射完成調用。也就是說,消費方獲取的是對遠程服務的一個代理(Proxy),而提供方由於要支持不一樣的接口實現,須要一個包裝層(Wrapper)。調用的過程大概是這樣:
消費方的 Proxy 和提供方的 Wrapper 得以讓 Dubbo 構建出複雜、統一的體系。而這種動態代理與包裝也是經過基於 SPI 的插件方式實現的,它的接口就是ProxyFactory。@SPI("javassist")
public interface ProxyFactory {
@Adaptive({Constants.PROXY_KEY})
<T> T getProxy(Invoker<T> invoker) throws RpcException;
@Adaptive({Constants.PROXY_KEY})
<T> Invoker<T> getInvoker(T proxy, Class<T> type, URL url) throws RpcException;
}
複製代碼
ProxyFactory 有兩種實現方式,一種是基於 JDK 的代理實現,一種是基於 javassist 的實現。ProxyFactory 接口上定義了@SPI("javassist"),默認爲 javassist 的實現。
Dubbo 支持哪些序列化協議?Hessian?Hessian 的數據結構?
Hessian 序列化與 Java 默認的序列化區別?
Hessian 是一個輕量級的 remoting on http 工具,採用的是 Binary RPC 協議,因此它很適合於發送二進制數據,同時又具備防火牆穿透能力。
Protocol Buffer 是 Google 出品的一種輕量 & 高效的結構化數據存儲格式,性能比 Json、XML 真的強!太!多!
Protocol Buffer 的序列化 & 反序列化簡單 & 速度快的緣由是:
Protocol Buffer 的數據壓縮效果好(即序列化後的數據量體積小)的緣由是:
註冊中心掛了能夠繼續通訊嗎?
能夠。Dubbo 消費者在應用啓動時會從註冊中心拉取已註冊的生產者的地址接口,並緩存在本地。每次調用時,按照本地存儲的地址進行調用。
ZooKeeper 原理是什麼?ZooKeeper 有什麼用?
ZooKeeper 是一個分佈式應用協調系統,已經用到了許多分佈式項目中,用來完成統一命名服務、狀態同步服務、集羣管理、分佈式應用配置項的管理等工做。
Netty 有什麼用?NIO/BIO/AIO 有什麼用?有什麼區別?
Netty 是一個「網絡通信框架」。
Netty 進行事件處理的流程。Channel是鏈接的通道,是 ChannelEvent 的產生者,而ChannelPipeline能夠理解爲 ChannelHandler 的集合。
IO 的方式一般分爲幾種:
NIO 基於 Reactor,當 socket 有流可讀或可寫入 socket 時,操做系統會相應的通知引用程序進行處理,應用再將流讀取到緩衝區或寫入操做系統。也就是說,這個時候,已經不是一個鏈接就要對應一個處理線程了,而是有效的請求,對應一個線程,當鏈接沒有數據時,是沒有工做線程來處理的。
與 NIO 不一樣,當進行讀寫操做時,只須直接調用 API 的 read 或 write 方法便可。這兩種方法均爲異步的,對於讀操做而言,當有流可讀取時,操做系統會將可讀的流傳入 read 方法的緩衝區,並通知應用程序;對於寫操做而言,當操做系統將 write 方法傳遞的流寫入完畢時,操做系統主動通知應用程序。便可以理解爲,read/write 方法都是異步的,完成後會主動調用回調函數。
爲何要進行系統拆分?拆分不用 Dubbo 能夠嗎?
系統拆分從資源角度分爲:應用拆分和數據庫拆分。
從採用的前後順序可分爲:水平擴展、垂直拆分、業務拆分、水平拆分。
是否使用服務依據實際業務場景來決定。當垂直應用愈來愈多,應用之間交互不可避免,將核心業務抽取出來,做爲獨立的服務,逐漸造成穩定的服務中心,使前端應用能更快速的響應多變的市場需求。此時,用於提升業務複用及整合的分佈式服務框架(RPC)是關鍵。
當服務愈來愈多,容量的評估,小服務資源的浪費等問題逐漸顯現,此時需增長一個調度中心基於訪問壓力實時管理集羣容量,提升集羣利用率。此時,用於提升機器利用率的資源調度和治理中心(SOA)是關鍵。
Dubbo 和 Thrift 有什麼區別?
若是您對java技術很感興趣能夠加入個人粉絲學習交流羣java架構交流羣 :571617441通過一段時間整理了一些資料,包括但不限於:分佈式架構、高可擴展、高性能、高併發、Jvm性能調優、Spring,MyBatis,Nginx源碼分析,Redis,ActiveMQ、、Mycat、Netty、Kafka、Mysql、Zookeeper、Tomcat、Docker、Dubbo、Nginx等多個知識點高級進階乾貨,但願對大家的技術提高有必定的參考和幫助