1. 程式人生 > >架構設計:系統間通訊(16)——服務治理與Dubbo 中篇(預熱)

架構設計:系統間通訊(16)——服務治理與Dubbo 中篇(預熱)

1、前序

上篇文章中(《架構設計:系統間通訊(15)——服務治理與Dubbo 上篇》),我們以示例的方式講解了阿里DUBBO服務治理框架基本使用。從這節開始我們將對DUBBO的主要模組的設計原理進行講解,從而幫助讀者理解DUBBO是如何工作的。(由於這個章節的內容比較多,包括了知識準備、DUBBO框架概述、DUBBO各模組分析,所以我將把內容切割成多篇文章)

2、基礎知識準備

為了讓讀者更好理解下文講解的內容,在開始講解DUBBO框架主要模組前,我們先要介紹一些基礎知識。這些基礎知識將幫助讀者更輕鬆的看懂後面的技術分析。這些基礎知識包括了一個在DUBBO框架代理層工作的Javassist元件、一種在整個DUBBO框架各層中大量運用的建立型模式:工廠方法模式、以及幾種在DUBBO各層使用的第三方框架。

2-1、動態程式設計:Javassist

Javassist是一個開源的分析、編輯和建立Java位元組碼的類庫。是由東京工業大學的數學和計算機科學系的 Shigeru Chiba (千葉 滋)所建立的。它已加入了開放原始碼JBoss 應用伺服器專案,通過使用Javassist對位元組碼操作為JBoss實現動態”AOP”框架。(摘自百度百科)

說人話就是:在JAVA應用程式執行時,按照要求動態生成class並且完成例項化。我們都知道在JAVA語言中我們可以通過“反射”機制在JAVA應用程式執行時載入業已存在的class檔案。但前提有兩個:即這個class是已經在編譯時存在的,另外這個class在JAVA-Classloader可以識別的路徑上。

而Javassist元件給了我們一個新的選擇,在編譯期不需要有這個java檔案的存在也不需要這個java檔案編譯好一個class。而是執行時再生成class。使用的程式碼示例如下:

<code class="hljs avrasm has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">ClassPool pool = ClassPool<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.getDefault</span>()<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>

// 建立一個名叫Foo的類
CtClass cc = pool<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.makeClass</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Foo"</span>)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>

// 建立一個名叫‘getInteger’的方法
CtMethod mthd = CtNewMethod<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.make</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"public Integer getInteger() { return null; }"</span>, cc)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>
cc<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.addMethod</span>(mthd)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>

// 建立一個名叫i的屬性,它的型別是‘int’
CtField f = new CtField(CtClass<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.intType</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"i"</span>, cc)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>
point<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.addField</span>(f)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>

// 例項化這個類
clazz = cc<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.toClass</span>()<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">; </span>
Object instance = class<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.newInstance</span>()<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li></ul>

大家先猜猜,DUBBO用它幹什麼呢?提示:主要是DUBBO中RPC模組的“代理層”在用哦~~

2-2、設計模式:工廠方法模式

設計模式中有一種建立模型(23中設計模式,分為三大類:建立模型、結構模型和行為模型), 在這種建立模型下,我們通過A介面的工廠AFactory介面,建立任何一種特定環境下的A介面實現。

例如我們可以定義一個Router(路由服務),並且通過Router的RouterFactory抽象工廠,來統一任何一種路由的具體實現(無論是編輯指令碼實現的路由、配置檔案實現的路由,還是動態條件實現的路由),對外部呼叫者來說,它看到的都是“Router”這個介面服務。以下是典型的工廠方法模式的類圖:

工廠方法模式

上圖中,Client類在DUBBO框架中,代表了框架內的其他模組。工廠方法模式的優點在於對於某種形態的業務實現來說,都會有一個特定的具體物件工廠指向它;那麼當需要新增一種新業務實現時,只需要新增這個業務介面的另外一個具體實現和指向這個實現的具體工廠:現在DUBBO支援的RPC協議層支援Dubbo、Thrift、RMI等,他們都有相應的建立工廠;如果後續DUBBO框架需要引入一種新的RPC協議層支援,只需要建立這個RPC協議的具體實現,和對應的建立工廠。已有的RPC協議支援不會受到任何影響,DUBBO框架中使用這個RPC協議模組的其他模組,由於使用的是Protocol介面,所以也不會感覺有任何的不同。

給出Client具體的使用方式(虛擬碼,我寫得比較’快’,前提是我知道您已經理解抽象工廠模式的設計核心):

<code class="hljs cs has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">IProductFactory productFactory = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">null</span>;
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>([conditionA]) {
    productFactory = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> ProductAFactory();
} <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>([conditionB]) {
    productFactory = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> ProductBFactory();
}

