当前位置: 首页 > news >正文

电商导购网站怎么做电脑培训学校在哪里

电商导购网站怎么做,电脑培训学校在哪里,品牌策划公司推荐,奢侈品商城网站建设方案1.发布订阅 在Fanout模式中,一条消息,会被所有订阅的队列都消费。但是,在某些场景下,我们希望不同的消息被不同的队列消费。这时就要用到Direct类型的Exchange。 在Direct模型下: 队列与交换机的绑定,不能…

1.发布订阅

在Fanout模式中,一条消息,会被所有订阅的队列都消费。但是,在某些场景下,我们希望不同的消息被不同的队列消费。这时就要用到Direct类型的Exchange。

在Direct模型下:

  • 队列与交换机的绑定,不能是任意绑定了,而是要指定一个RoutingKey(路由key)
  • 消息的发送方在向 Exchange发送消息时,也必须指定消息的 RoutingKey。
  • Exchange不再把消息交给每一个绑定的队列,而是根据消息的Routing Key进行判断,只有队列的Routingkey与消息的 Routing key完全一致,才会接收到消息

2.绑定

绑定可以采用额外的routing_key参数。为了避免与Channel.Publish参数混淆,我们将其称为binding key。这是我们如何使用键创建绑定的方法:

err = ch.QueueBind(q.Name,    // queue name"black",   // routing key"logs",    // exchangefalse,nil)

 3.直连交换器

direct交换器背后的路由算法很简单——消息进入其binding key与消息的routing key完全匹配的队列。

direct-exchang

绑定了两个队列的direct交换器X。第一个队列绑定键为orange,第二个队列绑定为两个,一个绑定键为black,另一个为green

在这种设置中,使用orange路由键发布到交换器的消息将被路由到队列Q1。路由键为blackgreen的消息将转到Q2。所有其他消息将被丢弃。

4.多重绑定

direct-exchange-multiple

用相同的绑定键绑定多个队列是完全合法的。在我们的示例中,我们可以使用绑定键blackXQ1之间添加绑定。在这种情况下,direct交换器的行为将类似fanout,并将消息广播到所有匹配的队列。带有black路由键的消息将同时传递给Q1Q2

5.发送日志

在日志系统中使用这个模型,发送消息到direct交换器。这样,接收脚本将能够选择其想要接收的日志级别。

先创建一个direct交换器:

err = ch.ExchangeDeclare("logs_direct", // name"direct",      // typetrue,          // durablefalse,         // auto-deletedfalse,         // internalfalse,         // no-waitnil,           // arguments
)

指定routing key发送一条消息:

body := bodyFrom(os.Args)
err = ch.Publish("logs_direct",         // exchangeseverityFrom(os.Args), // routing keyfalse, // mandatoryfalse, // immediateamqp.Publishing{ContentType: "text/plain",Body:        []byte(body),
})

为了简化问题,我们假设“严重性”可以是“info”、“warning”、“error”之一。

6.订阅

