**
RabbitMQ工作模式–Wok模式**
特点:一个消息只能被一个消费者获取。架构图:
相比Simple模式,work模式多了一个消费端。Work模式最大的特点就是可以实现负载均衡的作用。
package main
import (
"fmt"
"rabbitmq/RabbitMQ"
"strconv"
"time"
)
func main() {
rabbitmq := RabbitMQ.NewRabbitMQSimple("" +
"imoocSimple")
for i := 0; i <= 100; i++ {
rabbitmq.PublishSimple("Hello imooc!" + strconv.Itoa(i))
time.Sleep(1 * time.Second)
fmt.Println(i)
}
}
package main
import "rabbitmq/RabbitMQ"
func main() {
rabbitmq := RabbitMQ.NewRabbitMQSimple("" +
"imoocSimple")
rabbitmq.ConsumeSimple()
}
package main
import "rabbitmq/RabbitMQ"
func main() {
rabbitmq := RabbitMQ.NewRabbitMQSimple("" +
"imoocSimple")
rabbitmq.ConsumeSimple()
}
Publish模式-订阅模式
消息被路由投递给多个队列,一个消息被多个消费者获取。
X表示exchange(交换机),生产者把消息发送到交换机,交换机经过一系列处理,然后再把信息传给多个队列,再由每个队列绑定的消费者进行消费,这样我们就可以实现一个消息被多个消费者获取。
代码:
package main
import (
"rabbitmq/RabbitMQ"
"strconv"
"time"
"fmt"
)
func main() {
rabbitmq := RabbitMQ.NewRabbitMQPubSub("" +
"newProduct")
for i := 0; i < 100; i++ {
rabbitmq.PublishPub("订阅模式生产第" +
strconv.Itoa(i) + "条" + "数据")
fmt.Println("订阅模式生产第" +
strconv.Itoa(i) + "条" + "数据")
time.Sleep(1 * time.Second)
}
}
订阅模式生产:尝试创建交换机:
unc (r *RabbitMQ) PublishPub(message string) {
//1.尝试创建交换机
err := r.channel.ExchangeDeclare(
r.Exchange,
"fanout",
true,
false,
//true表示这个exchange不可以被client用来推送消息,仅用来进行exchange和exchange之间的绑定
false,
false,
nil,
)
r.failOnErr(err, "Failed to declare an excha"+
"nge")
}
2.发送消息:
//2.发送消息
err = r.channel.Publish(
r.Exchange,
"",
false,
false,
amqp.Publishing{
ContentType: "text/plain",
Body: []byte(message),
})
}
3.消费端代码:
//订阅模式消费端代码
func (r *RabbitMQ) RecieveSub() {
//1.试探性创建交换机
err := r.channel.ExchangeDeclare(
r.Exchange,
//交换机类型
"fanout",
true,
false,
//YES表示这个exchange不可以被client用来推送消息,仅用来进行exchange和exchange之间的绑定
false,
false,
nil,
)
r.failOnErr(err, "Failed to declare an exch"+
"ange")
//2.试探性创建队列,这里注意队列名称不要写
q, err := r.channel.QueueDeclare(
"", //随机生产队列名称
false,
false,
true,
false,
nil,
)
r.failOnErr(err, "Failed to declare a queue")
3.绑定队列到交换机中:
/绑定队列到 exchange 中
err = r.channel.QueueBind(
q.Name,
//在pub/sub模式下,这里的key要为空
"",
r.Exchange,
false,
nil)
4.消费消息:
//消费消息
messges, err := r.channel.Consume(
q.Name,
"",
true,
false,
false,
false,
nil,
)
forever := make(chan bool)
go func() {
for d := range messges {
log.Printf("Received a message: %s", d.Body)
}
}()
fmt.Println("退出请按 CTRL+C\n")
<-forever
Work模式和Publish模式都是基于Simple模式产生的,其代码非常相似。功能也差不多。work模式是一对一,publish模式是一对多。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)