亚洲AV无码一区二区三区16_亚洲AV无码一区_公交车上~嗯啊被高潮了啊视频_女人扒开屁股桶爽30分钟_久久精品人人爽快人人爽爽

世界快播:設(shè)計(jì)模式之訂閱發(fā)布模式 - 行業(yè)資訊 -

當(dāng)前位置:首頁  >  行業(yè)資訊  > 正文

世界快播:設(shè)計(jì)模式之訂閱發(fā)布模式

世界快播:設(shè)計(jì)模式之訂閱發(fā)布模式
2023-05-27 06:45:17 來源:博客園
一、簡介

訂閱發(fā)布模式(Publish-Subscribe Pattern)是一種行之有效的解耦框架與業(yè)務(wù)邏輯的方式,也是一種常見的觀察者設(shè)計(jì)模式,它被廣泛應(yīng)用于事件驅(qū)動架構(gòu)中。

在這個模式中,發(fā)布者(或者說是主題)并不直接發(fā)送消息給訂閱者,而是通過調(diào)度中心(或者叫消息代理)來傳遞消息。 發(fā)布者(或者說是主題)并不知道訂閱者的存在,而訂閱者也不知道發(fā)布者的存在。他們彼此唯一的關(guān)系就是在調(diào)度中心注冊成為訂閱者或者發(fā)布者。


【資料圖】

當(dāng)一個發(fā)布者有新消息時(shí),就將這個消息發(fā)布到調(diào)度中心。調(diào)度中心就會將這個消息通知給所有訂閱者。這就實(shí)現(xiàn)了發(fā)布者和訂閱者之間的解耦,發(fā)布者和訂閱者不再直接依賴于彼此,他們可以獨(dú)立地?cái)U(kuò)展自己。

在具體的實(shí)現(xiàn)中,可以通過消息隊(duì)列、事件總線等機(jī)制來實(shí)現(xiàn)調(diào)度中心,不同語言和平臺都有實(shí)現(xiàn)的庫和框架,例如 Java 中的 ActiveMQ、RabbitMQ、Kafka等。

訂閱發(fā)布模式有以下優(yōu)點(diǎn):

性能好,發(fā)布者發(fā)送消息后直接返回不需要等待消費(fèi)者處理完畢。解耦性較強(qiáng),發(fā)布者和訂閱者之間不存在直接依賴,滿足高內(nèi)聚低耦合的設(shè)計(jì)思想??梢灾С忠粚Χ?、多對多的消息通信模型,提供了更加靈活的消息傳遞方式??梢詣討B(tài)地增加或刪除發(fā)布者和訂閱者,擴(kuò)展性較好。二、Java實(shí)現(xiàn)發(fā)布訂閱模式創(chuàng)建訂閱者接口,用于接受消息通知。
interface Subscriber {    void update(String message);}
創(chuàng)建發(fā)布者,用于發(fā)布消息。實(shí)現(xiàn)了增加、刪除和發(fā)布的功能,并且維護(hù)了一個訂閱列表,
class Publisher {    private Map> subscribers = new HashMap<>();    public void subscribe(String topic, Subscriber subscriber) {        List subscriberList = subscribers.get(topic);        if (subscriberList == null) {            subscriberList = new ArrayList<>();            subscribers.put(topic, subscriberList);        }        subscriberList.add(subscriber);    }    public void unsubscribe(String topic, Subscriber subscriber) {        List subscriberList = subscribers.get(topic);        if (subscriberList != null) {            subscriberList.remove(subscriber);        }    }    public void publish(String topic, String message) {        List subscriberList = subscribers.get(topic);        if (subscriberList != null) {            for (Subscriber subscriber : subscriberList) {                subscriber.update(message);            }        }    }}
我們還實(shí)現(xiàn)了兩個不同的 Subscriber 實(shí)現(xiàn),一個是 EmailSubscriber,另一個是 SMSSubscriber,用于接受發(fā)布者的消息并將其分別發(fā)送到郵箱和手機(jī)上。
class EmailSubscriber implements Subscriber {    private String email;    public EmailSubscriber(String email) {        this.email = email;    }    public void update(String message) {        System.out.println("Send email to " + email + ": " + message);    }}class SMSSubscriber implements Subscriber {    private String phoneNumber;    public SMSSubscriber(String phoneNumber) {        this.phoneNumber = phoneNumber;    }    public void update(String message) {        System.out.println("Send SMS to " + phoneNumber + ": " + message);    }}
在 Main 類中,我們創(chuàng)建了一個 Publisher 對象,并添加了兩個 EmailSubscriber 和兩個 SMSSubscriber,分別訂閱了 news 主題的更新。我們先給這個主題發(fā)送一條消息,然后取消 news 主題的其中一個訂閱者,最后我們再次給 news 主題發(fā)送一條消息。
public class Main {    public static void main(String[] args) {        Publisher publisher = new Publisher();        Subscriber emailSubscriber1 = new EmailSubscriber("foo@example.com");        Subscriber smsSubscriber1 = new SMSSubscriber("1234567890");        publisher.subscribe("news", emailSubscriber1);        publisher.subscribe("news", smsSubscriber1);        publisher.publish("news", "發(fā)布新消息1");        publisher.unsubscribe("news", smsSubscriber1);        publisher.publish("news", "發(fā)布新消息2");    }}

