rabbitmq 拉取消息太慢_RabbitMQ

  • Post author:
  • Post category:其他



MQ概述

  • MQ全称Message Queue(消息队列),在web中小的数据都可以称为消息,队列是一种容器,用来存储数据的都可以称为容器,多用于分布式系统之间的通信
  • A系统(生产者)->MQ(中间件)->B系统(消费者)


MQ的优势

  • 应用解耦:使用MQ使得应用间解耦,提升容错性和可维护性。
  • 异步提速:提升用户体验和系统吞吐量
  • 削峰填谷:提高系统稳定性


MQ的劣势

  • 系统可用性降低:系统引入的外部依赖越多,系统稳定性越差。一旦MQ宕机,就会对业务造成影响
  • 系统复杂度提高:MQ的加入大大增加了系统的复杂度,以前系统间是同步的远程调用,现在是通过MQ进行一步调用。如何保证消息没有被重复消费?怎么处理消息丢失情况?怎么保证消息传递额顺序性
  • 一致性问题:A系统处理完业务,通过MQ给BCD三个系统发消息数据,如果BC系统处理成功,D失败,如何保证消息数据的一致性。


同步和异步调用

  • 同步调用时单线程的,A调用B,必须等待B给出响应之后A才能继续执行,否则A处于阻塞状态;异步调用是多线程的,A调用B之后不用等待B的响应即可继续执行。


MQ使用的条件

  • 生产者不需要从消费者处获得反馈。引入消息队列之前的直接调用,其接口的返回值为空,才不用等待被调用者的动作做完,调用者直接把被调用者当做已经做完。
  • 容许短暂的数据不一致


JMS

  • JMS即Java消息服务(JavaMessage Service)应用程序接口,是一个Java平台中关于面向消息中间件的API


RabbitMQ安装

小鬼当家:虚拟机安装Linux,JDK,MySql,Tomcat,Redis,Nginx,RabbitMQ​zhuanlan.zhihu.com

代码

channel.queueDeclare(String queue,boolean exclusive,boolean autoDelete, Map<String,Object> ar);
//        queue:队列名称
//        durable:是否持久化,当mq重启后,还在
//        exclusive:是否独占。只能有一个消费者监听这个队列
//        autoDelete:当没有consumer时,是否自动删除


work queues工作队列模式(一条消息只能一个消费者消费)

9fcece991b1b6eaf3b7163b939dc6b62.png
  • 概念:与简单模式相比,多了一些消费端,多个消费端共同消费同一个队列中的消息,存在竞争关系
  • 应用场景:任务较重的情况下,多个消费者处理消息可以提高任务处理的速度


Pub/Sub订阅模式

4c5719b5deede59cf6c46e1544e314f1.png

生产者将消息发送给交换机,交换机负责转发给特定的队列,交换机不存储消息

  • direct:定向
  • fanout:发送消息到每一个队列


Routing 路由模式

16486082d89f7fc1ad172107397b6522.png

topic

3ba157fdee4b4c0e28193da6d718eb15.png


消息的可靠投递

  • rabbitmq消息投递路径:producer->rabbitmq broker->exchange->queue->consume
  • confirm确认模式:消息从producer到exchange会返回一个confirmCallback

    • 实现流程: 确认模式开启->在工具类上通过匿名内部类 定义回调函数
  • return退回模式:消息从exchange到queue投递失败则会返回一个returnCallback

    • 实现流程:开启回退模式->设置returnCallback->设置Exchange处理消息的模式(1如果消息没有路由到queue,则丢弃消息;2如果消息没有路由到queue,返回消息给发送方ReturnCallback)


消费端限流

  • 确保消费端签收机制为手动签收
  • 在<listener-container>配置属性perfetch=N表示消费端每次从mq拉取一条消息来确认,知道消费完毕后,才会继续拉取下一条消息。


TTL(Time To Live存活/过期时间)

  • 当消息到达存活时间后,还没有被消费,会被自动清除(队列统一过期或者某个消息过期)
  • 如果同时设置消息和队列的过期时间,以时间短的为准


死信队列(Dead Letter Exchange)DLX

  • 当消息称为Dead message后,可以被重新发送到另一个交换机,这个交换机就是DLX。DLX又可以绑定队列,使得消息可以被重新消费。
8c46d489239408bdcfb478580c71d3c3.png
  1. 消息成为死信的三种情况:

    1. 队列的消息长度达到限制
    2. 消费者拒绝消费消息,basicNack/basicReject,并且不把消息重新放入原目标队列,requeue=false
    3. 原队列存在消息过期设置,消息到达超时时间未被消费


延迟队列

消息进入队列后不会立即被消费,只有到达指定时间后才会被消费

a8fd2cc711f479b2e0b34cc9a5aa7daa.png

RabbitMQ搭建集群

RABBITMQ_NODE_PORT=5673 RABBITMQ_NODENAME=RABBIT1 rabbitmq-server start

HAProxy安装



版权声明:本文为weixin_39991148原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。