当前位置:网站首页 / C#开发 / 正文

ay的RabbitMQ研究报告-第2章

时间:2016年05月30日 | 作者 : aaronyang | 分类 : C#开发 | 浏览: 1530次 | 评论 0

AMQP消息标准

消息队列,两个角色,发布者与消费者

消息代理(Message Broker) 收 发布者的客户端发送的消息,然后broker 把消息路由给消费者的客户端。

Exchange 英文是交易场所的意思,你可以理解为 队列的生产与消费的场所,你就理解为邮箱就行了。

Exchange通过不同的规则发送消息给队列(规则由binding定义)

这几个知识点就是消息代理了。


消息代理会把消息发给消费者(消费者pull 拉取数据),这些消费者是订阅在队列上的。消息具有特性,发布者可以指定。代理会去根据特性处理给消费者。

由于网路不可靠性。因此AMQP有个消息通知的机制。当消费者,消费吊一条消息,broker就会收到通知,消费完了,就会删除消息。


如果你正在通过RoutingKey的Route,并且消息没有消费者。消息就会被返回给发送方,或者删除。如果你配置了,也可以把消息放到被监视的死信队列里面。发布程序将会决定如果处理这种类型的消息。


Exchange

Exchange是AMQP的实体,这个实体用来把消息发送到消息代理上,类似封装。

Exchange可以把一个消息 路由到1个或者多个队列上。具体怎么路由的规则,路由规则是依赖于你使用的Exchange类型。不同的exchange规则被称作binding,绑定。

RabbitMQ支持AMQP 0-9-1 brokers(支持4种Exchange type的),比如direct exchanges,fanout exchanges,topic exchanges,headers exchanges


每一种exchange都有不同数量的特性声明。它们之间对我们来说最重要的如下:

Name: exchange的名字

Durability:消息存多久

Auto-delete:当所有的队列使用完了,是否删除exchange

Arguments:代理依赖的参数消息。




Direct Exchange

blob.png

任何发送到Direct Exchange的消息都会被转发到RouteKey中指定的Queue。

1.一般情况可以使用rabbitMQ自带的Exchange:”"(该Exchange的名字为空字符串,下文称其为default Exchange)。

2.这种模式下不需要将Exchange进行任何绑定(binding)操作

3.消息传递时需要一个“RouteKey”,可以简单的理解为要发送到的队列名字。

4.如果vhost中不存在RouteKey中指定的队列名,则该消息会被抛弃。




Fanout Exchange

blob.png


任何发送到Fanout Exchange的消息都会被转发到与该Exchange绑定(Binding)的所有Queue上。

1.可以理解为路由表的模式

2.这种模式不需要RouteKey

3.这种模式需要提前将Exchange与Queue进行绑定,一个Exchange可以绑定多个Queue,一个Queue可以同多个Exchange进行绑定。

4.如果接受到消息的Exchange没有与任何Queue绑定,则消息会被抛弃


可以完成类似广播的功能。

场景:

发送游戏分数给所有在线的游戏玩家。

发送天气情况给所有的系统

一组人的聊天的 会话





Topic Exchange

blob.png


任何发送到Topic Exchange的消息都会被转发到所有关心RouteKey中指定话题的Queue上


1.这种模式较为复杂,简单来说,就是每个队列都有其关心的主题,所有的消息都带有一个“标题”(RouteKey),Exchange会将消息转发到所有关注主题能与RouteKey模糊匹配的队列。

2.这种模式需要RouteKey,也许要提前绑定Exchange与Queue。

3.在进行绑定时,要提供一个该队列关心的主题,如“#.log.#”表示该队列关心所有涉及log的消息(一个RouteKey为”MQ.log.error”的消息会被转发到该队列)。

4.“#”表示0个或若干个关键字,“*”表示一个关键字。如“log.*”能与“log.warn”匹配,无法与“log.warn.timeout”匹配;但是“log.#”能与上述两者匹配。

