springboot 整合 rabbitMQ(1)

金歌  金牌会员 | 2024-11-14 09:40:43 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 922|帖子 922|积分 2766

目次
一、MQ概述
二、MQ的优势和劣势
 三、常见的MQ产品
RabbitMQ使用步调
第一步:确保rabbitmq启动并且可以访问15672
第二步:导入依靠
第三步:设置
auto自动确认
manual手工确认(推荐使用!可以防止消息丢失)
第四步:编写生产者和消费者


一、MQ概述

  MQ 全称是Message Queue(消息队列),是在消息传输过程中保存消息的容器,多用于分布式         系统之间进行通讯。
二、MQ的优势和劣势

   优势


  • 应用解耦  :  系统的耦合性越高,容错性就越低,可维护性就越低,使用MQ 使得应用间解耦, 提升容错性和可维护性。
  • 异步提速 :  提升用户体验和系统吞吐量(单位时间内处置惩罚哀求的数目)。
  • 削锋填谷 :  使用了MQ之后,限制消费消息的速率为2000,这样一来,高峰期产生的数据势必 会被积存在 MQ中,高峰 就被“”掉了。但是因为消息积存,在高峰期过后的一段时间内,消费消息的速率照旧会维持在1000,直到消费完积存的消息,这就叫做 “填谷”。使用MQ后,可以提高系统稳固性。
  劣势


  • 系统的可用性低落  :  引入的外部依靠越多,系统稳固性越差,一旦MQ宕机,会对业务系统造  成影响。如何保证MQ的高可用?
  • 系统复杂度提高  :   MQ的到场增长了系统的复杂度,以前是系统间同步的长途调用,如今是      通过MQ进行一部调用,怎么处置惩罚消息丢失环境?如何保证消息传递的顺序性。
  • 划一性问题  :  A系统发给BCD系统,若其中一个系统处置惩罚数据失败,如何保证消息数据处置惩罚的  划一性问题。
 三、常见的MQ产品


RabbitMQ使用步调

第一步:确保rabbitmq启动并且可以访问15672


第二步:导入依靠

  1.         <!-- rabbitmq -->
  2.         <dependency>
  3.             <groupId>org.springframework.boot</groupId>
  4.             <artifactId>spring-boot-starter-amqp</artifactId>
  5.         </dependency>
复制代码
第三步:设置

  
  1. rabbitmq:
  2.   host: ip
  3.   port: 5672
  4.   username: guest
  5.   password: guest
  6.   virtual-host: /
  7.   listener:
  8.     simple:
  9.       prefetch: 1 # 默认每次取出一条消息消费, 消费完成取下一条
  10.       acknowledge-mode: manual # 设置消费端手动ack确认  不写默认为自动确认(auto)
  11.       retry:
  12.         enabled: true # 是否支持重试
  13.   publisher-confirm-type: correlated  #确认消息已发送到交换机(Exchange)
  14.   publisher-returns: true  #确认消息已发送到队列(Queue)     
复制代码
auto自动确认


  • 消息成功被消费,没有抛出异常,则自动确认,回复ack。
  • 当抛出ImmediateAcknowledgeAmqpException异常,则视为成功消费,确认该消息。
  • 当抛出AmqpRejectAndDontRequeueException异常的时候,则消息会被拒绝抛弃,并且不会重新入队。
  • 其他的异常,则消息会被拒绝,且requeue = true(默认就是true)时会重新入队
manual手工确认(推荐使用!可以防止消息丢失)

无论有没有异常,尺度只有是否自动调用basicAck()、basicNack()等方法,没有调用则一直阻塞.
因此有异常时,(有重试就重试),抛出异常后,没有调用时,照旧会一直阻塞。纵然是auto模式的那两个特殊的异常,在manual中都是一样的,不会有特殊处置惩罚.

官网对应模式介绍:RabbitMQ Tutorials | RabbitMQ

第四步:编写生产者和消费者

        这里写一个登录成功发送消息给登录人的业务(普通队列模式) 


  • P:生产者,也就是要发送消息的程序
  • C:消费者:消息的担当者,会一直等候消息到 
生产者
        


  • String exchange(交换机名)

    • 交换器的名称。交换器是一种逻辑实体,用于分发消息到相应的队列。你可以创建自界说的交换器范例,如 Direct、Fanout、Topic 或者 Headers 等。

  • String routingKey(队列名)

    • 路由键。它是消息与队列之间的桥梁,决定了消息将被发送到哪个队列。路由键的值应匹配队列绑定到交换器时所使用的键。

  • Object message(消息对象)

    • 要发送的消息对象。这个对象将被转换成字节省,然后发送到 RabbitMQ。Spring AMQP 使用 MessageConverter 将 Java 对象转换为 AMQP 格式的字节省。默认环境下,SimpleMessageConverter 可以处置惩罚简单的字符串、Java 序列化对象等。你可以通过设置 RabbitTemplate 的 messageConverter 属性来自界说消息转换器。

  • MessagePostProcessor messagePostProcessor

    • 这是一个接口,用于在消息发送前对其进行进一步的修改。你可以在这个处置惩罚器中设置消息头、属性或其他特定信息。MessagePostProcessor 接口有一个方法 postProcessMessage(Message message),你可以在这里修改消息实例。

  • CorrelationData correlationData

    • 相干数据,主要用于跟踪消息的发送效果。在异步发送消息的环境下,你可以使用此参数来关联发送哀求和响应。CorrelationData 包含一个唯一标识符,用于识别消息。当收到响应时,可以通过这个标识符找到原始哀求。

      

        发邮件是发给一个人,以是这里只必要传一个队列名和登录人对象。(发送给多个队列时需            要用到交换机)
        

消费者:
  1. //@Header从消息头中提取消息的递送标签,标签是唯一的,对应唯一的消息
  2. @RabbitListener(queuesToDeclare = @Queue("login_queue"))
  3. public void test01(User getUser, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long         
  4.                    deliveryTag)
  5. {
  6.     try {
  7.              发送邮件的代码……
  8.             
  9.             //手动确认消息
  10.             channel.basicAck(deliveryTag,true);
  11.         } catch (MessagingException e) {
  12.             throw new RuntimeException(e);
  13.         } catch (IOException e) {
  14.             throw new RuntimeException(e);
  15.         }
  16. }
复制代码
 如果设置了手工消费,肯定要消费完后手动确认消息,不然就会重复接收该消息,导致后面的消息担当不到!
         

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

金歌

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表