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

做企业网站需要哪些久久建筑网平台

做企业网站需要哪些,久久建筑网平台,wordpress微信分享,seo技术最新黑帽文章目录 前言发送方确认confirm 确认模式return 退回模式 常见面试题 前言 前面我们学习了 RabbitMQ 中交换机、队列和消息的持久化#xff0c;这样能够保证存储在 RabbitMQ Broker 中的交换机和队列中的消息实现持久化#xff0c;就算 RabbitMQ 服务发生了重启或者是宕机这样能够保证存储在 RabbitMQ Broker 中的交换机和队列中的消息实现持久化就算 RabbitMQ 服务发生了重启或者是宕机也不会导致交换机和消息的丢失。那么这个机制是保证存储在 RabbitMQ Broker 中的可靠性但是对于生产者发送的消息如果都到达不了 RabbitMQ 的话那么这些持久化操作也就没有意义了那么对于生产者发送的消息生产者如何知道消息是否已经成功到达 RabbitMQ Broker 了呢这里就需要用到 RabbitMQ 发送发确认这个特性了前面我们大概的讲了一下 RabbitMQ Java Client 中的 Publisher/confirm 发送方确认那么这篇文章我们将学习在 SpringBoot 中如何实现发送方确认。 发送方确认 其实对于上面的问题RabbitMQ 为我们提供了两种解决方案 通过事务机制实现通过发送方确认机制实现 因为使用事务机制的话比较消耗性能在实际工作中使用的不多所以我们就主要介绍发送方确认的机制来实现发送方的确认。并且对于发送方确认的机制 RabbitMQ 也为我们提供了两个方式来控制消息的可靠性。 confirm 确认模式return 退回模式 confirm 模式是确认消息是否到达指定的 Exchange 交换机的而 return 退回模式则是确认消息是否到达指定队列的。 confirm 确认模式 Producer 在发送消息的时候对发送端设置一个 ConfirmCallback 的监听无论消息是否到达 Exchange这个监听都会被执行如果 Exchange 成功收到ACK Ackonwledge character 确认字符为 true如果没有收到消息ACK 就为 false。 那么下面我们就来看看在 SpringBoot 中如何实现 confirm 确认模式 首先在配置文件中配置信息 spring:rabbitmq:publisher-confirm-type: correlated #消息发送确认然后设置确认回调函数的内容并且发送消息 无论消息是否成功送到都会执行这个回调函数确认消息是否成功送达的判断依据就是 ACK 的值 public class Constants {public static final String CONFIRM_EXCHANGE confirm.exchange;public static final String CONFIRM_QUEUE confirm.queue; }Configuration public class RabbitConfig {Bean(confirmQueue)public Queue confirmQueue() {return QueueBuilder.durable(Constants.CONFIRM_QUEUE).build();}Bean(confirmExchange)public DirectExchange confirmExchange() {return ExchangeBuilder.directExchange(Constants.CONFIRM_EXCHANGE).build();}Bean(confirmBinding)public Binding confirmBinding(Qualifier(confirmQueue) Queue queue, Qualifier(confirmExchange) DirectExchange exchange) {return BindingBuilder.bind(queue).to(exchange).with(confirm);}Bean(confirmRabbitTemplate)public RabbitTemplate confirmRabbitTemplate(ConnectionFactory factory) {//创建新的RabbitTemplate对象并且设置confirm回调函数RabbitTemplate rabbitTemplate new RabbitTemplate(factory);rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {Overridepublic void confirm(CorrelationData correlationData, boolean ack, String cause) {if (ack) {System.out.printf(消息接收成功,id:%s\n,correlationData.getId());}else {System.out.printf(消息接受失败,id:%s,cause:%s,correlationData.getId(),cause);}}});return rabbitTemplate;} }RequestMapping(/producer) RestController public class ProducerController {AutowiredRabbitTemplate rabbitTemplate;RequestMapping(/confirm)public String confirm() {CorrelationData correlationData new CorrelationData(1);rabbitTemplate.convertAndSend(Constants.CONFIRM_EXCHANGE,confirm,rabbitmq confirm,correlationData);return 消息确认成功;} }然后我们指定交换机的时候如果指定一个不存在的交换机也就是消息无法到达指定的交换机那么看看时候会执行确认回调函数 rabbitTemplate.convertAndSend(Constants.CONFIRM_EXCHANGE 1,confirm,rabbitmq confirm,correlationData);2024-08-13 14:47:52.646 ERROR 11252 — [3.57.1.114:5672] o.s.a.r.c.CachingConnectionFactory : Shutdown Signal: channel error; protocol method: #methodchannel.close(reply-code404, reply-textNOT_FOUND - no exchange ‘confirm.exchange1’ in vhost ‘test’, class-id60, method-id40) 消息接受失败,id:1,cause:channel error; protocol method: #methodchannel.close(reply-code404, reply-textNOT_FOUND - no exchange ‘confirm.exchange1’ in vhost ‘test’, class-id60, method-id40) 可以看到如果消息没有到达指定的交换机那么也是会执行相应的回调函数的。 public interface ConfirmCallback { /** * 确认回调 * param correlationData: 发送消息时的附加信息, 通常⽤于在确认回调中识别特定的消 息 * param ack: 交换机是否收到消息, 收到为true, 未收到为false * param cause: 当消息确认失败时,这个字符串参数将提供失败的原因.这个原因可以⽤于调 试和错误处理. * 成功时, cause为null */ void confirm(Nullable CorrelationData correlationData, boolean ack, Nullable String cause); }RabbitTemplate.ConfirmCallback 和 ConfirmListener 的区别 RabbitTemplate.ConfirmCallback这是Spring AMQP库提供的一个回调接口主要用于在使用RabbitTemplate发送消息时接收来自RabbitMQ服务器的确认信息。这些确认信息表明消息是否已成功发送到RabbitMQ的交换机Exchange。ConfirmListener这个接口或功能更多是直接与RabbitMQ的Channel相关而不是直接通过Spring AMQP的RabbitTemplate来使用的。它用于监听RabbitMQ Channel上的消息确认事件包括消息的ACK确认和NACK不确认。这种方式通常需要更底层的操作直接处理RabbitMQ的Channel和连接。 return 退回模式 当消息成功到达 Exchange 交换机的时候交换机会根据路由规则匹配对应的队列将消息路由到指定的队列在消息从 Exchange 到 Queue 的过程中如果一条消息无法被任何队列消费即没有队列与消息的 Routing Key 匹配或者队列不存在等可以选择把消息退回给发送者消息退回给发送者时我们可以设置一个返回回调方法对消息进行处理。 那么使用 SpringBoot 如何实现 return 退回模式呢 首先还是需要进行配置配置和上面的 confirm 模式是一样的 spring:rabbitmq:publisher-returns: true #设置回退设置返回回调逻辑并发送消息 Bean(confirmRabbitTemplate) public RabbitTemplate confirmRabbitTemplate(ConnectionFactory factory) {RabbitTemplate rabbitTemplate new RabbitTemplate(factory);rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {Overridepublic void confirm(CorrelationData correlationData, boolean ack, String cause) {if (ack) {System.out.printf(消息接收成功,id:%s\n,correlationData.getId());}else {System.out.printf(消息接受失败,id:%s,cause:%s,correlationData.getId(),cause);}}});rabbitTemplate.setMandatory(true);rabbitTemplate.setReturnsCallback(new RabbitTemplate.ReturnsCallback() {Overridepublic void returnedMessage(ReturnedMessage returnedMessage) {System.out.printf(消息被退回:%s,returnedMessage);}});return rabbitTemplate; }setConfirmCallback() 和 setReturnCallback() 方法可以同时存在也可以单独设置。 rabbitTemplate.convertAndSend(Constants.CONFIRM_EXCHANGE,confirm1,rabbitmq confirm,correlationData);发送消息的时候我们的 Routing Key 设置为没有 Binding Key 与之匹配的然后来看看这个 returnCallback 是否会被执行 消息被退回:ReturnedMessage [message(Body:‘rabbitmq confirm’ MessageProperties [headers{spring_returned_message_correlation1}, contentTypetext/plain, contentEncodingUTF-8, contentLength0, receivedDeliveryModePERSISTENT, priority0, deliveryTag0]), replyCode312, replyTextNO_ROUTE, exchangeconfirm.exchange, routingKeyconfirm1] 消息接收成功,id:1 消息成功到达了 Exhcange但是没有到达指定的队列所以执行了 returnCallback 方法。 public class ReturnedMessage {//返回的消息对象包含了消息体和消息属性private final Message message;//由Broker提供的回复码, 表⽰消息⽆法路由的原因. 通常是⼀个数字代码每个数字代表不同的含义.private final int replyCode;//⼀个⽂本字符串, 提供了⽆法路由消息的额外信息或错误描述.private final String replyText;//消息被发送到的交换机名称private final String exchange;//消息的路由键即发送消息时指定的键private final String routingKey; }常见面试题 如何保证 RabbitMQ 消息的可靠传输 从这个图中可以看出消息可能丢失的场景以及解决方案: 生产者将消息发送到RabbitMQ失败 a. 可能原因: 网络问题等 b. 解决办法: 参考本章节[发送方确认-confirm确认模式] 消息在交换机中无法路由到指定队列: a. 可能原因: 代码或者配置层面错误导致消息路由失败 b. 解决办法: 参考本章节[发送方确认-return模式] 消息队列自身数据丢失 a. 可能原因: 消息到达RabbitMQ之后RabbitMQ Server宕机导致消息丢失。 b. 解决办法: 参考本章节[持久性]。开启RabbitMQ持久化就是消息写入之后会持久化到磁盘如果RabbitMQ挂了恢复之后会自动读取之前存储的数据。极端情况下RabbitMQ还未持久化就挂了可能导致少量数据丢失这个概率极低也可以通过集群的方式提高可靠性 消费者异常导致消息丢失 a. 可能原因: 消息到达消费者还没来得及消费消费者宕机。消费者逻辑有问题。 b. 解决办法: 参考本章节[消息确认]。RabbitMQ提供了消费者应答机制来使RabbitMQ能够感知到消费者是否消费成功消息。默认情况下消费者应答机制是自动应答的可以开启手动确认当消费者确认消费成功后才会删除消息从而避免消息丢失。除此之外也可以配置重试机制参考下一章节当消息消费异常时通过消息重试确保消息的可靠性。
http://www.dnsts.com.cn/news/176141.html