IProduct product = productFactory.getProduct();</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li></ul>

很明顯如果Client這樣使用抽象工廠建立具體的IProduct實現就會出現一個謬論:Client必須知道現在的系統環境要麼是conditionA要麼是conditionB,也必須知道IProductFactory介面有兩個實現,要麼是ProductAFactory要麼是ProductBFactory。

為了保證這些細節‘呼叫者不需要關心’,其中一種做法是將IProductFactory的實現細節隱藏到這個工廠方法模型的內部:將工廠介面抽象化,並且結合單例模式在內部完成例項化:

<code class="hljs r has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">public abstract class AbstractProductFactory {

    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span>

    public static AbstractProductFactory getNewInstance() {
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span>
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>([<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'如果配置條件是A'</span>]) {
            productFactory = new ProductAFactory();
        } <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'如果配置條件是B'</span>) {
            productFactory = new ProductBFactory();
        }

        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> productFactory;
    }

    public abstract IProduct getProduct();
}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li></ul>

這樣依賴AbstractProductFactory是建立ProductAFactory還是建立ProductBFactory的條件邏輯就不需要模組的呼叫者知曉了,模組的呼叫者也不會知道IProduct具體有兩種業務實現。但是AbstractProductFactory還是沒有逃脫厄運:在有新的業務環境、業務實現加入模組時,技術人員還是需要改寫AbstractProductFactory中的getNewInstance實現。這裡的本質原因是,您始終都要自己寫‘new’關鍵字,既然要寫‘new’關鍵字,您就必須知道所有的細節

那麼有沒有方法,讓AbstractProductFactory進一步拜託這個厄運呢(設計結構更加優化)?答案肯定是有的:使用Spring的動態代理技術,徹底擺脫‘new’:

<code class="hljs r has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">public Class Client {

    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span> 

    @Autowired
    private IProductFactory productFactory;

    public void someMethod() {
        IProduct product = productFactory.getProduct();
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span>
    }
}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li></ul>

以下是spring的配置資訊

<code class="hljs applescript has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><bean <span class="hljs-property" style="box-sizing: border-box;">id</span>=<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"productFactory"</span> <span class="hljs-type" style="box-sizing: border-box;">class</span>=<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">".......ProductAFactory"</span>/></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>

2-3、RPC名詞:

現在業界主流的RPC技術在前文中已經提過一次。這裡為了便於大家儘快找到節奏,再進行一次概括性的介紹(以下介紹摘自百度百科):

  • Apache Thrift:Thrift最初由facebook開發用做系統內各語言之間的RPC通訊 。08年5月進入apache孵化器 。Apache Thrift通過自身獨立的一套IDL語言支援多種語言之間的RPC方式的通訊。

  • RMI:RMI是Java的一組擁護開發分散式應用程式的API。RMI使用Java語言介面定義了遠端物件,它集合了Java序列化和Java遠端方法協議(Java Remote Method Protocol)。RMI具有RPC規則中典型的功能劃分,是一種在Java語言構建的系統間進行遠端呼叫的RPC框架。

  • Hessian:Hessian是一個輕量級的remoting onhttp工具,使用簡單的方法提供了RMI的功能。 相比WebService,Hessian更簡單、快捷。採用的是二進位制RPC協議,因為採用的是二進位制協議,所以它很適合於傳送二進位制資料。

RPC框架的核心/次要結構要素,在我前面的一篇博文(《架構設計:系統間通訊(10)——RPC的基本概念》)中已經詳細介紹過。

這裡寫圖片描述 
它們分別是:

  • 服務管理層/註冊管理層(Selector/Processor):存在於RPC服務端,由於伺服器端某一個RPC介面的實現的特性(它並不知道自己是一個將要被RPC提供給第三方系統呼叫的服務)。所以在RPC框架中應該有一種“負責執行RPC介面實現”的角色。它負責了包括:管理RPC介面的註冊、判斷客戶端的請求許可權、控制介面實現類的執行在內的各種工作。

  • 呼叫代理層(Stub/Proxy):RPC代理存在於客戶端,因為要實現客戶端對RPC框架“透明”呼叫,那麼客戶端不可能自行去管理訊息格式、不可能自己去管理網路傳輸協議,也不可能自己去判斷呼叫過程是否有異常。這一切工作在客戶端都是交給RPC框架中的“代理”層來處理的。

  • 訊息層/序列化層(Message Protocol):RPC的訊息管理層專門對網路傳輸所承載的訊息資訊進行編號和解碼操作。目前流行的技術趨勢是不同的RPC實現,為了加強自身框架的效率都有一套(或者幾套)私有的訊息格式。就像前文介紹過的RMI的JRMP協議、Thrift的私有訊息協議等。

  • 傳輸管理層(Transfer/Network Protocol):傳輸協議層負責管理RPC框架所使用的網路協議、網路IO模型。例如Hessian的傳輸協議基於HTTP(應用層協議);而Thrift的傳輸協議基於TCP(傳輸層協議)。傳輸層還需要統一RPC客戶端和RPC服務端所使用的網路IO模型;

  • IDL語言:實際上IDL(介面定義語言)並不是RPC實現中所必須的。但是需要跨語言的RPC框架一定會有IDL部分的存在。這是因為要找到一個各種語言能夠理解的訊息結構、介面定義的描述形式。如果您的RPC實現沒有考慮跨語言性,那麼IDL部分就不是必須的。

