系统学习消息队列分享(一) 怎样系统学习消息队列? - 温柔的风 - 博客园

一、初识MQ

1.同步调用

优势:

  • 时效性强,等待到结果后才返回

问题

  • 扩展性差
  • 性能下降
  • 级联失败问题(其中一个服务异常,后续都处理失败)

2.异步调用

优势:

  • 耦合度低,扩展性强
  • 异步调用,无需等待,性能好
  • 故障隔离,下游服务故障不影响上游业务
  • 缓存消息,流量削峰填谷

问题:

  • 不能立刻得到结果,时效性差
  • 不确定下游业务是否执行成功
  • 业务安全依赖于Broker(消息代理)的可靠性

二、RabbitMQ

1.数据隔离

三、Java客户端

1.快速入门

2.work模型

Work queues ,任务模型,让多个消费者绑定到一个队列共同消费队列中的消息

消费者消息推送限制

默认情况下,RabbitMQ会将消息依次轮询投递给绑定在消息队列上的每一个消费者。但是这个并没有考虑到消费者是否已经处理完消息,可能会出现消息堆积。因此我们需要修改application.ym,设置preFetch值为1,确保同一时刻最多投递给消费者1条消息:

总结:

  • 多个消费者绑定到一个队列上,可以加快消息处理速度
  • 同一条消息只会被一个消费者处理
  • 通过设置prefetch来控制消费者预取的消息数量,处理完一条再处理下一条,实现能者多劳

3.Fanout交换机

真正的环境都会通过exchange来发送消息,而不是直接发送到队列,交换机的类型有以下三种:

  • Fanout:广播
  • Direct:定向
  • Topic:话题

交换机的作用:

  • 接受publisher发送的消息
  • 将消息按照规则路由到与之绑定的队列
  • FanoutExchange会将消息路由到每个绑定的队列

4.Direct交换机

DirectExchange会讲接受到的消息根据规则路由到指定的Queue,因此被称为定向路由

  • 每一个Queue都与Exchange设置一个BindingKey
  • 发布者发送消息时,指定消息的RoutingKey
  • Exchange将消息路由到BindingKey与RoutingKey一致的队列

Fanout交换机与Direct交换机差异:

  • Fanout交换机讲消息路由给每一个与之绑定的队列
  • Direct交换机根据RoutingKey判断路由给哪个队列
  • 如果多个队列具有相同的RoutingKey,则与Fanout功能类似

5.topic交换机

TopicExchange与DirectExchange类似,区别在于routingKey可以是多个单词的列表,并且.分割

Queue与Exchange指定BindingKey可以使用通配符:

  • #:代表0个或者多个单词
  • *:代指一个单词

6.声明队列和交换机

方式一、

方式二、

7.消息转换器

Logo

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。

更多推荐