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

网站建设快速便宜html5教程初学者

网站建设快速便宜,html5教程初学者,wordpress 内存占用高,专门做环保设备的网站被询问如何防止MQ消息被重复消费时#xff0c;其实是在考察候选人对消息队列、分布式系统设计以及容错机制的理解#xff0c;通过这些问题#xff0c;可以全面了解候选人在处理MQ消息重复消费问题时的思考方式、技术能力和实践经验#xff0c;从而评估其是否适合担任相关岗… 被询问如何防止MQ消息被重复消费时其实是在考察候选人对消息队列、分布式系统设计以及容错机制的理解通过这些问题可以全面了解候选人在处理MQ消息重复消费问题时的思考方式、技术能力和实践经验从而评估其是否适合担任相关岗位。 MQ实现策略 MQ提供了以下几种方式来防止消息被重复消费 1.消费者手动确认消息 在消费者消费消息后通过调用basic.ack()方法手动确认消息已被消费。这样一来RabbitMQ就会从队列中删除该消息防止消息被重复消费。 java代码示例 // 创建连接和频道 Connection connection factory.newConnection(); Channel channel connection.createChannel(); // 设置消息确认模式为手动确认 channel.basicQos(1); // 定义消息消费者 Consumer consumer new DefaultConsumer(channel) {Overridepublic void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {try {// 模拟消费消息String message new String(body, UTF-8);System.out.println(Received message: message);// 手动确认消息消费channel.basicAck(envelope.getDeliveryTag(), false);} catch (Exception e) {// 消息消费失败进行异常处理channel.basicNack(envelope.getDeliveryTag(), false, true);}} }; // 开始消费消息 channel.basicConsume(queueName, false, consumer);2.消息去重(使用乐观锁) 在消费者消费消息前可以将消息的唯一标识保存在数据库或缓存中。在消费者接收到消息后先检查数据库或缓存中是否存在该消息的唯一标识如果存在则表示该消息已经被消费过可以忽略如果不存在则表示该消息是新的可以进行消费。 java代码示例 // 创建连接和频道 Connection connection factory.newConnection(); Channel channel connection.createChannel(); // 定义消息消费者 Consumer consumer new DefaultConsumer(channel) {Overridepublic void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {try {// 模拟消费消息String message new String(body, UTF-8);System.out.println(Received message: message);// 判断消息是否已经消费过可以通过数据库或缓存进行判断if (!isMessageConsumed(message)) {// 进行消息消费consumeMessage(message);}// 手动确认消息消费channel.basicAck(envelope.getDeliveryTag(), false);} catch (Exception e) {// 消息消费失败进行异常处理channel.basicNack(envelope.getDeliveryTag(), false, true);}} }; // 开始消费消息 channel.basicConsume(queueName, false, consumer);3.使用消息的全局唯一标识 可以在消息的属性中添加一个全局唯一标识例如UUID确保每条消息都具有唯一性。消费者在消费消息时可以通过检查全局唯一标识来判断消息是否已经被消费过。 java代码示例 // 创建连接和频道 Connection connection factory.newConnection(); Channel channel connection.createChannel(); // 定义消息消费者 Consumer consumer new DefaultConsumer(channel) {Overridepublic void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {try {// 模拟消费消息String message new String(body, UTF-8);System.out.println(Received message: message);// 判断消息是否已经消费过可以通过全局唯一标识进行判断String messageId properties.getMessageId();if (!isMessageConsumed(messageId)) {// 进行消息消费consumeMessage(message);// 将消息的全局唯一标识保存到数据库或缓存中saveMessageId(messageId);}// 手动确认消息消费channel.basicAck(envelope.getDeliveryTag(), false);} catch (Exception e) {// 消息消费失败进行异常处理channel.basicNack(envelope.getDeliveryTag(), false, true);}} }; // 开始消费消息 channel.basicConsume(queueName, false, consumer);4.设置消息的过期时间 可以为消息设置一个过期时间在消费者消费消息时先判断消息是否已经过期如果已经过期则不进行消费。 java代码示例 // 创建连接和频道 Connection connection factory.newConnection(); Channel channel connection.createChannel();// 设置队列的消息过期时间 MapString, Object arguments new HashMap(); arguments.put(x-message-ttl, 5000); // 设置消息过期时间为5秒 channel.queueDeclare(queueName, true, false, false, arguments);// 发布消息 String message Hello, RabbitMQ!; AMQP.BasicProperties properties new AMQP.BasicProperties.Builder().expiration(5000) // 设置消息的过期时间为5秒.build(); channel.basicPublish(, queueName, properties, message.getBytes(UTF-8)); System.out.println(Sent message: message);// 关闭连接和频道 channel.close(); connection.close();通过在队列声明时设置x-message-ttl参数来设置队列的消息过期时间。然后通过发布消息时设置expiration属性来设置消息的过期时间。这里将消息的过期时间设置为5秒。需要注意的是RabbitMQ的消息过期时间精度是毫秒级别的可以通过设置整数或字符串形式的时间间隔来指定过期时间。如果同时设置了队列和消息的过期时间以较小的那个为准。 5.使用幂等操作 对于一些幂等操作可以将操作的唯一标识保存在数据库或缓存中。在消费者消费消息时先检查操作的唯一标识是否存在如果存在则表示该操作已经执行过可以忽略如果不存在则表示该操作是新的可以进行执行。 java代码示例 // 创建连接和频道 Connection connection factory.newConnection(); Channel channel connection.createChannel();// 定义消息消费者 Consumer consumer new DefaultConsumer(channel) {Overridepublic void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {try {// 模拟消费消息String message new String(body, UTF-8);System.out.println(Received message: message);// 判断消息是否已经处理过可以通过幂等操作来判断if (!isMessageProcessed(message)) {// 进行消息处理processMessage(message);// 标记消息已处理将消息的唯一标识保存到数据库或缓存中saveProcessedMessage(message);}// 手动确认消息消费channel.basicAck(envelope.getDeliveryTag(), false);} catch (Exception e) {// 消息消费失败进行异常处理channel.basicNack(envelope.getDeliveryTag(), false, true);}} };// 开始消费消息 channel.basicConsume(queueName, false, consumer);// 关闭连接和频道 channel.close(); connection.close();通过isMessageProcessed()方法判断消息是否已经被处理过。如果消息已经被处理过则忽略该消息如果消息还未被处理过则进行消息处理并将消息的唯一标识保存起来。这里的processMessage()方法是具体的消息处理逻辑saveProcessedMessage()方法将消息的唯一标识保存到数据库或缓存中以便后续判断消息是否已经被处理过。需要根据具体的业务逻辑实现isMessageProcessed()、processMessage()和saveProcessedMessage()方法来实现幂等操作。 消息重复消费的原因多种多样不可避免。所以只能从消费者端入手只要能保证消息处理的幂等性就可以确保消息不被重复消费。SS 而幂等性的保证又有很多方案 给每一条消息都添加一个唯一id在本地记录消息表及消息状态处理消息时基于数据库表的id唯一性做判断 消息去重使用乐观锁同样是记录消息表利用消息状态字段实现基于乐观锁的判断保证幂等 基于业务本身的幂等性。比如根据id的删除、查询业务天生幂等新增、修改等业务可以考虑基于数据库id唯一性、或者乐观锁机制确保幂等。本质与消息表方案类似。 设置消息的过期时间可以为消息设置一个过期时间在消费者消费消息时先判断消息是否已经过期如果已经过期则不进行消费。 消费者手动确认消息在消费者消费消息后通过调用basic.ack()方法手动确认消息已被消费。这样一来RabbitMQ就会从队列中删除该消息防止消息被重复消费。
http://www.pierceye.com/news/842275/

