网站升级每天自动更新,海南省海口市网站建设,海曙seo关键词优化方案,网站策划运营方案topic交换器#xff08;主题交换器#xff09;
发送到topic交换器的消息不能具有随意的routing_key——它必须是单词列表#xff0c;以点分隔。这些词可以是任何东西#xff0c;但通常它们指定与消息相关的某些功能。一些有效的routing_key示例#xff1a;“stock.usd.ny…topic交换器主题交换器
发送到topic交换器的消息不能具有随意的routing_key——它必须是单词列表以点分隔。这些词可以是任何东西但通常它们指定与消息相关的某些功能。一些有效的routing_key示例“stock.usd.nyse”“nyse.vmw”“quick.orange.rabbit”。routing_key中可以包含任意多个单词最多255个字节。
绑定键也必须采用相同的形式。topic交换器背后的逻辑类似于direct交换器——用特定路由键发送的消息将传递到所有匹配绑定键绑定的队列。但是绑定键有两个重要的特殊情况 - *星号可以代替一个单词。 - 井号可以替代零个或多个单词。
通过下面这个示例可以很容易看明白这一点 在这个例子中我们将发送一些都是描述动物的信息。将使用包含三个词两个点的路由密钥发送消息。路由键中的第一个单词将描述速度第二个是颜色第三个是种类“speed.colour.species”。
我们创建了三个绑定关系Q1与绑定键“ * .orange. * ”绑定Q2与“* .* .rabbit”和“lazy.”绑定。
这些绑定可以总结为
Q1对所有橙色动物都感兴趣Q2想接收有关兔子rabbit的一切消息以及有关懒惰lazy动物的一切消息。
路由键设置为“quick.orange.rabbit”的消息将传递到两个队列。消息“lazy.orange.elephant”也将发送给他们两个。另一方面“quick.orange.fox”将仅进入第一个队列而“lazy.brown.fox”将仅进入第二个队列。即使“lazy.pink.rabbit”与两个绑定匹配匹配Q2的两个绑定也只会传递到第二个队列一次。 “quick.brown.fox”与任何绑定都不匹配因此将被丢弃。
如果我们打破约定并发送一个或四个单词的消息例如“orange”或“quick.orange.male.rabbit”会发生什么好吧这些消息将不匹配任何绑定并且将会丢失。
另外“lazy.orange.male.rabbit”即使有四个单词也将匹配最后一个绑定并将其传送到第二个队列。 topic交换器 topic交换器功能强大可以像其他交换器一样运行。 当队列用“#”井号绑定键绑定时它将接收所有消息而与路由键无关就像在fanout交换器中一样。 当在绑定中不使用特殊字符“*”星号和“#”井号时topic交换器的行为就像direct交换器一样。 完整示例
我们将在日志记录系统中使用topic交换器。我们将从一个可行的假设开始即日志的路由键将包含两个词“facility.severity”。
emit_log_topic.go的代码
package mainimport (logosstringsgithub.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:guestlocalhost: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()err ch.ExchangeDeclare(logs_topic, // nametopic, // typetrue, // durablefalse, // auto-deletedfalse, // internalfalse, // no-waitnil, // arguments)failOnError(err, Failed to declare an exchange)body : bodyFrom(os.Args)err ch.Publish(logs_topic, // exchangeseverityFrom(os.Args), // routing keyfalse, // mandatoryfalse, // immediateamqp.Publishing{ContentType: text/plain,Body: []byte(body),})failOnError(err, Failed to publish a message)log.Printf( [x] Sent %s, body)
}func bodyFrom(args []string) string {var s stringif (len(args) 3) || os.Args[2] {s hello} else {s strings.Join(args[2:], )}return s
}func severityFrom(args []string) string {var s stringif (len(args) 2) || os.Args[1] {s anonymous.info} else {s os.Args[1]}return s
}receive_logs_topic.go 的代码
package mainimport (logosgithub.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:guestlocalhost: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()err ch.ExchangeDeclare(logs_topic, // nametopic, // typetrue, // durablefalse, // auto-deletedfalse, // internalfalse, // no-waitnil, // arguments)failOnError(err, Failed to declare an exchange)q, err : ch.QueueDeclare(, // namefalse, // durablefalse, // delete when unusedtrue, // exclusivefalse, // no-waitnil, // arguments)failOnError(err, Failed to declare a queue)if len(os.Args) 2 {log.Printf(Usage: %s [binding_key]..., os.Args[0])os.Exit(0)}// 绑定topicfor _, s : range os.Args[1:] {log.Printf(Binding queue %s to exchange %s with routing key %s,q.Name, logs_topic, s)err ch.QueueBind(q.Name, // queue names, // routing keylogs_topic, // exchangefalse,nil)failOnError(err, Failed to bind a queue)}msgs, err : ch.Consume(q.Name, // queue, // consumertrue, // auto ackfalse, // exclusivefalse, // no localfalse, // no waitnil, // args)failOnError(err, Failed to register a consumer)forever : make(chan bool)go func() {for d : range msgs {log.Printf( [x] %s, d.Body)}}()log.Printf( [*] Waiting for logs. To exit press CTRLC)-forever
}想要接收所有的日志
go run receive_logs_topic.go #要从“kern”接收所有日志
go run receive_logs_topic.go kern.*或者如果你只想接收“critical”日志
go run receive_logs_topic.go *.critical你可以创建多个绑定
go run receive_logs_topic.go kern.* *.critical并发出带有路由键“kern.critical”的日志
go run emit_log_topic.go kern.critical A critical kernel error你可以自己尝试玩一下这个程序。请注意代码没有对路由键或绑定键进行任何假设你可能希望使用两个以上的路由键参数。
源自https://www.rabbitmq.com/getstarted.html