Java消息隊(duì)列的簡(jiǎn)單實(shí)現(xiàn)代碼
今天看到我們的招聘信息有對(duì)消息隊(duì)列有要求,然后就思索了一翻,網(wǎng)上一搜一大堆。
我可以舉個(gè)小例子先說明應(yīng)用場(chǎng)景
假設(shè)你的服務(wù)器每分鐘的處理量為200個(gè),但客戶端再峰值的時(shí)候可能一分鐘會(huì)發(fā)1000個(gè)消息給你,這時(shí)候你就可以把他做成隊(duì)列,然后按正常有序的處理,先進(jìn)后出(LIFO),先進(jìn)先出(FIFO)可根據(jù)自己的情況進(jìn)行定奪
stack 先進(jìn)后出(LIFO)--------Java 對(duì)應(yīng)的類 Stack
隊(duì)列 先進(jìn)先出(FIFO)--------java對(duì)應(yīng)的類Queue
這兩種都可用Linkedlist進(jìn)行封裝和實(shí)現(xiàn),下面是我自己寫的一個(gè)棧的例子
/** * @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(); } }
下面是一個(gè)測(cè)試類
/** * @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 : "寫了個(gè)一句話倒起來說的程序".toCharArray()){//用例:正話反說 stack.push(String.valueOf(s)); } while(!stack.empty()){ System.out.print(stack.peek()); stack.pop(); } } }
挺有意思的,讓我想了,以前在學(xué)校的晚會(huì)上,主持人互動(dòng)的時(shí)候會(huì)讓人上臺(tái)去答題拿獎(jiǎng)品,其中有一個(gè)題目就是主持人說一句話,然后要求選手倒起來說,我們的這個(gè)程序很符合需求嘛,哈哈,我們可以用java來作弊,學(xué)以致用
消息隊(duì)列的應(yīng)用場(chǎng)景,補(bǔ)充(來自互聯(lián)網(wǎng))
個(gè)人認(rèn)為消息隊(duì)列的主要特點(diǎn)是異步處理,主要目的是減少請(qǐng)求響應(yīng)時(shí)間和解耦。所以主要的使用場(chǎng)景就是將比較耗時(shí)而且不需要即時(shí)(同步)返回結(jié)果的操作作為消息放入消息隊(duì)列。同時(shí)由于使用了消息隊(duì)列,只要保證消息格式不變,消息的發(fā)送方和接收方并不需要彼此聯(lián)系,也不需要受對(duì)方的影響,即解耦和。
使用場(chǎng)景的話,舉個(gè)例子:
假設(shè)用戶在你的軟件中注冊(cè),服務(wù)端收到用戶的注冊(cè)請(qǐng)求后,它會(huì)做這些操作:
校驗(yàn)用戶名等信息,如果沒問題會(huì)在數(shù)據(jù)庫中添加一個(gè)用戶記錄
如果是用郵箱注冊(cè)會(huì)給你發(fā)送一封注冊(cè)成功的郵件,手機(jī)注冊(cè)則會(huì)發(fā)送一條短信
分析用戶的個(gè)人信息,以便將來向他推薦一些志同道合的人,或向那些人推薦他
發(fā)送給用戶一個(gè)包含操作指南的系統(tǒng)通知
等等……
但是對(duì)于用戶來說,注冊(cè)功能實(shí)際只需要第一步,只要服務(wù)端將他的賬戶信息存到數(shù)據(jù)庫中他便可以登錄上去做他想做的事情了。至于其他的事情,非要在這一次請(qǐng)求中全部完成么?值得用戶浪費(fèi)時(shí)間等你處理這些對(duì)他來說無關(guān)緊要的事情么?所以實(shí)際當(dāng)?shù)谝徊阶鐾旰?,服?wù)端就可以把其他的操作放入對(duì)應(yīng)的消息隊(duì)列中然后馬上返回用戶結(jié)果,由消息隊(duì)列異步的進(jìn)行這些操作。
或者還有一種情況,同時(shí)有大量用戶注冊(cè)你的軟件,再高并發(fā)情況下注冊(cè)請(qǐng)求開始出現(xiàn)一些問題,例如郵件接口承受不住,或是分析信息時(shí)的大量計(jì)算使cpu滿載,這將會(huì)出現(xiàn)雖然用戶數(shù)據(jù)記錄很快的添加到數(shù)據(jù)庫中了,但是卻卡在發(fā)郵件或分析信息時(shí)的情況,導(dǎo)致請(qǐng)求的響應(yīng)時(shí)間大幅增長(zhǎng),甚至出現(xiàn)超時(shí),這就有點(diǎn)不劃算了。面對(duì)這種情況一般也是將這些操作放入消息隊(duì)列(生產(chǎn)者消費(fèi)者模型),消息隊(duì)列慢慢的進(jìn)行處理,同時(shí)可以很快的完成注冊(cè)請(qǐng)求,不會(huì)影響用戶使用其他功能。
所以在軟件的正常功能開發(fā)中,并不需要去刻意的尋找消息隊(duì)列的使用場(chǎng)景,而是當(dāng)出現(xiàn)性能瓶頸時(shí),去查看業(yè)務(wù)邏輯是否存在可以異步處理的耗時(shí)操作,如果存在的話便可以引入消息隊(duì)列來解決。否則盲目的使用消息隊(duì)列可能會(huì)增加維護(hù)和開發(fā)的成本卻無法得到可觀的性能提升,那就得不償失了。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
mybatis-spring:@MapperScan注解的使用
這篇文章主要介紹了mybatis-spring:@MapperScan注解的使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09一文帶你搞懂java如何實(shí)現(xiàn)網(wǎng)絡(luò)NIO高并發(fā)編程
NIO是?Java?在?JDK?1.4?中引入的一套新的?I/O?API,旨在解決傳統(tǒng)?I/O高并發(fā)場(chǎng)景下的性能和擴(kuò)展性不足的問題,下面就跟隨小編一起深入了解下NIO高并發(fā)編程吧2024-12-12Tomcat報(bào)錯(cuò):HTTP Status 500 (Wrapper cannot find servlet class)
這篇文章主要介紹了Tomcat報(bào)錯(cuò):HTTP Status 500 (Wrapper cannot find servlet class)解決辦法的相關(guān)資料,需要的朋友可以參考下2016-11-11實(shí)例講解String Date Calendar之間的轉(zhuǎn)換
下面小編就為大家?guī)硪黄獙?shí)例講解String Date Calendar之間的轉(zhuǎn)換。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-07-07基于Java實(shí)現(xiàn)簡(jiǎn)單的時(shí)序數(shù)據(jù)壓縮算法
這篇文章主要為大家詳細(xì)介紹了如何利用Java語言實(shí)現(xiàn)簡(jiǎn)單易懂的時(shí)序數(shù)據(jù)壓縮算法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-06-06springboot+vue項(xiàng)目從第一行代碼到上線部署全流程
本文詳細(xì)介紹了如何從零開始搭建一個(gè)基于Spring Boot和Vue.js的前后端分離項(xiàng)目,并涵蓋項(xiàng)目需求分析、技術(shù)選型、項(xiàng)目結(jié)構(gòu)設(shè)計(jì)、前后端交互、部署上線等全過程,感興趣的朋友跟隨小編一起看看吧2024-11-11SpringBoot淺析緩存機(jī)制之Ehcache?2.x應(yīng)用
EhCache?是一個(gè)純Java的進(jìn)程內(nèi)緩存框架,具有快速、精干等特點(diǎn)。它是Hibernate中的默認(rèn)緩存框架。Ehcache已經(jīng)發(fā)布了3.1版本。但是本文的講解基于2.x版本2022-08-08java循環(huán)結(jié)構(gòu)、數(shù)組的使用小結(jié)
這篇文章主要介紹了java循環(huán)結(jié)構(gòu)、數(shù)組的使用小結(jié),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-09-09