成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

RabbitMQ之通信模型之Work模型

網(wǎng)絡(luò) 通信技術(shù)
本文到這里就結(jié)束了,主要介紹了RabbitMQ通信模型中的work模型,適用于限流、削峰等應(yīng)用場景。

大家好,我是指北君。

今天指北君帶領(lǐng)大家接著學(xué)習(xí)RabbitMQ,了解RabbitMQ的五大通信模型之一的Work模型;接下來還會有關(guān)于RabbitMQ的系列教程,對你有幫助的話記得關(guān)注哦~

回顧

上一篇文章中,簡單的介紹了一下RabbitMQ,以及安裝和hello world。

有的小伙伴留言說看不懂其中的方法參數(shù),這里先解釋一下幾個基本的方法參數(shù)。

// 聲明隊列方法
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
/**
* param1:queue 隊列的名字
* param2:durable 是否持久化;比如現(xiàn)在發(fā)送到隊列里面的消息,如果沒有持久化,重啟這個隊列后數(shù) 據(jù)會丟失(false) true:重啟之后數(shù)據(jù)依然在
* param3:exclusive 是否排外(是否是當前連接的專屬隊列),排外的意思是:
* 1:連接關(guān)閉之后 這個隊列是否自動刪除(false:不自動刪除)
* 2:是否允許其他通道來進行訪問這個數(shù)據(jù)(false:不允許)
* param4:autoDelete 是否自動刪除
* 就是當最后一個連接斷開的時候,是否自動刪除這個隊列(false:不刪除)
* param5:arguments(map) 聲明隊列的時候,附帶的一些參數(shù)
*/
// 發(fā)送數(shù)據(jù)到隊列
channel.basicPublish("", QUEUE_NAME, MessageProperties.PERSISTENT_TEXT_PLAIN, "第一個隊列消息...".getBytes());
/**
* param1:exchange 交換機 沒有就設(shè)置為 "" 值就可以了
* param2:routingKey 路由的key 現(xiàn)在沒有設(shè)置key,直接使用隊列的名字
* param3:BasicProperties 發(fā)送數(shù)據(jù)到隊列的時候,是否要帶一些參數(shù)。
* MessageProperties.PERSISTENT_TEXT_PLAIN表示沒有帶任何參數(shù)
* param4:body 向隊列中發(fā)送的消息數(shù)據(jù)
*/

Work模型

work模型稱為工作隊列或者競爭消費者模式,多個消費者消費的數(shù)據(jù)之和才是原來隊列中的所有數(shù)據(jù),適用于流量的削峰。

圖片

演示

寫個簡單的測試:

生產(chǎn)者

public class Producer {
private static final String QUEUE_NAME = "queue_work_1";

public static void main(String[] args) throws IOException, TimeoutException {
Connection connection = ConnectionUtils.getConnection();
Channel channel = connection.createChannel();
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
for (int i = 0; i < 100; i++) {
channel.basicPublish("", QUEUE_NAME, null, ("work模型:" + i).getBytes());
}
channel.close();
connection.close();
}

}

消費者

// 消費者1
public class Consumer {
private static final String QUEUE_NAME = "queue_work_1";

public static void main(String[] args) throws IOException, TimeoutException {
Connection connection = ConnectionUtils.getConnection();
Channel channel = connection.createChannel();
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
// channel.basicQos(0, 1, false);
DefaultConsumer defaultConsumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
System.out.println(System.currentTimeMillis() + "消費者1接收到信息:" + new String(body));
channel.basicAck(envelope.getDeliveryTag(), false);
}
};
channel.basicConsume(QUEUE_NAME, false, defaultConsumer);
}

}
// 消費者2
public class Consumer2 {
private static final String QUEUE_NAME = "queue_work_1";

public static void main(String[] args) throws IOException, TimeoutException {
Connection connection = ConnectionUtils.getConnection();
Channel channel = connection.createChannel();
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
// channel.basicQos(0, 1, false);
DefaultConsumer defaultConsumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
System.out.println(System.currentTimeMillis() + "消費者2接收到信息:" + new String(body));
channel.basicAck(envelope.getDeliveryTag(), false);
// 這里加了個延遲,表示處理業(yè)務(wù)時間
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
channel.basicConsume(QUEUE_NAME, false, defaultConsumer);
}
}

