西安营销型网站建设动力无限,购物国外网站的建立,网站开发营业执照申请,营销型网站制作RabbitMQ基本术语
相关概念; 生产者#xff08;Producer#xff09;#xff1a;投递消息。消息#xff1a;消息体#xff08;payload#xff09;标签#xff08;label#xff09;#xff1b;生产者把消息交给rabbitmq#xff0c;rabbitmq会根据标签把消息发给感兴趣…RabbitMQ基本术语
相关概念; 生产者Producer投递消息。消息消息体payload标签label生产者把消息交给rabbitmqrabbitmq会根据标签把消息发给感兴趣的消费者。
消息体带业务逻辑的数据标签表述这条消息一个交换器的名称或者一个路由键。
消费者Consumer接收消息。连接rabbitmq服务器订阅到队列上。消费消息体。消息路由过程中消息的标签会丢弃消息体存入队列
服务节点Broker一个broker可以看作一个rabbitmq服务节点或者rabbitmq服务实例。
队列Queuerabbitmq内部对象用于存储消息。消息只能存在队列中。多个消费者可以订阅同一个队列这时队列中的消息会被平均分摊给多个消费者处理轮询而不是每个消费者都收到所有的消息并处理。
交换器Exchange生产者将消息发送到Exchange由交换器将消息路由到一个或多个队列中如果路由不到或许会返回给生产者或许直接丢弃。
路由键RoutingKey生产者将消息发给交换器的时候一般会指定一个RoutingKey用来指定这个消息的路由规则这个routingkey需要与交换机类型和绑定键联合使用才能最终生效。
绑定Binding交换器和队列通过绑定关联起来在绑定的时候一般会指定一个绑定键这样就知道如何正确的将消息路由到队列了 生产者将消息发送给交换器时需要RoutingKey当BindingKey和RoutingKey相匹配时消息会被路由到对应的队列中。绑定多个队列到同一个交换器的时候这些绑定允许使用相同的BindingKey。
例如
交换器相当于投递包裹的邮箱RoutingKey相当于填写在包裹上的地址BindingKey相当于包裹的目的地当地址和实际想要的投递的地址匹配正确投递到目的地最后这个目的地的主人-队列可以保留这个包裹地址不匹配不能正确投递可能退回也可能被丢弃
交换器类型
fanout
会把所有发送到该交换器的消息路由到所有与该交换器绑定的队列中
direct
会把消息路由到那些BindingKey和RoutingKey完全匹配的队列中。
topic
将消息路由到BindingKey和RoutingKey想匹配的队列中但匹配规则有些不同
RoutingKey为“.”分割的字符串分隔的每一段独立的字符串成为一个单词BindingKey和RoutingKey一样也是“.分隔的字符串BindingKey中可以存在了两种特殊字符串”*“和”#“用于做模糊匹配
headers
根据发送的消息内容中的headers属性进行匹配
RabbitMQ运转流程
生产者发送消息
生产者连接到rabbitmq broker建立一个连接开启一个信道生产者声明一个交换器并设置相关属性交换机类型是否持久化生产者声明一个队列并设置相关属性是否排他是否持久化等生产者通过路由键将交换器和队列绑定起来生产者发送消息至rabbitmq broker包含路由键交换器等响应的交换器根据接收到的路由键查找相匹配的队列如果找到则将从生产者发送过来的消息存入相应的队列中如果没有找到根据生产者配置的属性选择丢弃还是回退给生产者关闭信道关闭连接
消费者消费
消费者连接到rabbitmq broker 建立一个连接开启一个信道消费者向rabbitmq broker请求消息相应队列中的消息可能会设置相应的回调函数以及做一些准备工作等待rabbitmq broker回应并投递相应队列中的消息消费者接收消息消费者确认ack接收到的消息rabbitmq从队列中删除相应已经被确认的消息关闭信道关闭连接
RabbitMQ 处理每条AMQP指令都是通过信道完成的信道是建立在Connection上的虚拟连接就是生产或者消费者与broker建立的tcp连接。
AMQP协议
RabbitMQ就是AMQP协议的Erlang实现RabbitMQ是AMQP协议的erlang实现AMQP的模型架构也是生产者将消息发送给交换器交换器和队列绑定当生产者发送消息时所携带的RoutingKey与绑定时的BindingKey相匹配时消息被存入相应队列中消费者可以订阅相应的队列来获取消息。
AMQP协议
Module Layer协议最高层主要定义了一些供客户端调用的命令客户端可以利用这些命令实现自己的业务逻辑例如客户端可以使用Queue.Declare命令声明一个队列或者使用Basic.consume订阅消费一个队列中的消息Session Layer位于中间层主要负责客户端的命令发送给服务器再将服务端的应答返回给客户端主要为客户端与服务器之间的通信提供可靠性同步机制和错误处理Transport Layer位于最底层主要传输二进制数据流提供帧的处理、信道复用、错误检测和数据表示等。
生产者流转过程
客户端与broker建立连接调用factory.newConnectionbroker返回Connection.Start建立连接 涉及命令;Connection.Start/.Start-OK、Connection.Tune/.Tune-Ok、Connection.Open/.open-Ok 客户准备开启信道调用connection.createChannel 命令Channel.Open,Channel.Open-Ok 客户端发送消息调用channel.basicPublish 命令Basic.Publish
消费者流转过程
客户端与broker建立连接调用factory.newConnectionbroker返回Connection.Start建立连接 涉及命令;Connection.Start/.Start-OK、Connection.Tune/.Tune-Ok、Connection.Open/.open-Ok 客户准备开启信道调用connection.createChannel 命令Channel.Open,Channel.Open-Ok 消费之前调用channel.basicQos(int prefetchCount)方法设置消费者客户端最大能保持的未确认的消息数 命令Basic.Qos/.Qos-Ok 真正消费前消费者客户端需要向broker发送Basic.Consume命令将channel置为接收模式之后broker回执basic.Consume-Ok告诉准备好了消费者接收到消息并正确消费后向broker发送确认 命令Basic.Ack 消费者停止消费主动关闭连接 Chanel.Close/.Close-Ok和Connection.Close/.Close-Ok
参考《RabbitMQ实战指南》