当前位置: 首页 > news >正文

唐山市做网站做消费信贷网站

唐山市做网站,做消费信贷网站,做网站的岗位叫什么,wordpress 自动加版权前言 消息从生产者发送到exchange, 再到 queue, 再到消费者。这个过程中有哪些有消息丢失的可能性呢? 发送时丢失: 生产者发送的消息未送达 exchange消息到达 exchange 后未到达 queue MQ 宕机,queue将消息丢失consumer 接收到消息后未消费…

前言

消息从生产者发送到exchange, 再到 queue, 再到消费者。这个过程中有哪些有消息丢失的可能性呢?

  • 发送时丢失:
    • 生产者发送的消息未送达 exchange
    • 消息到达 exchange 后未到达 queue
  • MQ 宕机,queue将消息丢失
  • consumer 接收到消息后未消费就宕机
    在这里插入图片描述
    消息可靠性问题及其对应的解决方案:
场景publisher发送时丢失MQ消息丢失consumer消费问题
解决方案生产者确认机制消息持久化消费者消息确认&&失败重试机制

下面我们先说一下publisher 发送时丢失的问题应该如何处理

生产者确认机制的理论说明

RabbitMQ 提供了 publisher confirm 机制来避免消息发送到MQ过程中丢失。消息发送到MQ以后, 会返回一个结果给发送者,表示消息是否处理成功。结果有两种请求:

  • publish-confirm, 发送者确认
    • 消息成功投递到交换机,返回ack
    • 消息未投递到交换机,返回nack
  • publish-return, 发送回执
    • 消息投递到交换机,但是没有路由到队列,返回ACK, 及路由失败原因

注意: 确认机制发送消息时, 需要给每个消息设置一个全局唯一 id, 以区分不同消息,避免ack 冲突

在这里插入图片描述

代码实现

下面基于SpringAMQP 实现的生产者确认机制

  1. 在 publisher 服务的 application,yml 中添加以下配置:
spring:rabbitmq:publisher-confirm-type: correlated # 开启异步回调publisher-returns: truetemplate:mandatory: true

配置说明:

  • publish-confirm-type: 开启 publisher-confirm, 这里支持两种类型:
    • simple: 同步等待 confirm 结果, 直到超时
    • correlated: 异步回调, 定义ConfirmCallback, MQ 返回结果时会回调这个ConfirmCallback
  • publish-returns: 开启 publish-return 功能,同样是基于 callback 机制,不过是定义 ReturnCallbcak
  • template.mandatory: 定义消息路由失败时的策略。true, 则调用ReturnCallback, false: 则直接丢弃消息

ConfirmCallBack是基于每条消息设置的,所以需要一个全局唯一id 进行区分。
ReturenCallbcak 则是基于每个RabbitTemplate操作实例,是一种全局性的回调。

  1. 由于每个 RabbitTemplate 只能配置一个 ReturnCallback, 因此需要在项目启动过程中配置:
    (这里可以实现ApplicationContextAware,它可以在SpringIOC 容器初始化的时候,进行一些全局性回调的操作)
@Slf4j
@Configuration
public class CommonConfig implements ApplicationContextAware {@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {// 获取 RabbitTemplate对象RabbitTemplate rabbitTemplate = applicationContext.getBean(RabbitTemplate.class);// 配置 ReturnCallbackrabbitTemplate.setReturnCallback((message, replayCode, replayText,exchange, routingKey) -> {// 记录日志log.error("消息发送到队列失败, 响应码:{}, 失败原因:{},交换机:{}, 路由key:{},消息:{},",replayCode, replayText, exchange, routingKey, message.toString());// 如果有需要的话,重发消息});}}
}	
  1. 为每条发送的消息,指定消息 ID, 并编写对应的 ConfirmCallback
public void testSendMessage2SimpleQueue() throws InterruptedException {// 1. 准备消息String message = "hello, spring amqp!";// 2. 准备CorrelationData// 2.1 消息idCorrelationData correlationData = newCorrelationData(UUID.randomUUID().toString());// 2.2 准备 ConfirmCallbackcorrelationData.getFuture().addCallback(confirm -> {// 判断结果if(confirm.isAck()){// ACKlog.debug("消息成功投递到交换机!消息ID:{}",correlationData.getId());}else {// NACKlog.error("消息投递到交换机失败!消息ID:{}", correlationData.getId());// 重发消息}}, throwable -> {// 记录日志log.error("消息发送失败", throwable);// 重发消息});// 3.发送消息rabbitTemplate.convertAndSend("amq.topic", "asimple.test", message, correlationData);
}

总结

SpringAMQP 中处理消息确认的几种情况:

  • publisher-confirm:
    • 消息发送到 exchange, 返回 ack
    • 消息发送失败,没有到达交换机,返回 nack
    • 消息发送过程中出现异常,没有收到回执
  • 消息成功发送到 exchange, 但没有路由到 queue, 调用 ReturnCallback
http://www.yayakq.cn/news/524674/

相关文章:

  • 网站制作目标及要求石家庄 外贸网站建设公司排名
  • 网站域名hk国外注册公司流程及费用
  • 网站建设哪个平台最好网站页脚的信息都有什么
  • 一般做平面网站多少钱wordpress 用户上传文件
  • 江门建站网站模板建设一个网站的硬件要求吗
  • android开发框架有哪些seo人员招聘
  • 淄博三合一网站开发河南网站建设企业
  • 信息管理的基本原理分析网站建设上海高端网站制作
  • 校园网站建设培训简讯开公司流程
  • 知识付费网站源码自助网站建设哪家好
  • 重庆网站搭建哪里可以做初学者想学网站建设
  • 单位网站建设管理工作总结做网站卖东西
  • dedecms大气金融企业网站模板免费下载廊坊建设网站企业
  • 用python开发网站开发技术软件工程开发师工资
  • 网站域名更换相应内容wordpress 搜索分类
  • 深圳建设网站哪家强海报生成免费
  • 360外链北京seo公司有哪些
  • 福利WordPress网站自动采集源码哪些网站是做色选机销售的
  • 网站项目设计与制作综合实训网络服务器下载
  • 做网站点子在广州注册一个公司要多少钱
  • 手机网站漂浮怎么做硬件开发有哪些方向
  • 做虚拟币网站需要什么手续茶叶公司网站的建设
  • 百度企业网站建设产品备案查询
  • 手机上能不能制作网站开发wordpress移动端导航
  • 过年做那个网站能致富巴中做网站的公司
  • 微网站建设第一步是进行什么的设置深圳市建设集团和恒大的关系
  • 建站神器跟wordpress哪个好深圳软件开发工程师
  • 门户网站申请设计网站推荐视频
  • 济宁网站建设 悍诺天河区门户网站招生考试
  • 普陀网站建设做关于卖宠物饲料网站有什么名字吗