2-4、網路框架層名詞:

  • 網路IO模型:網路IO模型是計算機IO技術的一個分支(磁碟IO模型我將會在下一個系列博文:儲存系統中進行詳細說明,計劃明年上半年在這個系列博文結束後即刻推出)。目前包括的網路IO模型有:阻塞式同步IO、非阻塞式同步IO、多路複用IO和非同步IO。

  • Netty和MINA:這兩款網路IO模型的封裝元件是由同一個技術人員主導完成的。其中Netty是由JBOSS提供的一個java開源框架。Netty和MINA一樣,提供非同步的、事件驅動的網路應用程式框架和工具(不且不僅僅限於此),用以快速開發高效能、高可靠性的網路伺服器和客戶端程式。

  • Writing scalable server applications in the Java™ programming language has always been difficult. Before the advent of the Java New I/O API (NIO), thread management issues made it impossible for a server to scale to thousands of users. The Grizzly NIO framework has been designed to help developers to take advantage of the Java™ NIO API. Grizzly’s goal is to help developers to build scalable and robust servers using NIO as well as offering extended framework components: Web Framework (HTTP/S), WebSocket, Comet, and more!

(接下文)

相關推薦

架構設計系統通訊16——服務治理Dubbo 中篇預熱

1、前序 上篇文章中(《架構設計:系統間通訊(15)——服務治理與Dubbo 上篇》),我們以示例的方式講解了阿里DUBBO服務治理框架基本使用。從這節開始我們將對DUBBO的主要模組的設計原理進行講解,從而幫助讀者理解DUBBO是如何工作的。(由於這個章節的內容比較多,包括了知識準備、DUBBO框架概述

架構設計系統通訊36——Apache Camel快速入門

架構設計:系統間通訊(36)——Apache Camel快速入門(上) :http://blog.csdn.net/yinwenjie(未經允許嚴禁用於商業用途!) https://blog.csdn.net/yinwenjie/article/details/51692340 1、本專題主

架構設計系統通訊34——被神化的ESB

1、概述 從本篇文章開始,我們將花一到兩篇的篇幅介紹ESB(企業服務匯流排)技術的基本概念,為讀者們理清多個和ESB技術有關名詞。我們還將在其中為讀者闡述什麼情況下應該使用ESB技術。接下來,為了加深讀者對ESB技術的直觀理解,我們將利用Apache Came

架構設計系統通訊6——IO通訊模型和Netty 上篇

1、Netty介紹 在Netty官網上,對於Netty的介紹是: Netty is a NIO client server framework which enables quick and easy development of network ap

架構設計系統通訊23——提高ActiveMQ工作效能

6、ActiveMQ處理規則和優化 在ActiveMQ單個服務節點的優化中,除了對ActiveMQ單個服務節點的網路IO模型進行優化外,生產者傳送訊息的策略和消費者處理訊息的策略也關乎整個訊息佇列系統是否能夠高效工作。請看下圖所示的訊息生產者和訊息消費

架構設計系統通訊15——服務治理Dubbo 上篇

1、上篇中“自定義服務治理框架”的問題 在之前的文章中(《架構設計:系統間通訊(13)——RPC例項Apache Thrift 下篇(1)》、《架構設計:系統間通訊(14)——RPC例項Apache Thrift 下篇(2)》),我們基於服務治理的基本原理,自

架構設計系統通訊21——ActiveMQ的安裝使用

1、前言 之前我們通過兩篇文章(架構設計:系統間通訊(19)——MQ:訊息協議(上)、架構設計:系統間通訊(20)——MQ:訊息協議(下))從理論層面上為大家介紹了訊息協議的基本定義,並花了較大篇幅向讀者介紹了三種典型的訊息協議:XMPP協議、Stomp協議和

架構設計系統通訊10——RPC的基本概念

1、概述 經過了詳細的資訊格式、網路IO模型的講解,並且通過JAVA RMI的講解進行了預熱。從這篇文章開始我們將進入這個系列博文的另一個重點知識體系的講解:RPC。在後續的幾篇文章中,我們首先講解RPC的基本概念,一個具體的RPC實現會有哪些基本要素構成,然

架構設計系統通訊40——自己動手設計ESB1

1、概述 在我開始構思這幾篇關於“自己動手設計ESB中介軟體”的文章時,曾有好幾次動過放棄的念頭。原因倒不是因為對冗長的文章產生了惰性,而是ESB中所涉及到的技術知識和需要突破的設計難點實在是比較多,再冗長的幾篇博文甚至無法對它們全部進行概述,另外如果在思路上

架構設計系統通訊39——Apache Camel快速入門下2

4-2-1、LifecycleStrategy LifecycleStrategy介面按照字面的理解是一個關於Camel中元素生命週期的規則管理器,但實際上LifecycleStrategy介面的定義更確切的應該被描述成一個監聽器: 當Camel

架構設計系統通訊24——提高ActiveMQ工作效能

7、ActiveMQ的持久訊息儲存方案 前文已經講過,當ActiveMQ接收到PERSISTENT Message訊息後就需要藉助持久化方案來完成PERSISTENT Message的儲存。這個介質可以是磁碟檔案系統、可以是ActiveMQ的內建資料庫

架構設計系統通訊37——Apache Camel快速入門

(補上文:Endpoint重要的漏講內容) 3-1-2、特殊的Endpoint Direct Endpoint Direct用於在兩個編排好的路由間實現Exchange訊息的連線,上一個路由中由最後一個元素處理完的Exchange物件,將被髮送至由D

架構設計系統通訊28——Kafka及場景應用中1

在本月初的寫作計劃中,我本來只打算粗略介紹一下Kafka(同樣是因為進度原因)。但是,最近有很多朋友要求我詳細講講Kafka的設計和使用,另外兩年前我在研究Kafka準備將其應用到生產環境時,由於沒有仔細理解Kafka的設計結構所導致的問題最後也還沒有進行交

架構設計系統通訊26——ActiveMQ叢集方案

3、ActiveMQ熱備方案 ActiveMQ熱備方案,主要保證ActiveMQ的高可用性。這種方案並不像上節中我們主要討論的ActiveMQ高效能方案那樣,同時有多個節點都處於工作狀態,也就是說這種方案並不提高ActiveMQ叢集的效能;而是從叢集中的多

架構設計系統通訊38——Apache Camel快速入門下1

3-5-2-3迴圈動態路由 Dynamic Router 動態迴圈路由的特點是開發人員可以通過條件表示式等方式,動態決定下一個路由位置。在下一路由位置處理完成後Exchange將被重新返回到路由判斷點,並由動態迴圈路由再次做出新路徑的判斷。如此迴圈執行

架構設計系統通訊2——概述從“聊天”開始下篇

【轉】https://blog.csdn.net/yinwenjie/article/details/48344989 4-3、NIO通訊框架 目前流行的NIO框架非常的多。在論壇上、網際網路上大家討論和使用最多的有以下幾種: 原生JAVA NIO框架:

架構設計系統通訊——ActiveMQ叢集方案

1、綜述 通過之前的文章,我們討論了ActiveMQ的基本使用,包括單個ActiveMQ服務節點的效能特徵,關鍵調整引數;我們還介紹了單個ActiveMQ節點上三種不同的持久化儲存方案,並討論了這三種不同的持久化儲存方案的配置和效能特點。但是這還遠遠不夠,因為在生產環境

架構設計系統通訊——MQ訊息協議

1、概述從本文開始,我們介紹另一型別的系統間通訊及輸:MQ訊息佇列。首先我們將討論幾種常用訊息佇列協議的基本原理和工作方式,包括MQTT、XMPP、Stomp、AMQP、OpenWire等。然後在這個基礎上介紹兩款MQ產品:ActiveMQ和RabbitMQ,它們是現在業務系

架構設計系統存儲28——分布式文件系統Ceph掛載

all 兩個文件 原因 之前 來看 大數據 details 失敗 variable (接上文《架構設計:系統存儲(27)——分布式文件系統Ceph(安裝)》) 3. 連接到Ceph系統 3-1. 連接客戶端 完畢Ceph文件系統的創建過程後。就

架構設計系統儲存18——Redis叢集方案高效能

1、概述 通過上一篇文章(《架構設計:系統儲存(17)——Redis叢集方案:高可用》)的內容,Redis主從複製的基本功能和進行Redis高可用叢集監控的Sentinel基本功能基本呈現給了讀者。雖然本人並不清楚上一篇根據筆者實際工作經驗所撰寫的文章有什麼重