您现在的位置是:Instagram刷粉絲, Ins買粉絲自助下單平台, Ins買贊網站可微信支付寶付款 > 

03 java 發布訂閱模式(消息隊列原理及選型)

Instagram刷粉絲, Ins買粉絲自助下單平台, Ins買贊網站可微信支付寶付款2024-05-10 03:57:46【】5人已围观

简介atmostonce:消費者fetch消息,然后保存offset,然后處理消息;當client保存offset之后,但是在消息處理過程中出現了異常,導致部分消息未能繼續處理。那么此后"未處理"的消息將

at most once: 消費者fetch消息,然后保存offset,然后處理消息;當client保存offset之后,但是在消息處理過程中出現了異常,導致部分消息未能繼續處理。那么此后"未處理"的消息將不能被fetch到,這就是"at most once"。

at least once: 消費者fetch消息,然后處理消息,然后保存offset。如果消息處理成功之后,但是在保存offset階段zookeeper異常導致保存操作未能執行成功,這就導致接下來再次fetch時可能獲得上次已經處理過的消息,這就是"at least once",原因offset沒有及時的提交給zookeeper,zookeeper恢復正常還是之前offset狀態。

exactly once: kafka中并沒有嚴格的去實現(基于2階段提交,事務),我們認為這種策略在kafka中是沒有必要的。

通常情況下“at-least-once”是我們首選。(相比at most once而言,重復接收數據總比丟失數據要好)。

kafka高可用由多個broker組成,每個broker是一個節點;

創建一個topic,這個topic會劃分為多個partition,每個partition存在于不同的broker上,每個partition就放一部分數據。

kafka是一個分布式消息隊列,就是說一個topic的數據,是分散放在不同的機器上,每個機器就放一部分數據。

在0.8版本以前,是沒有HA機制的,就是任何一個broker宕機了,那個broker上的partition就廢了,沒法寫也沒法讀,沒有什么高可用性可言。

0.8版本以后,才提供了HA機制,也就是就是replica副本機制。每個partition的數據都會同步到其他的機器上,形成自己的多個replica副本。然后所有replica會選舉一個leader出來,那么生產和消費都跟這個leader打交道,然后其他replica就是follower。

寫的時候,leader會負責把數據同步到所有follower上去,讀的時候就直接讀leader上數據即可。

kafka會均勻的將一個partition的所有replica分布在不同的機器上,從而提高容錯性。

如果某個broker宕機了也沒事,它上面的partition在其他機器上都有副本的,如果這上面有某個partition的leader,那么此時會重新選舉一個新的leader出來,大家繼續讀寫那個新的leader即可。這就有所謂的高可用性了。

寫數據的時候,生產者就寫leader,然后leader將數據落地寫本地磁盤,接著其他follower自己主動從leader來pull數據。一旦所有follower同步好數據了,就會發送ack給leader,leader收到所有follower的ack之后,就會返回寫成功的消息給生產者。

消息丟失會出現在三個環節,分別是生產者、mq中間件、消費者:

RabbitMQ

Kafka

大體和RabbitMQ相同。

Rabbitmq

需要保證順序的消息投遞到同一個queue中,這個queue只能有一個買粉絲nsumer,如果需要提升性能,可以用內存隊列做排隊,然后分發給底層不同的worker來處理。

Kafka

寫入一個partition中的數據一定是有序的。生產者在寫的時候 ,可以指定一個key,比如指定訂單id作為key,這個訂單相關數據一定會被分發到一個partition中去。消費者從partition中取出數據的時候也一定是有序的,把每個數據放入對應的一個內存隊列,一個partition中有幾條相關數據就用幾個內存隊列,消費者開啟多個線程,每個線程處理一個內存隊列。

觀察者模式(Observer Pattern)

觀察者模式又稱為發布訂閱模式。一個發布者對應多個訂閱者,一旦發布者的狀態發生改變時,訂閱者將收到訂閱事件。

先看看一個生活中的例子:

我們使用想瀏覽Java相關的文章,于是我們點擊訂閱了[Java專題],當[Java專題]有新文章發布就會推送給我們,當然其他人也可以訂閱[Java專題]并收到[Java專題]的推送。這就是觀察者。 定義對象間的一對多關系,當一個對象的狀態發生變化時,所依賴于它的對象都得到通知并主動更新。在觀察者模式中,多個訂閱者成為觀察者(Observer),被觀察的對象成為目標(Subject)。

實現觀察者模式的方法不只一種,但是以包含Subject與Observer接口的類設計的做法最常見。(Java API 內置觀察者模式用的是Observer接口與Observable類)

觀察者模式UML圖:

先定義觀察者模式的接口

在觀察者模式的實現上,有推模式和拉模式兩種方式。

