• RabbitMQ 高级特性


    1.1 消息的可靠投递小结

    ➢ 设置ConnectionFactory的publisher-confirms="true" 开启 确认模式。

    ➢ 使用rabbitTemplate.setConfirmCallback设置回调函数。当消息发送到exchange后回 调confirm方法。在方法中判断ack,如果为true,则发送成功,如果为false,则发 送失败,需要处理。

    ➢ 设置ConnectionFactory的publisher-returns="true" 开启 退回模式。

    ➢ 使用rabbitTemplate.setReturnCallback设置退回函数,当消息从exchange路由到 queue失败后,如果设置了rabbitTemplate.setMandatory(true)参数,则会将消息退 回给producer。并执行回调函数returnedMessage。

    ➢ 在RabbitMQ中也提供了事务机制,但是性能较差,此处不做讲解。 使用channel下列方法,完成事务控制:

    txSelect(), 用于将当前channel设置成transaction模式

    txCommit(),用于提交事务

    txRollback(),用于回滚事务

    1.2 Consumer Ack

    ack指Acknowledge,确认。 表示消费端收到消息后的确认方式。

    有三种确认方式:

    • 自动确认:acknowledge="none"

    • 手动确认:acknowledge="manual"

    • 根据异常情况确认:acknowledge="auto",(这种方式使用麻烦,不作讲解)

    其中自动确认是指,当消息一旦被Consumer接收到,则自动确认收到,并将相应 message 从 RabbitMQ 的 消息缓存中移除。但是在实际业务处理中,很可能消息接收到,业务处理出现异常,那么该消息就会丢失。如 果设置了手动确认方式,则需要在业务处理成功后,调用channel.basicAck(),手动签收,如果出现异常,则 调用channel.basicNack()方法,让其自动重新发送消息。

    ➢ 在rabbit:listener-container标签中设置acknowledge属性,设置ack方式 none:自动确认,manual:手 动确认

    ➢ 如果在消费端没有出现异常,则调用channel.basicAck(deliveryTag,false);方法确认签收消息

    ➢ 如果出现异常,则在catch中调用 basicNack或 basicReject,拒绝消息,让MQ重新发送消息。

    1.2 消息可靠性总结

    \1. 持久化

    • exchange要持久化

    • queue要持久化

    • message要持久化

    \2. 生产方确认Confirm

    \3. 消费方确认Ack

    \4. Broker高可用

    1.3 消费端限流

    ➢ 在 中配置 prefetch属性设置消费端一次拉取多少消息

    ➢ 消费端的确认模式一定为手动确认。acknowledge="manual"

    1.4 TTL

    ➢ TTL 全称 Time To Live(存活时间/过期时间)。

    ➢ 当消息到达存活时间后,还没有被消费,会被自动清除。

    ➢ RabbitMQ可以对消息设置过期时间,也可以对整个队列(Queue)设置过期时间。

    ➢ 设置队列过期时间使用参数:x-message-ttl,单位:ms(毫秒),会对整个队列消息统一过期。

    ➢ 设置消息过期时间使用参数:expiration。单位:ms(毫秒),当该消息在队列头部时(消费时),会单独判断 这一消息是否过期。

    ➢ 如果两者都进行了设置,以时间短的为准。

    1.5 延迟队列

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

    需求:

    \1. 下单后,30分钟未支付,取消订单,回滚库存。

    \2. 新用户注册成功7天后,发送短信问候。 实现方式: 1. 定时器 2. 延迟队列

    img

    很可惜,在RabbitMQ中并未提供延迟队列功能。

    但是可以使用:TTL+死信队列 组合实现延迟队列的效果。

    img

    1.6 消息追踪

    在使用任何消息中间件的过程中,难免会出现某条消息异常丢失的情况。对于RabbitMQ而言,可能 是因为生产者或消费者与RabbitMQ断开了连接,而它们与RabbitMQ又采用了不同的确认机制;也 有可能是因为交换器与队列之间不同的转发策略;甚至是交换器并没有与任何队列进行绑定,生产者 又不感知或者没有采取相应的措施;另外RabbitMQ本身的集群策略也可能导致消息的丢失。这个时 候就需要有一个较好的机制跟踪记录消息的投递过程,以此协助开发和运维人员进行问题的定位。 在RabbitMQ中可以使用Firehose和rabbitmq_tracing插件功能来实现消息追踪。

    消息追踪-Firehose

    firehose的机制是将生产者投递给rabbitmq的消息,rabbitmq投递给消费者的消息按照指定的格式 发送到默认的exchange上。这个默认的exchange的名称为amq.rabbitmq.trace,它是一个topic类 型的exchange。发送到这个exchange上的消息的routing key为 publish.exchangename 和 deliver.queuename。其中exchangename和queuename为实际exchange和queue的名称,分别 对应生产者投递到exchange的消息,和消费者从queue上获取的消息。

    注意:打开 trace 会影响消息写入功能,适当打开后请关闭。

    rabbitmqctl trace_on:开启Firehose命令

    rabbitmqctl trace_off:关闭Firehose命令

    消息追踪-rabbitmq_tracing

    rabbitmq_tracing和Firehose在实现上如出一辙,只不过rabbitmq_tracing的方式比Firehose多了一 层GUI的包装,更容易使用和管理。

    启用插件:rabbitmq-plugins enable rabbitmq_tracing

  • 相关阅读:
    夜半随笔
    VC6.0 工程转到VS2008一些问题
    没有找到MSVCR90.dll,因此这个应用程序未能启动,重新安装应用程序可解决
    开源中国
    保存桌面图标的次序吧
    2008下,错误:fatal error C1853
    生成成功,调试时出现错误导致中断Unhandled exception at 0x41cd7fb0 in webcam.exe: 0xC0000005: Access violatio
    opencv安装可能没注意的细节
    error PRJ0003 : 生成“cl.exe”时出错
    wince对话框添加菜单
  • 原文地址:https://www.cnblogs.com/weijiqian/p/16338177.html
Copyright © 2020-2023  润新知