相关文章:

  • 网站开发所需技能外链网
  • 广州做家教的网站临沂哪里有做网站
  • 网站建设介绍会发言稿网站开发主页
  • 做推广赚钱的网站如何制作网站策划书
  • 微信公众号商城网站开发能不能不用虚拟主机建设网站
  • iis 网站目录权限vps网站无法通过ip访问
  • 重庆关键词优化咸阳seo培训
  • 专业网站建设分类标准嘉兴网络项目建站公司
  • 做婚礼网站的公司简介网页打不开怎么办页面无法显示
  • 怎么套用模板做网站白嫖二级域名
  • 网站如何进行备案建立平台的步骤
  • 济南免费网站建设网站用什么软件编写
  • 网站如何注册微信公众平台 类型站长要维护网站
  • 美食类网站模板有的网站为什么打不开怎么回事
  • 平面设计网站导航1万元可以注册公司吗
  • 做网站接口多少钱怎样做旅游网站
  • dw制作旅游网站教程天津市区县档案部门网站建设指导意见
  • 关于网站建设的大学pinthis wordpress
  • 济宁 做网站企业做外贸网站常用术语
  • 国内优秀的设计网站推荐网页设计工作室赚钱吗
  • 商汇通网站广州白云学校网站建设
  • 茶叶企业建设网站php网站开发基础
  • 深圳网站建设 猴王网络地方信息网站源码
  • 微网站后台内容设置erp系统定制
  • 图片点击切换网站模板网站开发 北京外包公司
  • 网站正在建设中 免费东莞手机网站设计公司
  • 旅游网站开发成本包括企业管理控制系统
  • 青浦做网站中美最新局势分析
  • 高端网站建设公司哪家公司好有关网站开发的知识
  • 西宁做网站_君博示范cpa做电影网站侵权吗