上面例子中

void updateByPush(Object obj) 就是推模式;

void updateByPull(Subject subject)就是拉模式

java.util包內包含最基本的Observer接口與Observable類(其實對應的就是Subject類)

我們看一下Observer源碼

我們看到update更新方法有兩個參數:Observable、Object,可見Java API 內置觀察者模式同時支持[拉]和[取]

我們再來看看Observable類源碼

注意Observable是一個類,而不是接口,這有一定的局限性。因為如果某個類想同時具有Observable類和另一個超類的行為,就會陷入兩難,畢竟Java不支持多重繼承。

有點需要特別提一下的就是,Java API 內置的Observable需要調用一下 setChanged();觀察者才能收到推送,我們看一下源碼,發現notifyObservers方法里有判斷changed的狀態為true才去通知觀察者。

我們自己實現觀察者模式的時候是沒有這一點的,那加上這一個標志位有什么好處?好處就是更靈活,Observable類只提供這個boolean值來表明是否發生變化,而不定義什么叫變化,因為每個業務中對變化的具體定義不一樣,因此子類自己來判斷是否變化;該變量既提供了一種抽象(變與不變),同時提供了一種觀察者更新狀態的可延遲加載,通過后面的notifyObservers方法分析可知觀察者是否會調用update方法,依賴于changed變量,因此即使被觀察者在邏輯上發生改變了,只要不調用setChanged,update是不會被調用的。如果我們在某些業務場景不需要頻繁觸發update,則可以適時調用setChanged方法來延遲刷新。

阿里云折扣快速入口

下面哪些方法可以用作javascript異步模式的編程

javascript語言是單線程機制。所謂單線程就是按次序執行,執行完一個任務再執行下一個。

對于瀏覽器來說,也就是無法在渲染頁面的同時執行代碼。

單線程機制的優點在于實現起來較為簡單,運行環境相對簡單。缺點在于,如果中間有任務需要響應時間過長,經常會導致

頁面加載錯誤或者瀏覽器無響應的狀況。這就是所謂的逗同步模式地,程序執行順序與任務排列順序一致。對于瀏覽器來說,

同步模式效率較低,耗時長的任務都應該使用異步模式;而在服務器端,異步模式則是唯一的模式,如果采用同步模式個人認為

服務器很快就會出現12306在高峰期的表現。。。。

異步模式的四種方式:

1.回調函數callback

所謂回調函數,就是將函數作為參數傳到需要回調的函數內部再執行。

典型的例子就是發送ajax請求。例如:

$.ajax({

async: false,

cache: false,

dataType: 'json',

url: "url",

success: function(data) {

買粉絲nsole.log('success');

},

error: function(data) {

買粉絲nsole.log('error');

}

})

當發送ajax請求后,等待回應的過程不會堵塞程序運行,耗時的操作相當于延后執行。

回調函數的優點在于簡單,容易理解,但是可讀性較差,耦合度較高,不易于維護。

2.事件驅動

javascript可以稱之為是基于對象的語言,而基于對象的基本特征就是事件驅動(Event-Driven)。

事件驅動,指的是由鼠標和熱鍵的動作引發的一連串的程序操作。

例如,為頁面上的某個

$('#btn').onclick(function(){

買粉絲nsole.log('click button');

});

綁定事件相當于在元素上進行監聽,是否執行注冊的事件代碼取決于事件是否發生。

優點在于容易理解,一個元素上可以綁定多個事件,有利于實現模塊化;但是缺點在于稱為事件驅動的模型后,流程不清晰。

3.發布/訂閱

發布訂閱模式(publish-subscribe pattern)又稱為觀察者模式(Observer pattern)。

該模式中,有兩類對象:觀察者和目標對象。目標對象中存在著一份觀察者的列表,當目標對象

的狀態發生改變時,主動通知觀察者,從而建立一種發布/訂閱的關系。

jquery有相關的插件,在這不是重點不細說了。。。。回頭寫個實現貼上來

4.promise模式

promise對象是CommonJS工作組提供的一種規范,用于異步編程的統一接口。

promise對象通常實現一種then的方法,用來在注冊狀態發生改變時作為對應的回調函數。

promise模式在任何時刻都處于以下三種狀態之一:未完成(unfulfilled)、已完成(resolved)和拒絕(rejected)。以CommonJS

Promise/A

標準為例,promise對象上的then方法負責添加針對已完成和拒絕狀態下的處理函數。then方法會返回另一個promise對象,以便于形成pro

很赞哦!(37573)

Instagram刷粉絲, Ins買粉絲自助下單平台, Ins買贊網站可微信支付寶付款的名片

职业:程序员,设计师

现居:安徽亳州涡阳县

工作室:小组

Email:[email protected]