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

网上网站怎么做友情链接外链

网上网站怎么做,友情链接外链,大连手机网站开发,江苏省建设工程造价管理协会网站理清路由机制是了解RabbitMQ来龙去脉的关键。在前面的例子中我们常常遇见这三个概念:exchange,routingKey 和 queue。真正地消息传输流程是消息先到exchange,然后exchange根据对应的routingKey放入queue,如果routingKey不匹配则丢…

 

理清路由机制是了解RabbitMQ来龙去脉的关键。在前面的例子中我们常常遇见这三个概念:exchange,routingKey 和 queue。真正地消息传输流程是消息先到exchange,然后exchange根据对应的routingKey放入queue,如果routingKey不匹配则丢弃。网上网友的一张图很好的展示了这个流程:

 

rabbitmq 学习-8- Exchange Queue RoutingKey关系说明 - micro sun - 学无止境

 

0.9 版本的AMQP协议的exchange有如下4中类型:fanout,direct,topic 和 headers。RabbitMQ服务会在启动以后预先建立4个exchange,分别对应于4中类型:

 

image

 

默认的exchange

如果用空字符串去申明一个exchange,那么系统就会使用"amq.direct"这个exchange。我们在创建一个queue的时候,默认的都会有一个和新建queue同名的routingKey绑定到这个默认的exchange上去。就像我们在发送和接收例子中,发送者的发送代码:

channel.BasicPublish("", "TaskQueue", properties, bytes);

因为在第一个参数选择了默认的exchange,而我们申明的队列叫TaskQueue,所以默认的,它在新建一个也叫TaskQueue的routingKey,并绑定在默认的exchange上,导致了我们可以在第二个参数routingKey中写TaskQueue,这样它就会找到定义的同名的queue,并把消息放进去。

 

Direct Exchange

direct exchange 发送消息是要看routingKey的。举个例子,定义了一个direct exchange 名字是X1,然后一个queue名字为Q1 用routingKey=K1 绑定到exchange X1上,当一个routeKey为 K2 的消息到达X1上,那么只有K1=K2的时候,这个消息才能到达Q1上。代码例子如下:

 

channel.ExchangeDeclare("X1", "direct");
channel.QueueDeclare("Q1", true, false, false, null);
channel.QueueBind("Q1", "X1", "K1");
channel.BasicPublish("X1", "K1", null, bytes);

 

这样Q1才能收到消息。

如果有两个接收程序都是用了同一个的queue和相同的routingKey去绑定direct exchange的话,分发的行为是负载均衡的,也就是说第一个是程序1收到,第二个是程序2收到,以此类推。

如果有两个接收程序用了各自的queue,但使用相同的routingKey去绑定direct exchange的话,分发的行为是复制的,也就是说每个程序都会收到这个消息的副本。行为相当于fanout类型的exchange。

官方图片展示direct exchange:

image

 

Fanout Exchange

fanout类型的exchange就比较好理解。就是简单的广播,而且是忽略routingKey的。所以只要是有queue绑定到fanout exchange上,通过这个exchange发送的消息都会被发送到那些绑定的queue中,不管你有没有输入routingKey。

您可以需要广播消息或分布式系统的消息同步等场景中广泛使用到它。

官方图片展示:

image

 

 

Topic Exchange

Topic类型的exchange给与我们更大的灵活性。通过定义routingKey可以有选择的订阅某些消息,此时routingKey就会是一个表达式。exchange会通过匹配绑定的routingKey来决定是否要把消息放入对应的队列中。有两种表达式符号可以让我们选择:#和*。

*(星号):代表任意的一个词。 例:*.a会匹配a.a,b.a,c.a等

#(井号):代码任意的0个或多个词。 例:#.a会匹配a.a,aa.a,aaa.a等

topic exchange 有时候的行为会像其他类型的exchange,比如说:

当routingKey只是有#号的时候,它的行为和fanout的行为是一样的。

当routingKey什么的没有,空字符串的时候,它的行为是和direct是一样的。

 

要注意的是,符号代表的是词不是字符。RabbitMQ中在表达式中词的定义是以.(点号)分隔的。

 

对于一个queue绑定到exchange,是可以多次绑定的:

channel.QueueBind(queue_name, "X1", "lazy.#");
channel.QueueBind(queue_name, "X1", "*.*.rabbit");
 

如上面的代码,表示这个queue即可以收lazy.开头的,又可以收.rabbit结尾的。

大家可以通过一些测试来理解这里面的规则,但是在测试的时候需要注意,每次修改表达式后,需要重置一下RabbitMQ。因为是可以多次绑定的,所以之前你改的所有的表达式都会记录下来,都会被尝试匹配。

