ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

RabbitMQ系列笔记work模式

2021-12-21 16:02:36  阅读:109  来源: 互联网

标签:消费者 处理 work 笔记 RabbitMQ str 我们 消息


Work模式

生产者

具体讲修改代码之前,我们先想象一个场景,在真正的程序中,我们的生产者可能会产生很多消息,并且每个消息的复杂度会不同,这将会导致我们的消费者在进行应答消息的时候,在队列的消息会需要等待很长的时间才能进行处理,所以对于排在后面简单的消息就不会及时的处理,因此,我们应该有一种机制让我们的消息更快的进行处理。所以我们可以让一个队列对应多个消费者,这样就可以让我们的消息进行轮询调度。现在我们修改代码,我们需要将消息的复杂度按照发送字符串长度的大小,一个字符会停顿1秒。对于复杂度高的,停顿的时间会更长,用来模拟消费者处理消息的时间,我们使用控制台的参数作为发送的消息。

1//添加一个函数
2func bodyFrom(str []string) (newstr string) {
3    for _, v := range str {
4        newstr += v
5    }
6    return newstr
7}
8//使用下面的语句获得字符串
9body := bodyFrom(os.Args)

消费者

修改我们的消费者只需要在收到消息做一些处理就行,代码中减去70的原因是因为获得字符串又很多没用的,我了加快演示速度,不让消息等待太长时间。

 1go func() {
 2    for d := range msgs {
 3        log.Printf("Received a message : %s", d.Body)
 4        str := fmt.Sprintf("%s", d.Body)
 5        t := time.Duration(len(str) - 70)
 6        time.Sleep(t * time.Second)
 7        // 开始手动应答
 8        d.Acknowledger.Ack(d.DeliveryTag, true)
 9    }
10}()

公平分发

对于上面的代码还需要完善,为什么,因为在我们的消息给消费者的时候,未应答之前,仍然有可能会有其他的消息被接收。就是说,我们应该提示队列,分发消息时,如果碰到有消费者正在处理消息,但是还没有成功处理,不应该继续找这个消费者,应该自动寻找其他可用的消费者。因此RabbitMQ官方给我们提供了一个方法如下,当分发给该消费者的前一个消息还没有收到ack确认时,RabbitMQ将不会再给它派发消息,而是寻找下一个空闲的消费者目标进行分发。

1err = ch.Qos(
2    1,     // prefetch count
3    0,     // prefetch size
4    false, // global
5)

运行结果

有帮助到你的点赞、收藏和关注一下吧

 

                                                                       需要更多教程,微信扫码即可

                                                                                 

                                                                                         

标签:消费者,处理,work,笔记,RabbitMQ,str,我们,消息
来源: https://blog.csdn.net/qfzhaohan/article/details/122064078

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有