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

网站开发什么比较有创意金马国旅网站建设

网站开发什么比较有创意,金马国旅网站建设,360建筑网站,公司网络规划的重要性1.消息可靠性 消息从发送,到消费者接收,会经历多个过程: 其中的每一步都可能导致消息丢失,常见的丢失原因包括: - 发送时丢失: - 生产者发送的消息未送达exchange - 消息到达exchange后未到达queue - MQ宕机,queue将消息丢失 - consumer接收到消息后未消费就宕机 …1.消息可靠性 消息从发送,到消费者接收,会经历多个过程: 其中的每一步都可能导致消息丢失,常见的丢失原因包括: - 发送时丢失: - 生产者发送的消息未送达exchange - 消息到达exchange后未到达queue - MQ宕机,queue将消息丢失 - consumer接收到消息后未消费就宕机 针对这些问题,RabbitMQ分别给出了解决方案: - 生产者确认机制 - mq持久化 - 消费者确认机制 - 失败重试机制 1.1.生产者消息确认 RabbitMQ提供了publisher confirm机制来避免消息发送到MQ过程中丢失。这种机制必须给每个消息指定一个唯一ID。消息发送到MQ以后,会返回一个结果给发送者,表示消息是否处理成功。 返回结果有两种方式: publisher-confirm,发送者确认 消息成功投递到交换机,返回ack 消息未投递到交换机,返回nack publisher-return,发送者回执 消息投递到交换机了,但是没有路由到队列。返回ACK,及路由失败原因。 1.1.1.修改配置 首先,修改publisher服务中的application.yml文件,添加下面的内容: spring:rabbitmq:publisher-confirm-type: correlatedpublisher-returns: truetemplate:mandatory: true 说明: publish-confirm-type:开启publisher-confirm,这里支持两种类型: simple:同步等待confirm结果,直到超时 correlated:异步回调,定义ConfirmCallback,MQ返回结果时会回调这个ConfirmCallback publish-returns:开启publish-return功能,同样是基于callback机制,不过是定义ReturnCallback template.mandatory:定义消息路由失败时的策略。true,则调用ReturnCallback;false:则直接丢弃消息 1.1.2.定义Return回调 每个RabbitTemplate只能配置一个ReturnCallback,因此需要在项目加载时配置: 修改publisher服务,添加一个: @Slf4j @Configuration public class CommonConfig implements ApplicationContextAware {@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {// 获取RabbitTemplateRabbitTemplate rabbitTemplate = applicationContext.getBean(RabbitTemplate.class);// 设置ReturnCallbackrabbitTemplate.setReturnCallback((message, replyCode, replyText, exchange, routingKey) - {// 投递失败,记录日志log.info("消息发送失败,应答码{},原因{},交换机{},路由键{},消息{}",replyCode, replyText, exchange, routingKey, message.toString());// 如果有业务需要,可以重发消息});} } 1.1.3.定义ConfirmCallback ConfirmCallback可以在发送消息时指定,因为每个业务处理confirm成功或失败的逻辑不一定相同。 public void testSendMessage2SimpleQueue() throws InterruptedException {// 1.消息体String message = "hello, spring amqp!";// 2.全局唯一的消息ID,需要封装到CorrelationData中CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString());// 3.添加callbackcorrelationData.getFuture().addCallback(result - {if(result.isAck()){// 3.1.ack,消息成功log.debug("消息发送成功, ID:{}", correlationData.getId());}else{// 3.2.nack,消息失败log.error("消息发送失败, ID:{}, 原因{}",correlationData.getId(), result.getReason());}},ex - log.error("消息发送异常, ID:{}, 原因{}",correlationData.getId(),ex.getMessage()));// 4.发送消息rabbitTemplate.convertAndSend("task.direct", "task", message, correlationData);// 休眠一会儿,等待ack回执Thread.sleep(2000); } 1.2.消息持久化 生产者确认可以确保消息投递到RabbitMQ的队列中,但是消息发送到RabbitMQ以后,如果突然宕机,也可能导致消息丢失。 要想确保消息在RabbitMQ中安全保存,必须开启消息持久化机制。 交换机持久化 队列持久化 消息持久化 1.2.1.交换机持久化 RabbitMQ中交换机默认是非持久化的,mq重启后就丢失。 SpringAMQP中可以通过代码指定交换机持久化: @Bean public DirectExchange simpleExchange(){// 三个参数:交换机名称、是否持久化、当没有queue与其绑定时是否自动删除return new DirectExchange("simple.direct", true, false); } 事实上,默认情况下,由SpringAMQP声明的交换机都是持久化的。 可以在RabbitMQ控制台看到持久化的交换机都会带上D的标示: 1.2.2.队列持久化 RabbitMQ中队列默认是非持久化的,mq重启后就丢失。 SpringAMQP中可以通过代码指定交换机持久化: @Bean public Queue simpleQueue(){// 使用QueueBuilder构建队列,durable就是持久化的return QueueBuilder.durable("simple.queue").build(); } 事实上,默认情况下,由SpringAMQP声明的队列都是持久化的。 可以在RabbitMQ控制台看到持久化的队列都会带上D的标示: 1.2.3.消息持久化 利用SpringAMQP发送消息时,可以设置消息的属性(MessageProperties),指定delivery-mode: 1:非持久化 2:持久化 用java代码指定: 默认情况下,SpringAMQP发出的任何消息都是持久化的,不用特意指定。 1.3.消费者消息确认 RabbitMQ是阅后即焚机制,RabbitMQ确认消息被消费者消费后会立刻删除。 而RabbitMQ是通过消费者回执来确认消费者是否成功处理消息的:消费者获取消息后,应该向RabbitMQ发送ACK回执,表明自己已经处理消息。 设想这样的场景: 1)RabbitMQ投递消息给消费者 2)消费者获取消息后,返回ACK给RabbitMQ 3)RabbitMQ删除消息 4)消费者宕机,消息尚未处理 这样,消息就丢失了。因此消费者返回ACK的时机非常重要。 而SpringAMQP则允许配置三种确认模式: •manual:手动ack,需要在业务代码结束后,调用api发送ack。 •auto:自动ack,由spring监测listener代码是否出现异常,没有异常则返回ack;抛出异常则返回nack •none:关闭ack,MQ假定消费者获取消息后会成功处理,因此消息投递后立即被删除 由此可知: none模式下,消息投递是不可靠的,可能丢失 auto模式类似事务机制,出现异常时返回nack,消息回滚到mq;没有异常,返回ack manual:自己根据业务情况,判断什么时候该ack 一般,我们都是使用默认的auto即可。 1.3.1.演示none模式 修改consumer服务的application.yml文件,添加下面内容: ### 1.3.1.演示none模式修改consumer服务的application.yml文件,添加下面内容: 修改consumer服务的SpringRabbitListener类中的方法,模拟一个消息处理异常: @RabbitListener(queues = "simple.queue") public void listenSimpleQueue(String msg) {log.info("消费者接收到simple.queue的消息:【{}】", msg);// 模拟异常System.out.println(1 / 0);log.debug("消息处理完成!"); } 测试可以发现,当消息处理抛异常时,消息依然被RabbitMQ删除了。 1.3.2.演示auto模式
http://www.pierceye.com/news/796246/

相关文章:

  • 188旅游网站源码下载做个爬架网站如何做
  • 中国做的比较好的网站设计公司有哪些可以做翻译兼职的网站吗
  • 深圳做网站建设公司dw学生个人网页制作视频
  • html网页设计代码作业网站衡水武邑县建设局网站
  • 网站后台登陆验证码wordpress 前台加载慢
  • 网站推广去哪家比较好专门做网站的公司叫什么
  • 前端做项目的网站资源公司做网站的步骤
  • 资源分享网站怎么建设网站建设百度云
  • 宣讲家网站官德修养与作风建设短视频seo关键词
  • 更新网站怎么弄建设工程合同范本工程施工合同范本
  • 外贸网站建设有什么需要注意的吗白山网站设计
  • 哪家做网站性价比高宁波seo网络优化哪家好
  • 望京做网站微信订阅号怎么做网站
  • 分销系统网站建设网站建设 51下拉平台
  • 怎么才能自己做网站怎么自己制作app
  • 爱看视频的网站政务公开既网站信息化建设会议
  • 做外单什么网站好网站模板下载之后怎么做
  • 网站维护细则微博同步wordpress
  • 网站微商城的建设新网域名备案
  • 网站举报有奖平台北京vi设计公司怎么样
  • Wix做的网站在国内打不开网站开发专业就业好不好
  • php语言做网站网站流量与带宽
  • 网站推广经验做网站职校选什么专业
  • 搜英文关键词网站凯里seo排名优化
  • 哪个网站可以帮忙做简历培训网网站源码
  • 万宁市住房和城乡建设局网站自助建站加盟
  • 创建一个网站需要什么wordpress 支付 api接口
  • 怎么样做免费网站建筑招工找活平台
  • 虚拟机中做网站家政服家政服务网站模板
  • 佛山企业网站建设流程网站开发 前端如何学习