重置的命令(RabbitMQ以控制台的形式运行):

image

 

Headers Exchange

Headers类型的exchange使用的比较少,它也是忽略routingKey的一种路由方式。是使用Headers来匹配的。Headers是一个键值对,可以定义成Hashtable。发送者在发送的时候定义一些键值对,接收者也可以再绑定时候传入一些键值对,两者匹配的话,则对应的队列就可以收到消息。匹配有两种方式all和any。这两种方式是在接收端必须要用键值"x-mactch"来定义。all代表定义的多个键值对都要满足,而any则代码只要满足一个就可以了。之前的几种exchange的routingKey都需要要字符串形式的,而headers exchange则没有这个要求,因为键值对的值可以是任何类型。代码示例如下:

发送端:

channel.ExchangeDeclare("X1", "headers");
 
IBasicProperties properties = channel.CreateBasicProperties();
properties.Headers = new Hashtable();
properties.Headers.Add("Key1", 123);
properties.Headers.Add("Key2", 345);
 
XmlSerializer xs = new XmlSerializer(typeof(RequestMessage));
MemoryStream ms = new MemoryStream();
xs.Serialize(ms, message);
byte[] bytes = ms.ToArray();
 
channel.BasicPublish("X1", "", properties, bytes);

接收端:

channel.ExchangeDeclare("X1", "headers");
//随机创建一个队列
string queue_name = channel.QueueDeclare("headerssubscriber2", true, false, false, null);
//绑定
IDictionary ht = new Hashtable();
ht.Add("x-match", "any");
ht.Add("Key1", 12345);
ht.Add("Key2", 34567);
channel.QueueBind(queue_name, "X1", "", ht);
//定义这个队列的消费者
QueueingBasicConsumer consumer = new QueueingBasicConsumer(channel);
channel.BasicConsume(queue_name, true, consumer);
 
while (true)
{
    BasicDeliverEventArgs ea =
        (BasicDeliverEventArgs)consumer.Queue.Dequeue();
 
    byte[] bytes = ea.Body;
 
    XmlSerializer xs = new XmlSerializer(typeof(RequestMessage));
    using (MemoryStream ms = new MemoryStream(bytes))
    {
        RequestMessage message = (RequestMessage)xs.Deserialize(ms);
        Console.WriteLine("Receive a Message, Id:" + message.MessageId + " Message:" + message.Message);
    }
}

 

点击这里下载测试代码

http://www.lbrq.cn/news/2460259.html

相关文章:

  • 大连网站排名优如何去推广一个app
  • 凡客vancl的网站标题淘宝指数入口
  • 东方市住房和城乡建设局网站网络培训seo
  • 南沙规划建设局网站饥饿营销案例
  • 途牛电子商务网站建设人民网 疫情
  • 环保网页设计素材厦门seo优化推广
  • 接单做网站如何制作自己的网页链接
  • 企业门户网站服务器网站seo最新优化方法
  • wordpress screen廊坊seo管理
  • 景区网站建设的意义谷歌seo网站运营
  • 仙居微信网站开发陕西优化疫情防控措施
  • 国外服务器购买seo免费教程
  • 深圳企业网站建设推广服务网络营销工资一般多少
  • 办公室装修方案郑州seo网络推广
  • 网络科技公司骗术seo成功的案例和分析
  • html导航网站源码深圳百度竞价推广
  • 网站商城建设视频教程排名优化外包公司
  • 用jsp做婚纱网站的流程网站优化排名软件网站
  • 厦门网站建设工作室网站内容优化方法
  • 东阳网站建设有哪些seo培训一对一
  • 中国党风廉政建设网站by网站域名
  • 郑州哪家公司做网站好菏泽百度推广公司电话
  • 馆陶网站建设价格代码编程教学入门
  • 南浔城乡建设局网站最新网站查询工具
  • 上海服装集团网站建设app线下推广怎么做
  • 2核4G服务器wordpressseo推广公司价格
  • 网站关键词和网页关键词的样本泉州百度网站推广
  • 如何成立一家公司合肥seo
  • 劳务网站怎样做百度世界排名
  • wordpress站群管理seo黑帽有哪些技术
  • 最优估计准则与方法(4)最小二乘估计(LS)_学习笔记
  • 服务器之光:Nginx--核心配置详解及演练
  • Item14:在资源管理类中小心拷贝行为
  • 前端基础知识Vue系列 - 29(怎么处理vue项目中的错误)
  • k8s之控制器详解
  • 【MySQL】深入浅出事务:保证数据一致性的核心武器