RabbitMQ面包店营业笔记——第三天

经过昨天的营业

我们总结一下,现在营业的问题

首先,从始至终,我们的面包店只有一个顾客

这不行嘛,这不仅赚不到钱,还得亏钱

所以,我们要打广告,让更多的顾客进入~

但是顾客多了,就回到了我们昨天的那个问题了:

如果来了多个顾客,正好第一个顾客还是个土豪,一口气说要二百个,但是第二个也在等,是不是我先要保证第一个不走,第二个也不走呢?还得考虑到第一个顾客应该要拿多点(不然他应该会不爽,毕竟人家先来嘛)

机智的我怎么会被这种问题难倒呢?

首先我们来看,RabbitMQ中的Work模式:

即一个生产者,多个消费者

image-20200325114211987.png

需要注意的是:

(1)我就算有很多面包,但是我一个面包也只能给到一个消费者嘛,即:生产者的消息是发送到一个队列里,所以即使有两个消费者,一个消息只能被一个消费者消费。

(2)Work模式中可以分为两种模式:

公平队列:两个消费者平均消费队列中的消息,即使它们的消费能力是不一样的;

能者多劳:消费能力强的消费者会获取更多的消息。

那我们先看看啥是公平队列

@RestController
public class Producer {
@Autowired
RabbitTemplate template;

@GetMapping("/makeLover")
public String makeLover(){
for (int i = 0; i < 50; i++) {
String msg = "send msg = " + i;
try {
//每发一条消息睡一会会
Thread.sleep(i * 10);
} catch (InterruptedException e) {
e.printStackTrace();
}
template.convertAndSend(AppConfig.EXCHANGE_NAME,AppConfig.ROUTING_KEY,msg);
}
return "OK";
}
}
@Component
public class Consumer {
// tag代表投递的标识符,唯一标识了当前信道上的投递,通过 deliveryTag ,消费者就可以告诉 RabbitMQ 确认收到了当前消息
@RabbitListener(queues = AppConfig.QUEUE_NAME)
public void getLover(String msg, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) Long tag) {
try {
//这里代表顾客收到了一个面包,false等于是他要一个个对比是不是自己要的,ture的话他就直接全部打包了
Thread.sleep(10);
channel.basicAck(tag, false);
System.out.println(msg + "顾客1确认");
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}

@RabbitListener(queues = AppConfig.QUEUE_NAME)
public void getLover2(String msg, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) Long tag) {
try {
//这里代表顾客收到了一个面包,false等于是他要一个个对比是不是自己要的,ture的话他就直接全部打包了
Thread.sleep(1000);
channel.basicAck(tag, false);
System.out.println(msg + "顾客2确认");
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
}
​</pre>

然后我们看看结果:

send msg = 0顾客1确认
send msg = 2顾客1确认
send msg = 4顾客1确认
send msg = 6顾客1确认
send msg = 8顾客1确认
send msg = 10顾客1确认
send msg = 12顾客1确认
send msg = 1顾客2确认
send msg = 14顾客1确认
send msg = 16顾客1确认
send msg = 18顾客1确认
send msg = 3顾客2确认
send msg = 20顾客1确认
send msg = 22顾客1确认
send msg = 5顾客2确认
send msg = 24顾客1确认
send msg = 26顾客1确认
send msg = 7顾客2确认
send msg = 28顾客1确认
send msg = 30顾客1确认
send msg = 9顾客2确认
send msg = 32顾客1确认
send msg = 34顾客1确认
send msg = 11顾客2确认
send msg = 36顾客1确认
send msg = 13顾客2确认
send msg = 38顾客1确认
send msg = 15顾客2确认
send msg = 40顾客1确认
send msg = 17顾客2确认
send msg = 42顾客1确认
send msg = 44顾客1确认
send msg = 19顾客2确认
send msg = 46顾客1确认
send msg = 21顾客2确认
send msg = 48顾客1确认
send msg = 23顾客2确认
send msg = 25顾客2确认
send msg = 27顾客2确认
send msg = 29顾客2确认
send msg = 31顾客2确认
send msg = 33顾客2确认
send msg = 35顾客2确认
send msg = 37顾客2确认
send msg = 39顾客2确认
send msg = 41顾客2确认
send msg = 43顾客2确认
send msg = 45顾客2确认
send msg = 47顾客2确认
send msg = 49顾客2确认</pre>

可以看到,顾客1永远拿了个奇数,顾客2永远拿了个偶数

拿明显不对嘛,顾客一明显钱更多

我这么好的人,怎么可能不会劫富济贫呢?

所以,我们的第二个模式就上线了!

能(jie)者(fu)多(ji)劳(pin)模式:

// tag代表投递的标识符,唯一标识了当前信道上的投递,通过 deliveryTag ,消费者就可以告诉 RabbitMQ 确认收到了当前消息
@RabbitListener(queues = AppConfig.QUEUE_NAME)
public void getLover(String msg, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) Long tag) throws IOException {
//这里三个参数代表:
//prefetchSize: 单条消息的大小限制,消费端通常设置为0,表示不做限制
//prefetchCount: 一次最多能处理多少条消息,通常设置为1
//global: 是否将上面设置应用于channel,false代表consumer级别
//也就是说 我们保证每次这个顾客都只拿到一个
channel.basicQos(0,1,true);
try {

System.out.println(msg + "顾客1确认");
//这里代表顾客收到了一个面包,false等于是他要一个个对比是不是自己要的,ture的话他就直接全部打包了
channel.basicAck(tag, false);

Thread.sleep(10);
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}</pre>

那么第一个顾客设置完了,我们把第二个也设置一样的

然后我们看看结果:

send msg = 0顾客1确认
send msg = 2顾客1确认
send msg = 4顾客1确认
send msg = 5顾客1确认
send msg = 6顾客1确认
send msg = 7顾客1确认
send msg = 8顾客1确认
send msg = 9顾客1确认
send msg = 10顾客1确认
send msg = 11顾客1确认
send msg = 12顾客1确认
send msg = 13顾客1确认
send msg = 14顾客1确认
send msg = 16顾客1确认
send msg = 17顾客1确认
send msg = 18顾客1确认
send msg = 19顾客1确认
send msg = 20顾客1确认
send msg = 22顾客1确认
send msg = 23顾客1确认
send msg = 24顾客1确认
send msg = 26顾客1确认
send msg = 27顾客1确认
send msg = 28顾客1确认
send msg = 30顾客1确认
send msg = 31顾客1确认
send msg = 32顾客1确认
send msg = 34顾客1确认
send msg = 36顾客1确认
send msg = 38顾客1确认
send msg = 39顾客1确认
send msg = 40顾客1确认
send msg = 42顾客1确认
send msg = 44顾客1确认
send msg = 46顾客1确认
send msg = 48顾客1确认


send msg = 29顾客2确认
send msg = 25顾客2确认
send msg = 15顾客2确认
send msg = 21顾客2确认
send msg = 1顾客2确认
send msg = 3顾客2确认
send msg = 33顾客2确认
send msg = 35顾客2确认
send msg = 41顾客2确认
send msg = 37顾客2确认
send msg = 47顾客2确认
send msg = 49顾客2确认
send msg = 45顾客2确认
send msg = 43顾客2确认</pre>

可以看到我确实能(jie)者(fu)多(ji)劳(pin)了

同样这个能(jie)者(fu)多(ji)劳(pin)可以做到限流的问题。

因为RabbitMQ的特性嘛,那如果我面包房现在有2w存货(没过期啊喂,我可不是黑心商家)

现在来了一个顾客,那这个特性就是一股脑全给他

那如果本身他只要拿一个,然后去挑挑选选,干他自己的事情

你全丢给他了

你猜他会不会疯了?

所以我们每次只接受一个,等他把自己的事情干完了,再来拿第二个

这样我们能保证他不崩溃,也能起到一个限流的作用。

要不今天就先关门吧?

我要去投诉一下快递~

明天再来解决一下面包的保质期(消息生存时间)以及我们的垃圾桶(死信队列)问题

那今天就拜拜咯~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,295评论 6 512
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,928评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,682评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,209评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,237评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,965评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,586评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,487评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,016评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,136评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,271评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,948评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,619评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,139评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,252评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,598评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,267评论 2 358

推荐阅读更多精彩内容