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

网站建设视频广点通投放平台

网站建设视频,广点通投放平台,成都网站优化方法,鞍山网站建设鞍山文章目录 RabbitMQ教程:路由(Routing)(四)一、引言二、基本概念2.1 路由与绑定2.2 Direct交换机2.3 多绑定2.4 发送日志2.5 订阅 三、整合代码3.1 EmitLogDirectApp.cs3.2 ReceiveLogsDirectApp.cs3.3 推送所有和接收e…

文章目录

  • RabbitMQ教程:路由(Routing)(四)
    • 一、引言
    • 二、基本概念
      • 2.1 路由与绑定
      • 2.2 Direct交换机
      • 2.3 多绑定
      • 2.4 发送日志
      • 2.5 订阅
    • 三、整合代码
      • 3.1 EmitLogDirectApp.cs
      • 3.2 ReceiveLogsDirectApp.cs
      • 3.3 推送所有和接收error、warning级别日志
      • 3.4 推送和接收error级别日志
    • 四、结论

RabbitMQ教程:路由(Routing)(四)

一、引言

在之前的教程中,我们构建了一个简单的日志系统,该系统能够将日志消息广播给多个接收者。在本教程中,我们将扩展这个系统,增加一个功能:只订阅消息的一个子集。例如,我们可能只想将关键错误消息定向到日志文件(以节省磁盘空间),同时仍然能够在控制台上打印所有日志消息。

二、基本概念

2.1 路由与绑定

在之前的示例中,我们已经创建了绑定。绑定是交换机和队列之间的关系,可以简单地理解为:队列对来自这个交换机的消息感兴趣。

channel.QueueBind(queue: queueName,exchange: "logs",routingKey: string.Empty);

绑定可以带一个额外的routingKey参数,为了避免与BasicPublish参数混淆,我们将其称为binding key。下面是如何创建带有键的绑定:

channel.QueueBind(queue: queueName,exchange: "direct_logs",routingKey: "black");

绑定键的含义取决于交换机类型。我们之前使用的fanout交换机,简单地忽略了它的值。

2.2 Direct交换机

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

我们之前使用的fanout交换机没有给我们提供太多灵活性——它只能进行无脑广播。

我们将改用direct交换机。direct交换机背后的路由算法很简单——消息会被路由到binding key与消息的routing key完全匹配的队列。
在这里插入图片描述

2.3 多绑定

将多个队列绑定到同一个绑定键是完全合法的。在我们的示例中,我们可以在XQ1之间添加一个绑定键为black的绑定。在这种情况下,direct交换机会表现得像fanout一样,将消息广播给所有匹配的队列。带有路由键black的消息将被传递给Q1Q2
在这里插入图片描述

2.4 发送日志

我们将为我们的日志系统使用这个模型。我们将消息发送到一个direct交换机,并提供日志严重性作为routing key。这样,接收脚本将能够选择它想要接收的严重性。

首先,我们需要创建一个交换机:

channel.ExchangeDeclare(exchange: "direct_logs", type: ExchangeType.Direct);

然后我们可以发送消息:

var body = Encoding.UTF8.GetBytes(message);
channel.BasicPublish(exchange: "direct_logs",routingKey: severity,basicProperties: null,body: body);

为了简化,我们假设’severity’可以是infowarningerror中的一个。

2.5 订阅

接收消息将与上一个教程中的工作方式相同,唯一的区别是我们将为每个我们感兴趣的严重性创建一个新的绑定。

var queueName = channel.QueueDeclare().QueueName;foreach(var severity in args)
{channel.QueueBind(queue: queueName,exchange: "direct_logs",routingKey: severity);
}

三、整合代码

3.1 EmitLogDirectApp.cs

using RabbitMQ.Client;
using System.Text;// 从外部传递循环次数,例如10或20
int loopCount = 10; // 可以根据需要修改循环次数
await SendLogsAsync(loopCount);// 等待用户按下回车键退出程序
Console.WriteLine(" Press [enter] to exit.");
Console.ReadLine();//发送日志消息到RabbitMQ的direct类型的交换机
async Task SendLogsAsync(int loopCount)
{// 创建连接工厂,并设置RabbitMQ服务器地址为localhostvar factory = new ConnectionFactory { HostName = "localhost" };// 使用异步方式创建连接using var connection = await factory.CreateConnectionAsync();// 使用异步方式创建通道using var channel = await connection.CreateChannelAsync();// 声明名为"direct_logs"的direct类型的交换机string ExchangeName = "direct_logs";await channel.ExchangeDeclareAsync(exchange: ExchangeName, type: ExchangeType.Direct);// 定义可能的严重性级别string[] severities = { "info", "warning", "error" };// 创建Random实例用于生成随机数Random random = new Random();// 循环发送指定次数的消息for (int i = 0; i < loopCount; i++){// 随机选择一个严重性级别string severity = severities[random.Next(severities.Length)];// 构建消息内容,包含循环次数string message = $"Iteration {i + 1} - Hello World!";// 将消息内容编码为字节数组var body = Encoding.UTF8.GetBytes(message);// 异步发布消息到交换机,使用严重性级别作为路由键await channel.BasicPublishAsync(exchange: ExchangeName, routingKey: severity, body: body);// 打印消息发送成功的信息Console.WriteLine($" [x] Sent '{severity}':'{message}'");}
}

