• RabbitMQ基本模式


       最近用到了一些RabbitMQ的东西,看了官方的Get Started,以此为模板总结一下。


            (1)生产者(发送方)发送消息到ExChange(含参:routingkey),ExChange通过bindingkey确定消息传入哪一个Queue,消费者(接收方)通过监听Queue来获取消息。

               其中需要注意的是:生产者(Producer)永远不会向队列(Queue)直接发送消息。

            (2)ExChange通过BindKey来和Queue进行关联保定的,Binding表示一种Exchange服务器和Queue之间的关系,或者说QueueExchange服务器中的内容感兴趣。

            (3)通过上面可以知道,生产者是将消息发送给ExChange服务器的,但是ExChange服务器是怎么知道如何处理这些Message呢,是通过ExChange Type,ExChange Type主要有四类:

    •                     direct:消息会流向bindingkey和routingkey相同的队列;
    •                     topic:topic消息的routingkey必需有多个单词,单词间以“.”间隔,比如:stock.usd.nyse。发送消息伴随一个特定的routingkey,他会发送给所有满足bindingkey的队列
    •                     fanouts:广播消息给所有知道的队列
    •                     headers:通过头部信息进行匹配(这种方式在Get Started中没有详细提及)

            (4)其常见的消息分发模型如下:

                        1.简易的一对一的生产者消费者模型


                        2.一对多的工厂模型,其主要需要注意的点是默认为公平分配,即C1、C2两个消费者拿到的东西是一样多的,其需要设置prefetch_count来改变这种情况。 


          3.订阅/发布模式,其采用一种广播模式进行对已知的队列进行消息发送。


                        3.direct这种确定值的路由状态,即routingkey为orange的消息,只会发送到与Exchange的Bindingkey为orange的队列中,而,在fanout广播下会忽略这些值(orange,black等)。

                            即:其如果routingkey都一致,都是black,那么Exchange收到的所有routingkey为black的消息都会发送给Q1、Q2两个队列。这样就已经不具备Direct确定路由的特性了,这种情况就和fanout广播的原理一样了,如下:


                        4.还有这种通配符模型(TOPIC),以及其类似的指定模型(DIRECT),topic模型是最具有变换性质的模型,其通过“*”和“#”两种配置符号进行EXCHANGE和QUEUE的绑定,能够通过特定的routingkey绑定方式实现DIRECT和FANOUTS类型。

          (1)topic模式下的routingkey,必须由一系列的单词组成,单词之间以“.”间隔,比如:stock.usd.nyse;

          (2)topic有两种通配符: * 标示一个单词,# 标示零个或多个单词  (Y.X.Z,单词是以.来确定的,Y、X、Z即为三个单词)

           比如这种情况下:

    消息的RoutingKey 会接收消息的通道编号
    quick.orange.rabbit Q1、Q2
    lazy.orange.fox Q1、Q2
    lazy.orange.male.rabbit Q2

            需要注意的是,如果routingkey匹配了该通道的多条bindingkey,消息也不会多次发送,另外:

    •         如果所有通道的bindingkey都是#,那么这种模式下的topic就和fanout一样了;
    •         如果所有通道的bindingkey都不包含*和#,那么这种模式下的topic和direct一样了。

                        5.还有一种RPC,远程服务型,其能够实现消息回调,即客户端通过RabbitMQ访问服务端,服务端接收到消息后,再返回信息给客户端,其由函数ConvertSendandReceive()实现,具体过程如下:

                        可以看到其发送的消息有一些参数:

    •                             deliveryMode:if=2 - persistenet else - transient
    •                             contentType:数据类型,比如:application/json
    •                             replyto:用于标示回调通道名称
    •                             correlation_id:标识请求和回复

                        如上图:其客户端发送了reply_to=amqp.gen-x a2... 那么服务端回复的通道就是amqp.gen-xa2....

                        客户端接收到了服务端发回来的coorelation_id,与自己发出的进行匹配,成功则标示消息已经被消费。

  • 相关阅读:
    一步一步学Silverlight 2系列(23):Silverlight与HTML混合之无窗口模式
    一步一步学Silverlight 2系列(25):综合实例之Live Search
    一步一步学Silverlight 2系列(19):如何在Silverlight中与HTML DOM交互(上)
    一步一步学Silverlight 2系列(13):数据与通信之WebRequest
    一步一步学Silverlight 2系列(17):数据与通信之ADO.NET Data Services
    一步一步学Silverlight 2系列(24):与浏览器交互相关辅助方法
    一步一步学Silverlight 2系列(22):在Silverlight中如何用JavaScript调用.NET代码
    一步一步学Silverlight 2系列(27):使用Brush进行填充
    一步一步学Silverlight 2系列(16):数据与通信之JSON
    一步一步学Silverlight 2系列(14):数据与通信之WCF
  • 原文地址:https://www.cnblogs.com/rekent/p/9414470.html
Copyright © 2020-2023  润新知