内容简介:版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lastsweetop/article/details/91363644
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lastsweetop/article/details/91363644
在helloworld那一章讲了一个简单的一个生产者一个消费者的模型,但生产系统中很多时候是多个生产者或者多个消费者同时处理的。
body := bodyFrom(os.Args)
err = ch.Publish("", q.Name, false, false, amqp.Publishing{
DeliveryMode: amqp.Persistent,
ContentType: "text/plain",
Body: []byte(body),
})
bodyFrom
func bodyFrom(args []string) string {
if len(args) > 1 {
return strings.Join(args[1:], " ")
}
return "default"
}
msgs, err := ch.Consume(q.Name, "", true, false, false, false, nil)
failOnError(err, "Failed to register a consumer")
go func() {
for msg := range msgs {
log.Printf("Received a message: %s", msg.Body)
dotCount := bytes.Count(msg.Body, []byte("."))
t := time.Duration(dotCount)
time.Sleep(t * time.Second)
log.Printf("Done")
}
}()
默认情况下消息会循环分发到消费者
消息ack
当消费者的 autoack
为true时,一旦收到消息就会直接把该消息设置为删除状态,如果消息的处理时间之内,消费者挂掉了那么这条消息就会丢失掉。
rabbitmq支持消息ack机制,将autoack设为false,当处理完毕再手动触发ack操作。如果处理消息的过程中挂掉了,那么这条消息就会分发给其他都消费者。
msgs, err := ch.Consume(q.Name, "", false, false, false, false, nil)
failOnError(err, "Failed to register a consumer")
go func() {
for msg := range msgs {
log.Printf("Received a message: %s", msg.Body)
dotCount := bytes.Count(msg.Body, []byte("."))
t := time.Duration(dotCount)
time.Sleep(t * time.Second)
log.Printf("Done")
msg.Ack(false)
}
}()
消息持久性
之前说的是消费者挂掉不会丢失消息的解决方法,那么如果mq挂掉呢,如果保证mq挂掉都不会丢失消息,那么就是消息持久性做到事情。
消息持久性分为两步
队列的持久性
将队列设为持久的,当mq重启的时候不会丢失队列
q, err := ch.QueueDeclare("workQueue", true, false, false, false, nil)
消息的持久性
发布消息时,设置消息为持久的
err = ch.Publish("", q.Name, false, false, amqp.Publishing{
DeliveryMode: amqp.Persistent,
ContentType: "text/plain",
Body: []byte(body),
})
公平分配
循环分配方式只能做到平均分配,每个消费者一个一次分配,但是平均不一定就是公平,比如有的消费者所在的服务器资源较差的情况下,平均肯定是不合理的,为了做到公平那么使用如下设置即可
err = ch.Qos(1, 0, false)
这段代码的意思是最多同时处理一个,多了先别发给我。
以上所述就是小编给大家介绍的《golang使用rabbitmq(一)工作队列》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- python中使用优先队列
- 使用消息队列的 10 个理由
- c# – 使用队列创建BackgroundWorker
- rabbitmq死信队列详解与使用
- 使用Python操作消息队列RabbitMQ
- 消息队列中间件(二)使用 ActiveMQ
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Java程序设计
宋中山 严千钧 等编 / 清华大学出版社 / 2005-8 / 27.00元
本书全面、系统地介绍了Java语言的基本概念、基本语法和编程方法。主要内容包括:Java语言概述、数据类型与运算符、流程控制语句、类与对象、继承与多态、异常处理、工具类和算法、Applet小应用程序、图形用户界面、输入和输出、Java多线程以及Java高级编程。每章后面附有习题,读者可参考使用。 本书内容丰富,结构合理,语言简洁,深入浅出,通俗易懂。基础知识与程序实例相结合,示例典型......一起来看看 《Java程序设计》 这本书的介绍吧!
JS 压缩/解压工具
在线压缩/解压 JS 代码
JSON 在线解析
在线 JSON 格式化工具