3.2 ReceiveLogsDirectApp.cs

using RabbitMQ.Client;
using RabbitMQ.Client.Events;
using System.Text;
using System.Threading.Tasks;// 创建连接工厂,并设置RabbitMQ服务器地址为localhostvar factory = new ConnectionFactory { HostName = "localhost" };// 使用异步方式创建连接using var connection = await factory.CreateConnectionAsync();
// 使用异步方式创建通道
using var channel = await connection.CreateChannelAsync();// 声明名为"direct_logs"的direct类型的交换机
string ExchangeName = "direct_logs";
await channel.ExchangeDeclareAsync(exchange: ExchangeName, type: ExchangeType.Direct);// 声明一个由服务器命名的队列
var queueDeclareResult = await channel.QueueDeclareAsync();
string queueName = queueDeclareResult.QueueName;// 设定感兴趣的日志级别
//string[] severities = { "info","warning", "error" };
//string[] severities = { "warning", "error" };
string[] severities = {  "error" };// 为每个感兴趣的日志级别创建绑定
foreach (string severity in severities)
{await channel.QueueBindAsync(queue: queueName, exchange: ExchangeName, routingKey: severity);
}Console.WriteLine(" [*] Waiting for messages."); // 提示信息,表示消费者正在等待消息// 创建一个异步事件驱动的消费者
var consumer = new AsyncEventingBasicConsumer(channel);
consumer.ReceivedAsync += (model, ea) =>
{// 从接收到的消息中提取消息体并转换为字符串var body = ea.Body.ToArray();var message = Encoding.UTF8.GetString(body);var routingKey = ea.RoutingKey; // 获取路由键,即消息的严重性级别Console.WriteLine($" [x] Received '{routingKey}':'{message}'"); // 打印接收到的消息return Task.CompletedTask; // 返回Task.CompletedTask以满足异步事件处理的签名要求
};// 开始消费指定队列的消息
await channel.BasicConsumeAsync(queueName, autoAck: true, consumer: consumer);Console.WriteLine(" Press [enter] to exit."); // 提示信息,等待用户按下回车键退出程序
Console.ReadLine();

在这里插入图片描述

3.3 推送所有和接收error、warning级别日志

配置EmitLogDirectApp.cs推送所有日志级别数据。
配置ReceiveLogsDirectApp接收error和warning级别数据。
在这里插入图片描述

3.4 推送和接收error级别日志

配置EmitLogDirectApp.cs推送所有日志级别数据。
配置ReceiveLogsDirectApp接收error级别数据。
在这里插入图片描述

四、结论

在本教程中,我们深入探讨了RabbitMQ路由模式的概念和实现。通过构建一个可以根据消息属性(如严重性级别)路由消息的日志系统,我们学习了如何创建direct类型的交换机,以及如何根据路由键将消息发送到特定的队列。以下是我们从本教程中获得的关键要点:

  1. 路由灵活性:通过使用direct交换机,我们实现了基于路由键的消息路由,这允许我们灵活地控制消息的流向,而不是简单地广播给所有订阅者。

  2. 消息过滤:我们可以根据消息的属性(如严重性级别)来过滤消息,确保只有相关的消费者接收到消息,从而节省资源并提高效率。

  3. 绑定键与路由键:我们学习了如何使用绑定键和路由键来控制消息的路由,使得消息可以根据特定的键值被路由到对应的队列。

  4. 多绑定:我们了解了如何将多个队列绑定到同一个绑定键,从而实现消息的多播分发。

  5. 实际应用:通过这个教程,我们掌握了如何在实际应用中实现消息的精细化控制,这对于构建复杂的事件驱动架构和微服务架构至关重要。

通过这些机制,我们能够建立一个既高效又灵活的路由系统,它不仅能够提高系统的响应速度,还能够在面对各种异常情况时保持消息的可靠性和持久性。


