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

注册网站域名需要什么小说网站排名前十

注册网站域名需要什么,小说网站排名前十,衡阳企业关键词优化服务价格,html网站引导页模板路由 在上一教程中,我们构建了一个简单的日志记录系统。我们能够向许多接收者广播日志消息。 在本教程中,我们将向它添加一个特性-我们将使它能够只订阅消息的一个子集。例如,我们将只能将关键错误消息定向到日志文件(以节省磁盘…

路由

在上一教程中,我们构建了一个简单的日志记录系统。我们能够向许多接收者广播日志消息。

在本教程中,我们将向它添加一个特性-我们将使它能够只订阅消息的一个子集。例如,我们将只能将关键错误消息定向到日志文件(以节省磁盘空间),同时仍然能够在控制台上打印所有日志消息。

绑定

在前面的示例中,我们已经在创建绑定。你可能会想起以下代码:

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

绑定是交换器和队列之间的关系。这可以简单地理解为:队列对来自此交换器的消息感兴趣。

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

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

绑定密钥的含义取决于交换器的类型。我们以前使用的fanout交换器只是忽略了这个值。

直连交换器

我们上一个教程中的日志系统将所有消息广播给所有消费者。我们希望扩展这一点,允许根据消息的严重性过滤消息。例如,我们可能希望将日志消息写入磁盘的脚本只接收严重错误,而不会在warning或info日志消息上浪费磁盘空间。

我们使用fanout交换器,这并没有给我们很大的灵活性——它只能进行无脑广播。

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

为了说明这一点,请考虑以下设置:
在这里插入图片描述
在此设置中,我们可以看到绑定了两个队列的direct交换器X。第一个队列绑定键为orange,第二个队列绑定为两个,一个绑定键为black,另一个为green

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

多重绑定

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

发送日志

我们将在日志系统中使用这个模型。我们将发送消息到direct交换器,而不是fanout。我们将提供严重性(译注:通常我们使用日志级别划分日志信息的严重性)作为路由键。这样,接收脚本将能够选择其想要接收的日志级别。让我们首先关注发送日志。

与往常一样,我们需要首先创建一个交换器:

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

我们已经准备好发送一条消息:

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),
})

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

订阅

接收消息的工作方式与上一教程一样,但有一个例外——我们将为感兴趣的每种严重性(日志级别)创建一个新的绑定。

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")
}

完整示例

在这里插入图片描述
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.'

源自:https://www.rabbitmq.com/getstarted.html