結(jié)果

圖片


圖片

可以看出來:100條消息,消費者之間是平分的,消費者1 幾乎是瞬間完成,消費者2 則是慢慢吞吞的運行完畢,消費者1大量時間處于空閑狀態(tài),消費者2則一直忙碌。這顯然是不適用于實際開發(fā)中。

我們需要遵從一個原則,就是 能者多勞 ,消費越快的人,消費的越多;

現(xiàn)在我們把消費者1和2的代碼中 // channel.basicQos(0, 1, false); 這行代碼取消注釋,再次運行;

圖片

圖片

現(xiàn)在的結(jié)果就比較符合能者多勞,雖然你干的多,但是工資是一樣的呀~

work模型的一個主要的方法是basicQos();這里也解釋一下其參數(shù):

// 設(shè)置限流機制
channel.basicQos(0, 1, false);
/**
* param1: prefetchSize,消息本身的大小 如果設(shè)置為0 那么表示對消息本身的大小不限制
* param2: prefetchCount,告訴rabbitmq不要一次性給消費者推送大于N個消息
* param3:global,是否將上面的設(shè)置應(yīng)用于整個通道,false表示只應(yīng)用于當前消費者
*/

小結(jié)

本文到這里就結(jié)束了,主要介紹了RabbitMQ通信模型中的work模型,適用于限流、削峰等應(yīng)用場景。

責任編輯:武曉燕 來源: Java技術(shù)指北
相關(guān)推薦

2023-01-11 08:22:22

RabbitMQ通信模型

2023-03-01 08:23:11

通信模型RabbitMQ

2023-03-03 08:18:41

2012-12-17 09:45:05

統(tǒng)一通信混合通信通信網(wǎng)絡(luò)

2023-11-19 23:36:50

2017-03-27 08:56:15

支付風(fēng)控模型

2017-09-14 14:43:07

NLP入門模型

2024-05-06 07:58:23

MoE模型系統(tǒng)

2021-11-11 08:34:54

應(yīng)用配置模板

2024-05-16 08:23:26

大語言模型知識圖譜人工智能

2024-11-04 00:24:56

2024-11-26 09:33:44

2024-12-26 00:46:25

機器學(xué)習(xí)LoRA訓(xùn)練

2023-08-28 07:28:41

項目領(lǐng)域?qū)?/a>充血模型

2022-03-18 00:12:20

SA系統(tǒng)態(tài)勢感知

2022-09-06 08:00:00

機器學(xué)習(xí)金融數(shù)據(jù)科學(xué)

2021-07-09 13:54:31

零信任網(wǎng)絡(luò)安全網(wǎng)絡(luò)攻擊

2025-02-17 08:00:00

DeepSeek模型AI

2011-08-11 17:15:54

iPhone歸檔

2025-02-13 11:00:30

點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 国产精品久久久久一区二区三区 | 久久久久久国产精品久久 | 国产三级 | 国产精品成人一区二区三区 | 午夜激情免费视频 | 爱爱爱av | 亚洲国产成人av好男人在线观看 | 国产精品久久久久久久久久三级 | 日本特黄a级高清免费大片 特黄色一级毛片 | 曰韩一二三区 | 国产一区二区视频免费在线观看 | 中文字幕 国产精品 | 欧美综合一区 | 亚洲精品视频一区二区三区 | 欧美激情在线精品一区二区三区 | 欧美一级特黄aaa大片在线观看 | 午夜免费精品视频 | 亚洲综合婷婷 | 亚洲精品一区二区三区四区高清 | 国产成人高清在线观看 | 91性高湖久久久久久久久_久久99 | 亚洲网站在线 | 亚洲一区精品在线 | 成人午夜免费在线视频 | 狠狠爱综合 | 999精品网 | 欧美成人一区二区三区 | www.亚洲国产精品 | 亚洲综合二区 | 欧美一级毛片久久99精品蜜桃 | 婷婷色国产偷v国产偷v小说 | 亚洲成人免费在线观看 | 日韩电影一区二区三区 | 国产精品中文字幕在线观看 | 亚洲成人免费av | 日韩在线不卡 | 一区二区片 | 在线视频日韩 | 欧美一级片在线观看 | 久久久久国产一区二区三区 | 亚洲欧美日韩精品久久亚洲区 |