织梦网站安装出现dirwordpress如何加入点赞
织梦网站安装出现dir,wordpress如何加入点赞,物业公司会计好做吗,网站报备之后如何建设网站消息队列中的可靠性主要是分为三部分#xff1a;
消息不丢失#xff1a;确保消息从生产者发送到消费者消息不丢失消息不重复#xff1a;确保消息不被重复消费消息顺序性#xff1a;确保消费的顺序性
解决方案主要有以下几部分#xff1a;
消息不丢失 生产者确认机制持久…消息队列中的可靠性主要是分为三部分
消息不丢失确保消息从生产者发送到消费者消息不丢失消息不重复确保消息不被重复消费消息顺序性确保消费的顺序性
解决方案主要有以下几部分
消息不丢失 生产者确认机制持久化机制消费者确认机制高可用
消息不重复 消费者确认机制消息重试机制幂等性设计
消息顺序性 单消费者模式消息编号
生产者确认机制
作用
确保生产者发送的消息成功到达mq避免消息在传输过程中丢失
实现原理
生产者会发送消息之后mq会向生产者返回确认ack或未确认nack信号如果生产者收到ack说明消息已经成功发送
配置方式
开启生产者确认模式
Channel channel connection.createChannel();
channel.confirmSelect(); // 开启确认模式
处理确认和未确认
channel.addConfirmListener((sequenceNumber, multiple) - {// 消息确认System.out.println(Message confirmed: sequenceNumber);
}, (sequenceNumber, multiple) - {// 消息未确认System.out.println(Message not confirmed: sequenceNumber);
});
适用场景
对消息可靠性要求高的场景如金融交易、订单处理等
持久化机制
作用
将消息和队列持久化到磁盘防止mq重启或者崩溃时消息丢失
实现原理
队列持久化将队列中的数据保存在磁盘消息持久化将消息内容保存到磁盘
配置方式
队列持久化
boolean durable true;
channel.queueDeclare(my_queue, durable, false, false, null);
消息持久化
AMQP.BasicProperties properties new AMQP.BasicProperties.Builder().deliveryMode(2) // 2 表示持久化消息.build();
channel.basicPublish(, my_queue, properties, message.getBytes());
适用场景
需要保证消息不丢失的场景如日志存储、重要数据同步
消费者确认机制
作用
确保消费者成功处理消息之后mq才会将消息从消息队列中删除避免消息丢失
实现原理
消费者处理完成消息后手动发送ack信号如果消费者未发送ackmq会将消息重新投递给其他消费者
配置方式
开启消费者确认
boolean autoAck false; // 关闭自动确认
channel.basicConsume(my_queue, autoAck, new DefaultConsumer(channel) {Overridepublic void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {// 处理消息System.out.println(Received: new String(body));// 手动发送 ackchannel.basicAck(envelope.getDeliveryTag(), false);}
});
适用场景
需要确保消息成功处理的场景如订单处理、消息通知等
死信队列
作用
处理无法正常消费的消息被拒绝或者过期避免消息丢失
实现原理
当消息无法被正常消费时mq将其转发到死信队列中死信队列可以配置独立的交换机和路由规则
配置方式
配置死信队列
MapString, Object args new HashMap();
args.put(x-dead-letter-exchange, my_dlx_exchange); // 设置死信交换机
args.put(x-dead-letter-routing-key, my_dlx_routing_key); // 设置死信路由键
channel.queueDeclare(my_queue, true, false, false, args);
适用场景
需要处理异常消息的场景如消息重试失败信息分析等
消息重试机制
作用
当消息处理失败的时候通过重试机制重新投递消息确保消息最终被成功处理
实现原理
消费者捕获异常并拒绝消息同时设置requeuetrue使用死信队列和TTL实现延迟重试
配置方式
拒绝消息重新入队
channel.basicConsume(my_queue, false, new DefaultConsumer(channel) {Overridepublic void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {try {// 处理消息System.out.println(Received: new String(body));channel.basicAck(envelope.getDeliveryTag(), false);} catch (Exception e) {// 处理失败拒绝消息并重新入队channel.basicNack(envelope.getDeliveryTag(), false, true);}}
});
适用场景
需要重试机制的场景如网络抖动、依赖服务不可用等
高可用性
作用
通过集群和经销队里额确保mq在节点出现故障仍然可以要运行避免消息丢失。
镜像队列结构是一主多从所有操作都是主节点完成然后同步给镜像节 点如果主节点宕机后镜像节点会替代成新的主节点
实现原理
集群多个mq节点组成的集群共享数据和队列状态镜像队列将队列镜像到多个节点确保队列的高可用性
配置方式
集群配置
rabbitmqctl join_cluster rabbitnode1
镜像队列配置
MapString, Object args new HashMap();
args.put(x-ha-policy, all); // 镜像到所有节点
channel.queueDeclare(my_queue, true, false, false, args);
适用场景
适用于高可用的场景如分布式系统、关键业务系统等
高可用性数据丢失怎么解决
在镜像队列主从同步的过程中会出现在主从同步完成前主节点就已经宕机可能出现数据丢失。
我们可以通过仲裁队列来进行解决和镜像队列一样都是主从模式支持主从数据同步但是不一样的点就是主从同步基于Raft协议强一致性
并且使用起来也非常简单不需要额外的配置在声明队列的时候只要指定 这个是仲裁队列即可
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/88235.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!