最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java消息隊(duì)列的簡單實(shí)現(xiàn)代碼

 更新時間:2017年07月24日 10:00:50   作者:有逼格d伊凡  
本篇文章主要介紹了Java消息隊(duì)列的簡單實(shí)現(xiàn)代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

今天看到我們的招聘信息有對消息隊(duì)列有要求,然后就思索了一翻,網(wǎng)上一搜一大堆。

我可以舉個小例子先說明應(yīng)用場景

假設(shè)你的服務(wù)器每分鐘的處理量為200個,但客戶端再峰值的時候可能一分鐘會發(fā)1000個消息給你,這時候你就可以把他做成隊(duì)列,然后按正常有序的處理,先進(jìn)后出(LIFO),先進(jìn)先出(FIFO)可根據(jù)自己的情況進(jìn)行定奪

stack  先進(jìn)后出(LIFO)--------Java 對應(yīng)的類 Stack

隊(duì)列 先進(jìn)先出(FIFO)--------java對應(yīng)的類Queue

這兩種都可用Linkedlist進(jìn)行封裝和實(shí)現(xiàn),下面是我自己寫的一個棧的例子

/** 
 * @author 劉伊凡 
 * --------->>>>>>隊(duì)列的實(shí)現(xiàn)-------------- 
 */ 
public class MyStack<T> { 
  private LinkedList<T> storage = new LinkedList<T>(); 
 
  public synchronized void push(T e) {//需要加上同步 
    storage.addFirst(e); 
  } 
 
  public T peek() { 
    return storage.getFirst(); 
  } 
 
  public void pop() { 
    storage.removeFirst(); 
  } 
 
  public boolean empty() { 
    return storage.isEmpty(); 
  } 
 
  @Override 
  public String toString() { 
    return storage.toString(); 
  } 
 
} 

下面是一個測試類

/** 
 * @author 劉伊凡 
 * 
 */ 
public class StackTest { 
  public static void main(String[] args) { 
    MyStack<String> stack = new MyStack<String>(); 
    for(String s : "the prefect code".split(" ")){//LIFO 
      stack.push(s); 
    } 
    while(!stack.empty()){ 
      System.out.print(stack.peek()+" "); 
      stack.pop(); 
    } 
     
    System.out.println(); 
    for(char s : "寫了個一句話倒起來說的程序".toCharArray()){//用例:正話反說 
      stack.push(String.valueOf(s)); 
    } 
    while(!stack.empty()){ 
      System.out.print(stack.peek()); 
      stack.pop(); 
    } 
  } 
} 

挺有意思的,讓我想了,以前在學(xué)校的晚會上,主持人互動的時候會讓人上臺去答題拿獎品,其中有一個題目就是主持人說一句話,然后要求選手倒起來說,我們的這個程序很符合需求嘛,哈哈,我們可以用java來作弊,學(xué)以致用

消息隊(duì)列的應(yīng)用場景,補(bǔ)充(來自互聯(lián)網(wǎng))

個人認(rèn)為消息隊(duì)列的主要特點(diǎn)是異步處理,主要目的是減少請求響應(yīng)時間和解耦。所以主要的使用場景就是將比較耗時而且不需要即時(同步)返回結(jié)果的操作作為消息放入消息隊(duì)列。同時由于使用了消息隊(duì)列,只要保證消息格式不變,消息的發(fā)送方和接收方并不需要彼此聯(lián)系,也不需要受對方的影響,即解耦和。

使用場景的話,舉個例子:

假設(shè)用戶在你的軟件中注冊,服務(wù)端收到用戶的注冊請求后,它會做這些操作:

校驗(yàn)用戶名等信息,如果沒問題會在數(shù)據(jù)庫中添加一個用戶記錄

如果是用郵箱注冊會給你發(fā)送一封注冊成功的郵件,手機(jī)注冊則會發(fā)送一條短信

分析用戶的個人信息,以便將來向他推薦一些志同道合的人,或向那些人推薦他

發(fā)送給用戶一個包含操作指南的系統(tǒng)通知

等等……

但是對于用戶來說,注冊功能實(shí)際只需要第一步,只要服務(wù)端將他的賬戶信息存到數(shù)據(jù)庫中他便可以登錄上去做他想做的事情了。至于其他的事情,非要在這一次請求中全部完成么?值得用戶浪費(fèi)時間等你處理這些對他來說無關(guān)緊要的事情么?所以實(shí)際當(dāng)?shù)谝徊阶鐾旰?,服?wù)端就可以把其他的操作放入對應(yīng)的消息隊(duì)列中然后馬上返回用戶結(jié)果,由消息隊(duì)列異步的進(jìn)行這些操作。

或者還有一種情況,同時有大量用戶注冊你的軟件,再高并發(fā)情況下注冊請求開始出現(xiàn)一些問題,例如郵件接口承受不住,或是分析信息時的大量計(jì)算使cpu滿載,這將會出現(xiàn)雖然用戶數(shù)據(jù)記錄很快的添加到數(shù)據(jù)庫中了,但是卻卡在發(fā)郵件或分析信息時的情況,導(dǎo)致請求的響應(yīng)時間大幅增長,甚至出現(xiàn)超時,這就有點(diǎn)不劃算了。面對這種情況一般也是將這些操作放入消息隊(duì)列(生產(chǎn)者消費(fèi)者模型),消息隊(duì)列慢慢的進(jìn)行處理,同時可以很快的完成注冊請求,不會影響用戶使用其他功能。

所以在軟件的正常功能開發(fā)中,并不需要去刻意的尋找消息隊(duì)列的使用場景,而是當(dāng)出現(xiàn)性能瓶頸時,去查看業(yè)務(wù)邏輯是否存在可以異步處理的耗時操作,如果存在的話便可以引入消息隊(duì)列來解決。否則盲目的使用消息隊(duì)列可能會增加維護(hù)和開發(fā)的成本卻無法得到可觀的性能提升,那就得不償失了。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論

庆云县| 冷水江市| 锦州市| 榆树市| 义马市| 仪征市| 尉氏县| 台安县| 大田县| 邵阳市| 云阳县| 铁力市| 池州市| 讷河市| 新郑市| 息烽县| 大新县| 海口市| 凤城市| 枝江市| 澄城县| 吉林省| 积石山| 平潭县| 青冈县| 绥宁县| 瓮安县| 仁寿县| 湖南省| 乐至县| 河东区| 兴安盟| 濮阳县| 凉城县| 罗田县| 双牌县| 辽宁省| 平邑县| 金平| 濮阳市| 鄂托克旗|