RabbitMQ 测试

安装

  • 端口
    • 5672 – client通信端口
    • 15672 – 管理界面ui端口
    • 25672 – server间内部通信口
1
2
3
docker pull rabbitmq:management

docker run -d -p 5672:5672 -p 15672:15672 -p 25672:25672 --name rabbitmq rabbitmq:management

管理页面

账号 密码 guest

新增用户

新增 Virtual Hosts

新增权限

切换用户

搭建生产者与消费者

生产者只需要发送消息 添加 amqp 依赖即可, 消费者需要接收消息以及监听消息 所以不仅需要添加 amqp 还需要添加 web 启动器

入门程序

  • 生产者发送消息:RabbitTemplate
  • 消费者监听器:
1
2
3
4
5
@RabbitListener(bindings = @QueueBinding(
value = @Queue("队列名称"),
exchange = @Exchange(value = "交换机名称", type = ExchangeTypes.TOPIC/DIRECT/FANOUT),
key = {}
))

避免消息堆积 与 避免消息丢失

避免消息堆积

  • 怎么避免消息堆积
    • 搭建消费者集群(使用工作模型) 配合能者多劳
      • 同一套服务在多个服务器上运行, 运行多个实例
    • 使用多线程消费

搭建消费者集群后可以发现 rabbitmq 默认是采用轮训的方式分配消息当有多个消费者接入时,消息的分配模式是一个消费者分配一条,直至消息消费完成.
现实场景中我们不同的服务器性能可能不一致, 消费消息能力也有所差异, 如果继续使用默认的分配策略. 一台服务可能已经把分配给自己的消息全部消费完了, 另一台可能还在慢慢消费. 这也是对计算资源的一种浪费.
(给消费者工程代码添加 睡眠 并重启某一个服务看到差异效果.)

配置能者多劳后, 可以发现能力较弱的服务A只消费了一条消息, 而能力强的服务B则将剩下的全部消息消费完毕.
(去掉消费者端 睡眠方法, 配置文件中添加 能者多劳配置. 重启两台服务, 在消费者端添加睡眠代码. 任意重启一台服务 发送消息即可看到前后差异)

避免消息丢失

  • 怎么避免消息丢失
    • 生产者确认(确保消息到达消息中间件)
    • 消息持久化(交换机持久化 队列持久化 消息持久化)
    • 消费者确认(确保消息被消费者正确无误的消费)

消费者确认

消费者确认, yml 配置 acknowledge-mode: manual. 监听器添加相应代码

交换机、队列、消息都是在消费者中声明的. 消息持久化 也是在 消费者中声明的, 默认就是持久化的

生产者确认

生产者确认, yml 中配置 publisher-confirm-type 以及 publisher-returns 新增配置类设置 rabbitmq 的两个回调