打印輸出如下:

Send email to foo@example.com: 發(fā)布新消息1Send SMS to 1234567890: 發(fā)布新消息1Send email to foo@example.com: 發(fā)布新消息2
三、Spring中自帶的訂閱發(fā)布模式

Spring的訂閱發(fā)布模式是通過發(fā)布事件、事件監(jiān)聽器和事件發(fā)布器3個部分來完成的

這里我們通過 newbee-mall-pro項(xiàng)目中已經(jīng)實(shí)現(xiàn)訂閱發(fā)布模式的下單流程給大家講解,項(xiàng)目地址:https://github.com/wayn111/newbee-mall-pro

自定義訂單發(fā)布事件,繼承 ApplicationEvent
public class OrderEvent extends ApplicationEvent {  void onApplicationEvent(Object event) {    ...  }}
定義訂單監(jiān)聽器,實(shí)現(xiàn) ApplicationListener
@Componentpublic class OrderListener implements ApplicationListener {    @Override    public void onApplicationEvent(OrderEvent event) {    // 生成訂單、刪除購物車、扣減庫存    ...    }}
下單流程,通過事件發(fā)布器 applicationEventPublisher 發(fā)布訂單事件,然后再訂單監(jiān)聽器中處理訂單保存邏輯。
@Resourceprivate ApplicationEventPublisher applicationEventPublisher;private void saveOrder(MallUserVO mallUserVO, Long couponUserId, List shopcatVOList, String orderNo) {    // 訂單檢查    ...    // 生成訂單號    String orderNo = NumberUtil.genOrderNo();    // 發(fā)布訂單事件,在事件監(jiān)聽中處理下單邏輯    applicationEventPublisher.publishEvent(new OrderEvent(orderNo, mallUserVO, couponUserId, shopcatVOList));    // 所有操作成功后,將訂單號返回    return orderNo;    ...}

通過事件監(jiān)聽機(jī)制,我們將下單邏輯拆分成如下步驟:

訂單檢查生成訂單號發(fā)布訂單事件,在事件監(jiān)聽中處理訂單保存邏輯所有操作成功后,將訂單號返回每個步驟都是各自獨(dú)立不互相影響

如上的代碼已經(jīng)實(shí)現(xiàn)了訂閱發(fā)布模式,成功解耦了下單邏輯。但是在性能上還沒有得到優(yōu)化,因?yàn)?Spring Boot 項(xiàng)目中,默認(rèn)情況下事件監(jiān)聽器是同步處理的,也就是說這里下單流程會等待事件監(jiān)聽器處理完畢才返回,最終影響接口響應(yīng)時(shí)長。

四、使用異步的事件監(jiān)聽發(fā)布類

Spring Boot 項(xiàng)目中事件監(jiān)聽發(fā)布類是由 SimpleApplicationEventMulticaster這個類實(shí)現(xiàn)的,源碼中通知訂閱者代碼如下:可以看到,代碼里是有判斷 getTaskExecutor()方法返回不為空的話,就交由 executor 執(zhí)行,負(fù)責(zé)同步執(zhí)行。這個時(shí)候大家就要問了,這里不是有線程池在異步通知訂閱者嗎?

不急,博主帶大家繼續(xù)查看源碼??梢钥吹?getTaskExecutor()方法返回一個成員屬性,這個成員屬性在 SimpleApplicationEventMulticaster類中是通過 setTaskExecutor(@Nullable Executor taskExecutor)方法設(shè)置的。我們通過 ctrl + f7查一下 setTaskExecutor(...)方法在哪里被調(diào)用過,Ok,到此水落石出,SimpleApplicationEventMulticaster類的 taskExecutor 成員屬性一直為 null,所以在通過訂閱者的時(shí)候一直是同步處理,等待訂閱者處理完畢。

對于異步處理,我們可以從2個方面入手:

事件監(jiān)聽器入手,將事件監(jiān)聽器的事件觸發(fā)方法改為異步執(zhí)行,例如將生成訂單、刪除購物車、扣減庫存邏輯放入線程池異步執(zhí)行,或者是在訂閱者的通知方法 onApplicationEvent上加上@Async注解,表示該方法異步執(zhí)行。事件監(jiān)聽發(fā)布類入手,設(shè)置默認(rèn)事件監(jiān)聽發(fā)布類的taskExecutor屬性,通過源碼可知,也可以解決。

這里博主給大家介紹下怎么修改事件監(jiān)聽發(fā)布類來解決。

/** * 系統(tǒng)啟動時(shí)執(zhí)行 */@Componentpublic class SpringBeanStartupRunner implements ApplicationRunner {    @Override    public void run(ApplicationArguments args) throws Exception {        // 設(shè)置spring默認(rèn)的事件監(jiān)聽為異步執(zhí)行        SimpleApplicationEventMulticaster multicaster = SpringContextUtil.getBean(SimpleApplicationEventMulticaster.class);        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(                5,                10,                60L, TimeUnit.MILLISECONDS,                new LinkedBlockingQueue<>(500),                new CustomizableThreadFactory("newbee—event-task"),                new ThreadPoolExecutor.CallerRunsPolicy()        );        multicaster.setTaskExecutor(threadPoolExecutor);    }}

在系統(tǒng)啟動時(shí)反射修改SimpleApplicationEventMulticaster類的taskExecutor屬性,從而讓SimpleApplicationEventMulticaster類支持異步事件通知。

總結(jié)

建議大家在日常開發(fā)中多加思考哪些業(yè)務(wù)流程可以適用,例如微服務(wù)項(xiàng)目中訂單支付成功后需要通知用戶、商品、活動等多個服務(wù)時(shí),可以考慮使用訂閱發(fā)布模式。解耦發(fā)布者和訂閱者,發(fā)布者只管發(fā)布消息,不需要知道有哪些訂閱者,也不需要知道訂閱者的具體實(shí)現(xiàn)。訂閱者只需要關(guān)注自己感興趣的消息即可。這種松耦合的設(shè)計(jì)使得系統(tǒng)更容易擴(kuò)展和維護(hù)。

關(guān)注公眾號【waynblog】每周分享技術(shù)干貨、開源項(xiàng)目、實(shí)戰(zhàn)經(jīng)驗(yàn)、高效開發(fā)工具等,您的關(guān)注將是我的更新動力!

標(biāo)簽:

(責(zé)任編輯:news01)
今日上海火車站訂票熱線(求上?;疖囌居喥彪娫?,流程…麻煩詳細(xì)點(diǎn))

今日上海火車站訂票熱線(求上?;疖囌居喥彪娫挘鞒獭闊┰敿?xì)點(diǎn))

您好,來為大家解答以上問題。上?;疖囌居喥睙峋€,求上海火車站訂票電
08-29 05:49:17
曼城舊將:哈蘭德從不糾結(jié)于進(jìn)球,他總能保持正確的心態(tài)和行動

曼城舊將:哈蘭德從不糾結(jié)于進(jìn)球,他總能保持正確的心態(tài)和行動

曼城舊將:哈蘭德從不糾結(jié)于進(jìn)球,他總能保持正確的心態(tài)和行動,泰勒,福
08-29 01:02:16
一個囤茶的故事,寫滿了羅生門,各種斗智斗勇,各種小心思小盤算

一個囤茶的故事,寫滿了羅生門,各種斗智斗勇,各種小心思小盤算

買過一次,喝了感覺不錯,價(jià)格也在自己認(rèn)可的范圍之內(nèi),那么,再次復(fù)購
08-28 22:05:57
成都:144平米以上房源不再實(shí)施公證搖號

成都:144平米以上房源不再實(shí)施公證搖號

成都市住房和城鄉(xiāng)建設(shè)局成都市司法局發(fā)布關(guān)于優(yōu)化完善商品住房公證搖號
08-28 20:20:02
中國央行:截至2023年7月末,境外機(jī)構(gòu)在中國債券市場的托管余額為3.3萬億元

中國央行:截至2023年7月末,境外機(jī)構(gòu)在中國債券市場的托管余額為3.3萬億元

中國央行:截至2023年7月末,境外機(jī)構(gòu)在中國債券市場的托管余額為3 3萬
08-28 18:45:13
直到大雨停止(三)

直到大雨停止(三)

“live的話……我看看哦,最近排的比較滿,大場排到七天之后去了,只有
08-28 17:17:51
日媒稱國內(nèi)商家多次接到來自中國的騷擾電話,內(nèi)容具有攻擊性

日媒稱國內(nèi)商家多次接到來自中國的騷擾電話,內(nèi)容具有攻擊性

據(jù)日本媒體共同社報(bào)道,8月24日,日本啟動福島核污染水排海后,國內(nèi)商
08-28 16:12:59
湖北竹溪一女子用關(guān)愛點(diǎn)亮留守兒童心靈的“燈”

湖北竹溪一女子用關(guān)愛點(diǎn)亮留守兒童心靈的“燈”

中新網(wǎng)湖北新聞8月25日電(付延峰黃東張娜)近日,家住竹溪縣城的夏正莉
08-28 14:48:20
鐵路餐車圖鑒!在火車,感受舌尖上的時(shí)代變遷

鐵路餐車圖鑒!在火車,感受舌尖上的時(shí)代變遷

暑運(yùn)期間,全國鐵路再次迎來客流高峰。如果說到“坐火車吃什么”,您首
08-28 13:03:00
戰(zhàn)鷹列陣 鐵翼飛旋,航空救援隊(duì)飛行員訓(xùn)練在昆明硬核開飛

戰(zhàn)鷹列陣 鐵翼飛旋,航空救援隊(duì)飛行員訓(xùn)練在昆明硬核開飛

央視網(wǎng)消息:近日,隨著飛行指揮員一聲令下,4架橘紅色直升機(jī)依次呼嘯
08-28 11:52:16
MSCI亞太指數(shù)上漲1.4%。

MSCI亞太指數(shù)上漲1.4%。

MSCI亞太指數(shù)上漲1 4%
08-28 09:53:50
本周4只新股申購,周一多浦樂上市

本周4只新股申購,周一多浦樂上市

本周新股發(fā)行情況速覽本周(8月28日-9月1日)A股市場4只新股發(fā)行,其中
08-28 08:03:29
勇者的宿命與救贖

勇者的宿命與救贖

新番導(dǎo)視的時(shí)候就有聽說這番,但一直沒看。閑來無事時(shí)突然想起來,就在
08-28 05:47:18
清熱解毒的水果(吃什么水果去火 清熱解毒的水果)

清熱解毒的水果(吃什么水果去火 清熱解毒的水果)

文章目錄1、吃什么水果可以清熱解毒有益消腫這些水果數(shù)它最厲害!2、吃
08-27 22:08:25
湖北省黃岡市2023-08-27 19:07發(fā)布暴雨橙色預(yù)警

湖北省黃岡市2023-08-27 19:07發(fā)布暴雨橙色預(yù)警

一、湖北省黃岡市天氣預(yù)報(bào)1、黃岡市氣象臺2023年08月27日19時(shí)07分發(fā)布
08-27 19:57:49
網(wǎng)紅舉報(bào)老丈人貪污

網(wǎng)紅舉報(bào)老丈人貪污

8月26日,河南焦作揚(yáng)言拋妻棄子男網(wǎng)紅否認(rèn)家暴,“我自己才是受害者”
08-27 17:43:08
前7個月原材料工業(yè)增加值同比增長5.2% 整體呈現(xiàn)結(jié)構(gòu)向優(yōu)發(fā)展態(tài)勢

前7個月原材料工業(yè)增加值同比增長5.2% 整體呈現(xiàn)結(jié)構(gòu)向優(yōu)發(fā)展態(tài)勢

央視網(wǎng)消息:記者從工業(yè)和信息化部了解到,今年1—7月,原材料工業(yè)整體呈
08-27 16:00:38
米店這首歌什么含義

米店這首歌什么含義

米店這首歌的含義多層次而豐富。這首歌以米店為主題,將一家米店作為一
08-27 13:51:10
每條10元至60元?賣明星行程牟利,高鐵站員工獲刑

每條10元至60元?賣明星行程牟利,高鐵站員工獲刑

據(jù)介紹,陳某等人將高鐵乘車時(shí)間、車次、乘車站、到站、座位、證件號碼
08-27 12:15:50
俄國防部:一晝夜擊落37架 基本情況講解

俄國防部:一晝夜擊落37架 基本情況講解

大家好,今日關(guān)于【俄國防部:一晝夜擊落37架】迅速上了的熱搜榜,受到
08-27 10:36:25
全球大米價(jià)格飆升!世界最大大米出口國又出手了

全球大米價(jià)格飆升!世界最大大米出口國又出手了

據(jù)央視財(cái)經(jīng)8月26日報(bào)道,近期國際大米價(jià)格飆升,引發(fā)全球關(guān)注。印度政
08-27 08:44:51
東北生菜種植時(shí)間和方法(生菜種植時(shí)間和方法)

東北生菜種植時(shí)間和方法(生菜種植時(shí)間和方法)

導(dǎo)讀1、【特征特性】  生菜按葉片的色澤區(qū)分有綠生菜、紫生菜兩種。2
08-27 05:56:46
肇俊哲發(fā)文道歉:三連敗責(zé)任在我,今晚有點(diǎn)沖動沒有辱罵裁判

肇俊哲發(fā)文道歉:三連敗責(zé)任在我,今晚有點(diǎn)沖動沒有辱罵裁判

直播吧8月26日訊中超聯(lián)賽第24輪,滄州雄獅主場1-5慘敗北京國安。比賽中
08-26 23:19:44
農(nóng)業(yè)農(nóng)村部部署華西黃淮等地持續(xù)強(qiáng)降雨防范應(yīng)對工作

農(nóng)業(yè)農(nóng)村部部署華西黃淮等地持續(xù)強(qiáng)降雨防范應(yīng)對工作

據(jù)中央氣象臺預(yù)報(bào),8月26—28日,我國華西至黃淮一帶自西向東將出現(xiàn)強(qiáng)
08-26 20:40:57
苦苦支撐!霍利斯-杰弗森5中4砍半場最高15分加5板 球隊(duì)落后13分

苦苦支撐!霍利斯-杰弗森5中4砍半場最高15分加5板 球隊(duì)落后13分

苦苦支撐!霍利斯-杰弗森5中4砍半場最高15分加5板球隊(duì)落后13分,男籃,約
08-26 18:08:04
東盟三國簽署本幣交易協(xié)議,減少對美元依賴

東盟三國簽署本幣交易協(xié)議,減少對美元依賴

當(dāng)?shù)貢r(shí)間8月25日,第十屆東盟財(cái)長和央行行長會議在印尼首都雅加達(dá)舉辦
08-26 15:51:41
常山北明7月3日快速上漲

常山北明7月3日快速上漲

以下是常山北明在北京時(shí)間7月3日11:07分盤口異動快照:7月3日,常山北
08-26 14:12:25
額竇炎癥狀表現(xiàn)有哪些(額頭炎是什么癥狀)

額竇炎癥狀表現(xiàn)有哪些(額頭炎是什么癥狀)

我是小前,我來為大家解答以上問題。額竇炎癥狀表現(xiàn)有哪些,額頭炎是什
08-26 12:01:21
快訊 | 贏家時(shí)尚2023年上半年總收入同比增長15.36%至33.41億元,純利同比增長71.57%

快訊 | 贏家時(shí)尚2023年上半年總收入同比增長15.36%至33.41億元,純利同比增長71.57%

財(cái)經(jīng)網(wǎng)生活訊8月25日晚,贏家時(shí)尚發(fā)布2023年半年度報(bào)告,披露公司總收
08-26 10:07:53
奧運(yùn)冠軍成母校講師!剛剛曬過畢業(yè)照……

奧運(yùn)冠軍成母校講師!剛剛曬過畢業(yè)照……

8月25日,北京大學(xué)官網(wǎng)顯示,乒乓球奧運(yùn)冠軍丁寧已擔(dān)任北京大學(xué)體育教
08-26 09:34:54

為您推薦

精彩推送