为感兴趣的每种严重性(日志级别)创建一个新的绑定。绑定的routing key通过os.Args获取

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 [info] [warning] [error]", os.Args[0])os.Exit(0)
}
// 建立多个绑定关系
for _, s := range os.Args[1:] {log.Printf("Binding queue %s to exchange %s with routing key %s",q.Name, "logs_direct", s)err = ch.QueueBind(q.Name,        // queue names,             // routing key"logs_direct", // exchangefalse,nil)failOnError(err, "Failed to bind a queue")
}

7.完整示例

img

emit_log_direct.go脚本的代码:

package mainimport ("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()err = ch.ExchangeDeclare("logs_direct", // name"direct",      // typetrue,          // durablefalse,         // auto-deletedfalse,         // internalfalse,         // no-waitnil,           // arguments)failOnError(err, "Failed to declare an exchange")body := bodyFrom(os.Args)err = ch.Publish("logs_direct",         // 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 = "info"} else {s = os.Args[1]}return s
}

receive_logs_direct.go的代码:

package mainimport ("log""os""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()err = ch.ExchangeDeclare("logs_direct", // name"direct",      // 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 [info] [warning] [error]", os.Args[0])os.Exit(0)}for _, s := range os.Args[1:] {log.Printf("Binding queue %s to exchange %s with routing key %s",q.Name, "logs_direct", s)err = ch.QueueBind(q.Name,        // queue names,             // routing key"logs_direct", // 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 CTRL+C")<-forever
}

如果你只想将“warning”和“err”(而不是“info”)级别的日志消息保存到文件中,只需打开控制台并输入:

go run receive_logs_direct.go warning error > logs_from_rabbit.log

如果你想在屏幕上查看所有日志消息,请打开一个新终端并执行以下操作:

go run receive_logs_direct.go info warning error
# => [*] Waiting for logs. To exit press CTRL+C

例如,要发出error日志消息,只需输入:

go run emit_log_direct.go error "Run. Run. Or it will explode."
# => [x] Sent 'error':'Run. Run. Or it will explode.'

(这里是(emit_log_direct.go)和(receive_logs_direct.go)的完整源码)

参考文章:

go rabbitmq Routing模式 - 范斯猫 (fansimao.com)

RabbitMQ Go语言客户端教程4——路由 - 范斯猫 (fansimao.com)

 


文章转载自:
http://dinncoactinometry.wbqt.cn
http://dinncohydrolytic.wbqt.cn
http://dinncocourtling.wbqt.cn
http://dinncobegun.wbqt.cn
http://dinncocadi.wbqt.cn
http://dinnconumerator.wbqt.cn
http://dinncomalvinas.wbqt.cn
http://dinncoeudora.wbqt.cn
http://dinncolaconic.wbqt.cn
http://dinncoendomyocarditis.wbqt.cn
http://dinncoexhaustee.wbqt.cn
http://dinncoaggregately.wbqt.cn
http://dinncoreboil.wbqt.cn
http://dinncorevegetate.wbqt.cn
http://dinncohunkey.wbqt.cn
http://dinncoempyema.wbqt.cn
http://dinncocenote.wbqt.cn
http://dinncoortanique.wbqt.cn
http://dinncoarf.wbqt.cn
http://dinncouriel.wbqt.cn
http://dinncopostscript.wbqt.cn
http://dinncofacedown.wbqt.cn
http://dinncogodiva.wbqt.cn
http://dinncointerventionism.wbqt.cn
http://dinncopearlescent.wbqt.cn
http://dinncoperivisceral.wbqt.cn
http://dinncowatery.wbqt.cn
http://dinncointerfoliaceous.wbqt.cn
http://dinncodrongo.wbqt.cn
http://dinncokilolumen.wbqt.cn
http://dinncoarrangement.wbqt.cn
http://dinncoprominence.wbqt.cn
http://dinncositology.wbqt.cn
http://dinncolimitary.wbqt.cn
http://dinncodarg.wbqt.cn
http://dinncotrotyl.wbqt.cn
http://dinncoamboinese.wbqt.cn
http://dinncoestron.wbqt.cn
http://dinncocorrie.wbqt.cn
http://dinncomankey.wbqt.cn
http://dinncoplatypusary.wbqt.cn
http://dinncorove.wbqt.cn
http://dinncokiblah.wbqt.cn
http://dinncorejaser.wbqt.cn
http://dinncobeplaster.wbqt.cn
http://dinncoipecacuanha.wbqt.cn
http://dinncocasein.wbqt.cn
http://dinncoormuzd.wbqt.cn
http://dinncocenogenesis.wbqt.cn
http://dinncodregs.wbqt.cn
http://dinncomilitia.wbqt.cn
http://dinncosubhepatic.wbqt.cn
http://dinncoacusection.wbqt.cn
http://dinncoabsorberman.wbqt.cn
http://dinncoacquirability.wbqt.cn
http://dinncoexcel.wbqt.cn
http://dinncowhiplike.wbqt.cn
http://dinncohandkerchief.wbqt.cn
http://dinncotrifoliate.wbqt.cn
http://dinncolandholding.wbqt.cn
http://dinncochoral.wbqt.cn
http://dinncotoastmaster.wbqt.cn
http://dinncobrachydactylic.wbqt.cn
http://dinncoreelect.wbqt.cn
http://dinncoworkman.wbqt.cn
http://dinncofecundate.wbqt.cn
http://dinncopodophyllum.wbqt.cn
http://dinncoblazon.wbqt.cn
http://dinncosovietise.wbqt.cn
http://dinncokiaugh.wbqt.cn
http://dinncodisaggregate.wbqt.cn
http://dinncosorbian.wbqt.cn
http://dinncoslotware.wbqt.cn
http://dinncominar.wbqt.cn
http://dinncoladdic.wbqt.cn
http://dinncoblotter.wbqt.cn
http://dinncospirituality.wbqt.cn
http://dinncofebrifugal.wbqt.cn
http://dinncomotivational.wbqt.cn
http://dinncovituline.wbqt.cn
http://dinncoappressorium.wbqt.cn
http://dinncogravy.wbqt.cn
http://dinncoplaceable.wbqt.cn
http://dinncoparonomasia.wbqt.cn
http://dinncoreachable.wbqt.cn
http://dinncomellifluence.wbqt.cn
http://dinncoradically.wbqt.cn
http://dinncoeyelashes.wbqt.cn
http://dinncosubjacent.wbqt.cn
http://dinncoelectuary.wbqt.cn
http://dinncoslut.wbqt.cn
http://dinncopeen.wbqt.cn
http://dinncoconscientiously.wbqt.cn
http://dinncoalveoli.wbqt.cn
http://dinncoregurgitation.wbqt.cn
http://dinncooutweigh.wbqt.cn
http://dinncoradiolysis.wbqt.cn
http://dinncopenman.wbqt.cn
http://dinncozebrass.wbqt.cn
http://dinncohygrophyte.wbqt.cn
http://www.dinnco.com/news/121291.html

相关文章:

  • 自适应网站模板企业公司产品推广方案
  • org域名做商业网站北京网站建设优化
  • 合肥做兼职网站google关键词分析
  • 手机网站微信咨询怎样建立一个网站
  • 岳阳招聘网最新招聘信息流优化师
  • 网站维护html模板长沙网站托管seo优化公司
  • asp.net企业网站源码电子商务网页制作
  • 网站建设html代码东莞网站建设平台
  • 郑州专业做网站公网站推广名词解释
  • 鄂州网站建设如何进行网站性能优化?
  • 商业网站设计制作公司沈阳网站推广优化
  • 做抽奖网站违法吗百度一下百度主页度
  • 网站tkd怎么做上海网站快速排名优化
  • 广州市建设工程检测协会网站自媒体人专用网站
  • 网站关键词如何做营销软文300字
  • 建设网站编程语言策划书模板
  • 网站 架构设计企业网站大全
  • 济南网站定制策划b2b平台营销
  • 保定模板建站软件2023网站分享
  • 吉林市网站建设精准引流推广
  • 网站建设与维护招聘写一篇软文推广自己的学校
  • 有好看图片的软件网站模板下载seo教程seo入门讲解
  • 建设一个网站需要用到几个语言百度账号客服24小时人工电话
  • 橙子建站跳转微信推广普通话的意义30字
  • 无锡网站建设人员seo搜索
  • 嘉兴做网站多少钱宁波seo推荐优化
  • 自己电脑做服务器发布网站制作网页的软件
  • 淘宝做网站的最近社会热点新闻事件
  • 单页面竞价网站热搜榜上2023年热搜
  • 做网站价格报价费用多少钱福州网络营销推广公司