博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

rabittmq详解

Posted on 2019-11-20 22:09  qinggg  阅读(624)  评论(0)    收藏  举报

交换机(exchange):  

           声明交换机:

                 Name

                 Durability (消息代理重启后,交换机是否还存在)

                 Auto-delete (当所有与之绑定的消息队列都完成了对此交换机的使用后,删掉它)

                 Arguments(依赖代理本身)

                

           交换机状态: 持久(durable)、暂存(transient) 

          

           交换机类型:

                 直连交换机(direct exchange): (empty string) and amq.direct/名字绑定到同名的队列

                 默认交换机(=direct exchange): empty string/名字为""的直连交换机

                 扇型交换机(fanout exchange): amq.fanout/交换机会将消息的拷贝分别发送给这所有的N个队列

                 主题交换机(topic exchange): amq.topic/路由键和队列到交换机的绑定模式之间的匹配,将消息路由给一个或多个队列。

                 头交换机(headers exchange): amq.match/headers头

     

      队列(queue):

           声明队列:

                 Name

                 Durable(消息代理重启后,队列依旧存在)

                 Exclusive(只被一个连接(connection)使用,而且当连接关闭后队列即被删除)

                 Auto-delete(当最后一个消费者退订后即被删除)

                 Arguments(一些消息代理用他来完成类似与TTL的某些额外功能)

           队列状态:

                 持久化队列(Durable queues):broker重启的时候,它依旧存在

                 暂存队列(Transient queues):

                

      绑定(Binding): 交换机(exchange)将消息(message)路由给队列(queue)所需遵循的规则   

           如果AMQP的消息无法路由到队列(例如,发送到的交换机没有绑定队列),消息会被就地销毁或者返还给发布者。

     

      *消息确认:

           confirm模式:

                 将信道设置成confirm模式(发送方确认模式),则所有在信道上发布的消息都会被指派一个唯一的ID。

                 一旦消息被投递到目的队列后,或者消息被写入磁盘后(可持久化的消息),信道会发送一个确认给生产者(包含消息唯一ID)。

                 如果RabbitMQ发生内部错误从而导致消息丢失,会发送一条nack(not acknowledged,未确认)消息。

                 发送方确认模式是异步的,生产者应用程序在等待确认的同时,可以继续发送消息。当确认消息到达生产者应用程序,生产者应用程序的回调方法就会被触发来处理确认消息。

          

           避免重复:

                 在消息生产时,MQ内部针对每条生产者发送的消息生成一个inner-msg-id,作为去重的依据(消息投递失败并重传),避免重复的消息进入队列;

                 在消息消费时,要求消息体中必须要有一个bizId(对于同一业务全局唯一,如支付ID、订单ID、帖子ID等)作为去重的依据,避免同一条消息被重复消费。

 

           (1)当拒绝某条消息时,应用可以告诉消息代理如何处理这条消息——销毁它或者重新放入队列。

           (2)当此队列只有一个消费者时,请确认不要由于拒绝消息并且选择了重新放入队列的行为而引起消息在同一个消费者身上无限循环的情况发生。

      消息(最大64b):

           Content type(内容类型)

           Content encoding(内容编码)

           Routing key(路由键)

           Delivery mode (persistent or not)

           投递模式(持久化 或 非持久化)

           Message priority(消息优先权)

           Message publishing timestamp(消息发布的时间戳)

           Expiration period(消息有效期)

           Publisher application id(发布应用的ID)

          

      虚拟主机(virtual hosts):

           为了在一个单独的代理上实现多个隔离的环境,当连接被建立的时候,AMQP客户端来指定使用哪个虚拟主机    

          

      use API:          

           Basic:

                 basic.publish(): 发送消息

                 basic.ack(): 对一条或多条消息发布成功与否进行确认

                 basic.cancel():

                 basic.consume():

                 basic.deliver():

                 basic.get(): 直接访问队列

                 basic.nack(): 被拒绝的是否重新入队列

                 basic.qos(): Quality of Service服务质量,告诉RabbitMQ不要同时给一个消费者推送多于N个消息,即一旦有N个消息还没有ack,则该consumer将block掉,直到有消息ack

                 basic.recover(): 重入队列,是否发送给同一个消费者

                 basic.recover-async():

                 basic.reject(): 被拒绝的是否重新入队列

                 basic.return():

                

           Exchange:  

                 exchange.bind(): 此方法为RabbitMQ特有的AMQP扩展将两个交换机进行绑定。    

                 *exchange.declare(): 验证交换机是否存在,不存在则新建,存在则使用。  

                 exchange.delete(): 此方法用于删除交换机。当一个交换机被删除后,与其绑定的所有队列都会被清除。

                 exchange.unbind(): 此方法为RabbitMQ特有的AMQP扩展解除两个交换机之间的绑定关系。

                

           Queue: 

                 queue.bind(): 将队列绑定到交换机。

                 *queue.declare(): 声明队列,如果队列不存在创建,存在则使用。

                 queue.delete(): 删除队列。如果服务器设置了死信队列(dead-letter queue),当队列被某个删除时,

                      任何依存于此队列的消息都会被发送到死信队列中,队列上的所有消费者都会被清除掉。

                 queue.purge(): 清空队列。此方法会将队列中的所有不处于等待 确认回执(acknowledgment)状态的消息全部移除。

                 queue.unbind(): 解除队列与交换机的绑定。

                

           *生命周期: 这个扩展决定了一条消息从发布到被服务器丢弃的生存时间。此方法中设置生存时间的参数为 x-message-ttl。 

           *过期时间: 队列可以在声明时指定租约时限。租约时限指的是如果队列一直未被使用,多久之后服务器会将其自动删除。租约时限由此方法的x-expires参数指定。 

          

           Tx(事务):

                 tx.commit() ➔ commit-ok: 提交事务。

                 tx.rollback() ➔ rollback-ok: 回滚事务。

                 tx.select() ➔ select-ok: 选择标准事务模式。

          

           消息丢失、重复:

                 发送阶段:

                      (1)事务批量回滚。

                      (2)开启消息确认confirm模式,同步可重发固定次数,超过次数手动处理,异步可以用db记录发送数据,若为nack时重发并记录重发次数。

                 队列阶段:

                      防止机器挂掉,将交换机、队列、消息全部持久化到磁盘。

                 消费阶段:

                      (1)若消息发送到mq后由于网络波动,发送者未收到确认,可能触发重试机制导致队列存在消息重复。

                      (2)消息重复:

                            a.消息源多条: 采用消息唯一识别码,db数据库建唯一主键、使用redis原子操作、db记录消息处理状态。

                            b.消费时,已将消息消费未来得及返回ack时出现异常,改为手动ack,try异常后查询数据库订单状态是否改变。