5.同样,如果Exchange没有发现能够与RouteKey匹配的Queue,则会抛弃此消息。


blob.png

可以按照它自定义的#或者*号,完成类似正则表达式的规则,找到合适的队列,然后把消息发送过去。

场景:

发送消息给某些部门、比如all.*.* 例如 all.jishu.group1就可以收到

股票,按照公司分组的,把价格推送过去。

新闻推送等。


Headers Exchange

blob.png

类似 特性过滤,如图:发送给headers exchange的特性是material=wood type=cupboard的特性,如果队列的特性也是这个,那么他们就符合路由规则,消息就可以发送到这个队列上了。下面一个exchange也是这个道理。

Headers Exchange可以做Direct Exchange的事情。所以Headers Exchange不是根据routing key来判断的,所以不需要这个值。只需要Header value


其实除了上面四种以外还有一种Default Exchange,它是一种特别的Direct Exchange。

当你手动创建一个队列时,后台会自动将这个队列绑定到一个名称为空的Direct类型交换机上,绑定路由名称与队列名称相同。有了这个默认的交换机和绑定,我们就可以像其他轻量级的队列,如Redis那样,直接操作队列来处理消息。不过只是看起来是,实际上在RabbitMQ里直接操作是不可能的。消息始终都是先发送到交换机,由交换级经过路由传送给队列,消费者再从队列中获取消息的。不过由于这个默认交换机和路由的关系,使我们只关心队列这一层即可,这个比较适合做一些简单的应用,毕竟没有发挥RabbitMQ的最大功能,如果都用这种方式去使用的话就真是杀鸡用宰牛刀了。


====================www.ayjs.net 杨洋 wpfui.com ayui ay aaronyang=======请不要转载谢谢了。=========



Queues

在Exchange之上还有下面额外属性

Name:名字

Durable:持久化,比如broker重启或者服务器重启。

Exclusive:队列只能用于1个连接,当collection关闭,队列将会被删除。

Auto Delete:队列是否自动删除,如果消费者或者订阅用户 取消订阅,是否自动删除。

在使用队列之前,队列必须被声明,如果队列不存在,就会创建一个新的,如果队列已经存在,就会重新声明这个队列,对已经存在的队列没有任何影响。

队列的名字:0-255个字符长度。如果你想要broker为你挑选名字,你只要声明个队列不提供名字就行了。

队列数据可以持久化到硬盘去。这就意味着一旦broker重启,队列就会重新声明。如果你想消息也持久化,你可以post个持久化的message。

队列开启持久化会增加服务器额外的开销,你自己决定是否开启。


Bindings

定义个rule,指挥消息发送到对应适合类型的Exchange上。

Exchange和queue之间关系被称为binding(绑定)


消费者

就是客户端,使用消息的。


消息回馈,客户端可能由于服务器连接超时,客户端可能拒绝消息了。



====================www.ayjs.net       杨洋    wpfui.com        ayui      ay  aaronyang=======请不要转载谢谢了。=========


















推荐您阅读更多有关于“RabbitMQ,”的文章

猜你喜欢

额 本文暂时没人评论 来添加一个吧

发表评论

必填

选填

选填

必填

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

  查看权限

抖音:wpfui 工作wpf,目前主maui

招聘合肥一枚WPF工程师,跟我一个开发组,10-15K,欢迎打扰

目前在合肥市企迈科技就职

AYUI8全源码 Github地址:前往获取

杨洋(AaronYang简称AY,安徽六安人)AY唯一QQ:875556003和AY交流

高中学历,2010年开始web开发,2015年1月17日开始学习WPF

声明:AYUI7个人与商用免费,源码可购买。部分DEMO不免费

不是从我处购买的ayui7源码,我不提供任何技术服务,如果你举报从哪里买的,我可以帮你转正为我的客户,并送demo

查看捐赠

AYUI7.X MVC教程 更新如下:

第一课 第二课 程序加密教程

标签列表