rabbitmq使用方式

rabbitmq使用方式

二月 23, 2019 阅读 86 字数 1690 评论 0 喜欢 0

最近遇到个问题,mq偶发性会丢失消息,mq一直都在用,也在断断续续地学习中,但是一直没把他的工作模式弄得清清楚楚,其中比较模糊的部分是生产者和消费者各种声明方式的差别

现就以队列为索引,深入学习mq使用方式,可以将他的工作模式分为五种:

1 简单队列: 一个producer对应一个consumer,这个感觉用的比较少

producer:queueDeclare()->basicPublish(),里面的参数全为false或者null

consumer:queueDeclare()->basicConsume()->whileLoop(consume),和producer一样,,里面的参数全为false或者null

2 work模式:一个producer对应多个消费者,但每个消息只会传给其中的某个消费者,相当于消费者是竞争的关系

与简单队列的声明方式一样,只是consumer变为了多个,并且为了负载均衡,能者多劳,在调用basicConsume()前调用basicQos(1)让消费快的获取更多的消息

3 发布/订阅模式:使用较多的方式,一个消费者将消息首先发送到交换器,交换器绑定到多个队列,然后被监听该队列的消费者所接收并消费。如果消息发送到没有队列绑定的交换器时,消息将丢失,因为交换器没有存储消息的能力,消息只能存储在队列中。同一个交换器可以同时被多个队列绑定,服务器会把消息复制多份,给每个队列一条消息

producer:exchangeDeclare(…, “fanout”)->basicPublish()声明交换器后就可以直接publish了,它的消息会投递到绑定了该交换器的consumer对队列里

consumer:queueDeclare()->queueBind()->basicQoS(1)->basicConsume()->whileLoop(consume)绑定队列时指定队列和交换器名字

4 路由模式:生产者将消息发送到direct交换器,在绑定队列和交换器的时候有一个路由key,生产者发送的消息会指定一个路由key,那么消息只会发送到相应key相同的队列,接着监听该队列的消费者消费消息。

producer:exchangeDeclare(…, “direct”)->basicPublish(.., “update”, …)只有在绑定队列时声明了”update”才能收到消息

consumer:queueDeclare()->queueBind(…,”update”)->basicQos(1)->basicConsume()->whileLoop(consume)

5 主题模式

producer:exchangeDeclare(…, “topic”)->basicPublish(…, “update.Name”, …)

consumer:queueDeclare()->queueBind(…,”update.#”)->basicQoS(1)->basicConsume()->whileLoop(consume)消费者能收到交换器声明为update.***的消息

关于队列参数

durable:是否持久化,那么问题来了,这是什么意思?持久化,指的是队列持久化到数据库中。在之前的博文中也说过,如果RabbitMQ服务挂了怎么办,队列丢失了自然是不希望发生的。持久化设置为true的话,即使服务崩溃也不会丢失队列,但是要实现消息持久化,必须交换器,队列,消息都设置持久化才行

exclusive:设置了排外为true的队列只可以在本次的连接中被访问,也就是说在当前连接创建多少个channel访问都没有关系,但是如果是一个新的连接来访问,对不起,不可以,排外的queue在当前连接被断开的时候会自动消失(清除)无论是否设置了持久化

autoDelete:这个就很简单了,是否自动删除。也就是说queue会清理自己。但是是在最后一个connection断开的时候

参考:https://www.cnblogs.com/ysocean/p/9251884.html

发表评论

电子邮件地址不会被公开。