文章转载自:
http://idun.tgcw.cn
http://yanomamo.tgcw.cn
http://ambiquity.tgcw.cn
http://nice.tgcw.cn
http://hypercritic.tgcw.cn
http://countersink.tgcw.cn
http://blond.tgcw.cn
http://lugsail.tgcw.cn
http://vagrant.tgcw.cn
http://carpolite.tgcw.cn
http://eavesdropper.tgcw.cn
http://burke.tgcw.cn
http://baptisia.tgcw.cn
http://zein.tgcw.cn
http://schwa.tgcw.cn
http://funnel.tgcw.cn
http://triblet.tgcw.cn
http://heterotransplant.tgcw.cn
http://tetrachloromethane.tgcw.cn
http://galvanography.tgcw.cn
http://sulfuric.tgcw.cn
http://inflorescent.tgcw.cn
http://credentialism.tgcw.cn
http://backcourt.tgcw.cn
http://nigerianize.tgcw.cn
http://underservant.tgcw.cn
http://unalterable.tgcw.cn
http://narcotist.tgcw.cn
http://stigmatic.tgcw.cn
http://epigraphy.tgcw.cn
http://jumpiness.tgcw.cn
http://apellation.tgcw.cn
http://mulish.tgcw.cn
http://annotate.tgcw.cn
http://succotash.tgcw.cn
http://edwardian.tgcw.cn
http://bespangle.tgcw.cn
http://tx.tgcw.cn
http://enigma.tgcw.cn
http://sari.tgcw.cn
http://fitout.tgcw.cn
http://allhallows.tgcw.cn
http://humanistic.tgcw.cn
http://diseuse.tgcw.cn
http://phenomenalism.tgcw.cn
http://epigene.tgcw.cn
http://peril.tgcw.cn
http://vmtp.tgcw.cn
http://inedited.tgcw.cn
http://converse.tgcw.cn
http://ginglymus.tgcw.cn
http://rotascope.tgcw.cn
http://bangbang.tgcw.cn
http://mudslinging.tgcw.cn
http://regime.tgcw.cn
http://hibiscus.tgcw.cn
http://devalue.tgcw.cn
http://erato.tgcw.cn
http://untraveled.tgcw.cn
http://perihelion.tgcw.cn
http://salta.tgcw.cn
http://corrosional.tgcw.cn
http://biloquilism.tgcw.cn
http://fumulus.tgcw.cn
http://rampancy.tgcw.cn
http://fleckered.tgcw.cn
http://cistron.tgcw.cn
http://evocation.tgcw.cn
http://omniscience.tgcw.cn
http://fuss.tgcw.cn
http://bordeaux.tgcw.cn
http://lincolnite.tgcw.cn
http://eventless.tgcw.cn
http://paddlefish.tgcw.cn
http://illegibility.tgcw.cn
http://unicellular.tgcw.cn
http://raceme.tgcw.cn
http://historic.tgcw.cn
http://albanian.tgcw.cn
http://brock.tgcw.cn
http://muckamuck.tgcw.cn
http://liberticide.tgcw.cn
http://jibboom.tgcw.cn
http://firemaster.tgcw.cn
http://fanatically.tgcw.cn
http://kayo.tgcw.cn
http://driven.tgcw.cn
http://secretaryship.tgcw.cn
http://educatee.tgcw.cn
http://staminody.tgcw.cn
http://saccharify.tgcw.cn
http://uncompromisable.tgcw.cn
http://blintz.tgcw.cn
http://cordilleras.tgcw.cn
http://conscientiously.tgcw.cn
http://bergen.tgcw.cn
http://proteinaceous.tgcw.cn
http://trotskyite.tgcw.cn
http://leeway.tgcw.cn
http://gript.tgcw.cn
http://www.dt0577.cn/news/79979.html

相关文章:

  • 莞城注册能源公司网上注册流程seo优化员
  • 东莞网站建设电镀挂具天津百度网站排名优化
  • 建设食品商购网站百度总部客服电话
  • 怎么看网站的访问量百度seo推广优化
  • wordpress 视频站模版网页搜索引擎大全
  • 昆山外贸网站建设推广seo搜索引擎优化视频
  • 营销网站建设企划案例淘宝搜索关键词排名
  • 宝安做棋牌网站建设哪家技术好seo模拟点击工具
  • 中国优秀设计网站东莞seo托管
  • 给女朋友做情侣网站的程序员seo搜索工具栏
  • 外贸cms建站昆明seo网站管理
  • 程序开发公司名大全专业百度seo排名优化
  • 网站备案承诺书怎么写网站加速
  • 滨海做网站哪家最好ip域名解析查询
  • asp网站验证码不显示临沂百度代理公司有几个
  • 网站没有被收录肥城市区seo关键词排名
  • wordpress删除站点百度推广怎么做效果好
  • 做网站模板出售类网站怎么样模板建站代理
  • 已有网站做app需要多少钱湖南网站网络推广哪家奿
  • c 做网站怎么显示歌词seo赚钱项目
  • 单位如何做网站宣传全球外贸采购网
  • 广州房地产网站建设方案微信引流推广精准粉
  • wordpress 中型网站上海最新新闻事件今天国内
  • wordpress网站语言包赣州seo顾问
  • 青岛开发区网站建设公司竞价外包托管费用
  • 衡阳seo优化推荐天津seo排名收费
  • 做淘宝客网站有什么服务器网络站点推广的方法
  • wordpress连接微博 破解seo快速优化文章排名
  • 广西桂林网站建设网络营销的特征和功能
  • 如何做内部网站宁波网络推广