当前位置: 首页 > 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.zqtcl.cn/news/842275/

相关文章:

  • 如何设计一个漂亮的网站电商设计素材
  • 沈阳建设银行网站首页果冻影视传媒有限公司
  • 建设部网站有建筑施工分包网站规划设计方案
  • 网站wap怎么做郑州做网站华久科技
  • 哪里网站开发好姜堰网站定制
  • 广东网站开发需要多少钱百度问答官网
  • 建设电影网站的关键wordpress简码怎么用
  • 做网站的linux程序代码北京公司减资流程
  • 四川省住房建设厅网站进不去wordpress 无限下拉菜单
  • 培训网站图片网络编程基础知识
  • 外销网站怎么做的上海住房与城乡建设部网站
  • 平台网站建设教程网站建设谈业务要知道什么
  • php网站开发试题济南网站排名公司
  • 没有官方网站怎么做seo优化营销推广平台都干什么的
  • 网盘搜索网站怎么做中国建设银行网站股份结构变化
  • 有ip怎么用自己的主机做网站惠州网站制作维护
  • 优质的网站制作在线编辑器
  • 盘锦做网站电话网络营销做私活网站
  • 有关网站建设的毕业设计外卖网站的建设与推广
  • cms 做网站用模板网站做h5宣传页多少钱
  • 坪山网站建设行业现状官方建网站有哪些步骤
  • 软件下载网站模版单页网站开发实例下载
  • 张家口网站建设vewanseo实战技术培训
  • 机加工网站室内设计联盟论坛
  • 汕头装修接单网站wordpress php加密
  • 重庆网站建设推广设置wordpress静态主页
  • 科技设计公司网站模板下载网站建设计划 文库
  • 建设美食网站做的好的阅读类的网站有哪些
  • 全屏网站模板制作教程吴江建设局房产网站
  • 浠水网站建设漳州找人做网站要求哪些