前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >RabbitMQ系列笔记work模式

RabbitMQ系列笔记work模式

作者头像
陌无崖
发布2019-08-16 17:30:21
4760
发布2019-08-16 17:30:21
举报

导语

在上一篇的博客RabbitMQ系列笔记入门篇我们其实用到了一种工作模式就是简单队列,一个生产者对应了一个消费者,今天主要给大家讲一下工作队列,一个生产者对应了多个消费者,但只有一个消费者会受到消息,并作出应答。

Work模式

生产者

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

代码语言:javascript
复制
//添加一个函数
func bodyFrom(str []string) (newstr string) {
    for _, v := range str {
        newstr += v
    }
    return newstr
}
//使用下面的语句获得字符串
body := bodyFrom(os.Args)
消费者

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

代码语言:javascript
复制
go func() {
    for d := range msgs {
        log.Printf("Received a message : %s", d.Body)
        str := fmt.Sprintf("%s", d.Body)
        t := time.Duration(len(str) - 70)
        time.Sleep(t * time.Second)
        // 开始手动应答
        d.Acknowledger.Ack(d.DeliveryTag, true)
    }
}()
公平分发

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

代码语言:javascript
复制
err = ch.Qos(
    1,     // prefetch count
    0,     // prefetch size
    false, // global
)
运行结果

本文欢迎转载,转载请联系作者,谢谢!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-08-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 golang技术杂文 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 导语
  • Work模式
    • 生产者
      • 消费者
        • 公平分发
          • 运行结果
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档