exchange(交换机)
实际上消息并不是直接由发布者直接发送到消息队列,而是直接发布到exchange,再由exchange路由给相应的消息队列。
exchange总共有四种类型:
direct: exchange将消息直接交付给routing key一致的队列中
topic:routing key符号“#”匹配一个或多个词,符号“*” 只能匹配一个词
fanout:交换机把消息都会被广播到与该交换机绑定的所有队列
headers:在绑定Queue与Exchange时指定一组键值对;当消息发送到RabbitMQ时会取到该消息的headers与Exchange绑定时指定的键值对进行匹配;如果完全匹配则消息会路由到该队列,否则不会路由到该队列。headers属性是一个键值对,可以是Hashtable,键值对的值可以是任何类型;
消息生产者发布发送消息到交换机,交换机会将消息发送给与之绑定的所有队列,并且由相应的消费者消费;
producer.go
package main
import (
"log"
"os"
"strings"
"github.com/streadway/amqp"
)
func failOnError(err error, msg string) {
if err != nil {
log.Fatalf("%s: %s", msg, err)
}
}
func main() {
conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")
failOnError(err, "Failed to connect to RabbitMQ")
defer conn.Close()
ch, err := conn.Channel()
failOnError(err, "Failed to open a channel")
defer ch.Close()
//定义名称为logs的交换机,并且声明类型为fanout
err = ch.ExchangeDeclare(
"logs", // name
"fanout", // type
true, // durable
false, // auto-deleted
false, // internal
false, // no-wait
nil, // arguments
)
failOnError(err, "Failed to declare an exchange")
body := bodyFrom(os.Args)
err = ch.Publish