相关文章:

  • 奇网企业网站管理系统做网站和软件哪个挣钱
  • 网站为什么要备案网站app下载平台怎么做的
  • 网站中了木马了怎么办视觉设计公司名字
  • 网站策划内容有哪些东莞高风险地区名单最新
  • 多语言版本网站制作长沙微信交流群
  • 君山区建设局网站广告版面设计图片
  • 心理咨询 网站模版潍坊seo网络推广
  • 网站建设邯郸网站图片像素
  • 餐饮网站网页设计代码优化方案英语选择性必修二答案
  • 购物类网站建设方案中企动力公司是国企吗
  • 仿历史网站模板下载建设旅游网站的价值
  • 建下载网站江苏建设部官方网站
  • 网站建设的认识烟台网站建设
  • 网站建设外包服务安全管理制度网站建设实训报告命名规范
  • 如何做一家网站网站开发报价单明细
  • 设计公司网站建设方案做网站找我图片
  • wordpress网站背景自己做的网站如何上传
  • 企业网站排名提升软件智能优化2021小学生新闻摘抄
  • 网站结的建设ppt学网站开发哪个好
  • 想学学做网站湖南网站建设推广优化
  • 最简约的网站做相册网站推荐
  • 湖南汽车软件网站建设重庆网络推广外包
  • 唐山建网站公司丹阳建设局网站
  • 自建外贸网站wordpress企业中文主题下载
  • 有哪些好的网站模版专门做活动的网站
  • 购物网站的英文网页制作与网站开发...
  • 网站源码天堂wordpress去除相册样式
  • 常州企业建站系统模板手机网站架构
  • 360如何做免费的网站企业管理信息系统有哪些
  • 东莞智通人才网招聘信息网苏州百度快照优化排名