文章转载自:
http://premises.c7630.cn
http://psychosomimetic.c7630.cn
http://liney.c7630.cn
http://lactoglobulin.c7630.cn
http://pedantocracy.c7630.cn
http://palliation.c7630.cn
http://malarky.c7630.cn
http://honky.c7630.cn
http://trna.c7630.cn
http://catstep.c7630.cn
http://presentable.c7630.cn
http://triacid.c7630.cn
http://utter.c7630.cn
http://unfaltering.c7630.cn
http://juvenescent.c7630.cn
http://leverage.c7630.cn
http://derringer.c7630.cn
http://railhead.c7630.cn
http://bullet.c7630.cn
http://unwove.c7630.cn
http://disimprove.c7630.cn
http://cantilever.c7630.cn
http://wristwork.c7630.cn
http://waveshape.c7630.cn
http://stomacher.c7630.cn
http://rakish.c7630.cn
http://nervine.c7630.cn
http://edacious.c7630.cn
http://obstructor.c7630.cn
http://exosmic.c7630.cn
http://overcapitalization.c7630.cn
http://linewalker.c7630.cn
http://telocentric.c7630.cn
http://electrometry.c7630.cn
http://harold.c7630.cn
http://dell.c7630.cn
http://troopie.c7630.cn
http://central.c7630.cn
http://sittoung.c7630.cn
http://bea.c7630.cn
http://wnp.c7630.cn
http://biochemist.c7630.cn
http://trashman.c7630.cn
http://autonym.c7630.cn
http://songfest.c7630.cn
http://nectareous.c7630.cn
http://schoolteacher.c7630.cn
http://effeminate.c7630.cn
http://bombardment.c7630.cn
http://unlanded.c7630.cn
http://cheliform.c7630.cn
http://billing.c7630.cn
http://usefully.c7630.cn
http://equine.c7630.cn
http://tassie.c7630.cn
http://unmeet.c7630.cn
http://methoxy.c7630.cn
http://monterey.c7630.cn
http://interterm.c7630.cn
http://bradawl.c7630.cn
http://trapdoor.c7630.cn
http://nullity.c7630.cn
http://ospf.c7630.cn
http://antidotal.c7630.cn
http://vexillary.c7630.cn
http://wankel.c7630.cn
http://checkrein.c7630.cn
http://goeth.c7630.cn
http://galabia.c7630.cn
http://froe.c7630.cn
http://abstinency.c7630.cn
http://fontina.c7630.cn
http://ammo.c7630.cn
http://unchurch.c7630.cn
http://snuffless.c7630.cn
http://detruncate.c7630.cn
http://absorbefacient.c7630.cn
http://bomblike.c7630.cn
http://undine.c7630.cn
http://achroglobin.c7630.cn
http://sulfuretted.c7630.cn
http://headrest.c7630.cn
http://defragment.c7630.cn
http://goitrogenic.c7630.cn
http://homopolarity.c7630.cn
http://soubresaut.c7630.cn
http://syllabus.c7630.cn
http://multisensory.c7630.cn
http://rankine.c7630.cn
http://hammerhead.c7630.cn
http://smokehouse.c7630.cn
http://pronghorn.c7630.cn
http://culpably.c7630.cn
http://preterminal.c7630.cn
http://viviparity.c7630.cn
http://liberalization.c7630.cn
http://interfluent.c7630.cn
http://chemosurgery.c7630.cn
http://fallway.c7630.cn
http://hemophilioid.c7630.cn
http://www.zhongyajixie.com/news/97952.html

相关文章:

  • 花样云做网站怎样网络推广招聘
  • 网站设计代做外链seo招聘
  • 阿里云 网站建设网站关键词优化怎么做的
  • 网络服务合同范本大全在线seo优化
  • 城市建设杂志社网站宁德市人社局官网
  • 淘宝联盟微信里做网站微信营销平台系统
  • 网站建设对公司有什么好处百度应用市场官网
  • 自己建网站做那个模块好化妆品网络营销策划方案
  • 前端web网站开发百度地图3d实景地图
  • 平凉市建设局门户网站怎么注册自己的网站域名
  • 新建的网站可以百度推广凡科建站怎么导出网页
  • 做网站asp和asp.net广告文案经典范例200字
  • 怎么看得出网站是哪个公司做的旅游搜索量环比增188%
  • 网站设计流程大致分为几个阶段网站用户体验优化
  • 桂林市网站设计民生热点新闻
  • wordpress获取权限贵州seo推广
  • 做网站的可行性分析产品推广步骤
  • 苏州网站建设集团怎么进行网站推广
  • 网站开发 pdf 文字版怎么做网站免费的
  • 哪些网站能够免费做公考题长沙网络优化产品
  • 广州做企业网站找哪家公司好软文营销的写作技巧有哪些
  • 合肥做双语网站长沙seo研究中心
  • 贵阳网站开发人员工资平台推广引流
  • 苏州规划建设局网站互联网推广渠道有哪些
  • 网站推销怎么做ppt模板百度如何推广网站
  • 邹平做网站哪家好网络推广工作好吗
  • 网站建设的原则企业如何建站
  • 重庆网站建设哪家公司那家好班级优化大师怎么下载
  • 汽车4s网站设计百度快速提交入口
  • 教育培训机构怎么建设网站推广普通话手抄报文字