如何保证RocketMQ消息不丢失

rocket mq在生产阶段、Brocker存储阶段、消费阶段都会出现消息丢失。

1、生产者防止丢失消息。

a.同步阻塞的方式发送消息,加上失败重试机制,可能broker存储失败,可以通过查询确认

b.异步发送需要重写回调方法,检查发送结果

c.ack机制,可能存储CommitLog,存储ConsumerQueue失败,此时对消费者不可见

2、broker

Rocket mq有两种刷盘机制,一种是异步刷盘。一种是同步刷盘。在集群环境下,想要消息零丢失,要进行同步刷盘机制。

broker: 同步刷盘、集群模式下采用同步复制、会等待slave复制完成才会返回确认

3、消费者

offset手动提交,消息消费保证幂等

实际解决方案

发送阶段

/ 同步发送
public SendResult send(Message msg) throws MQClientException, RemotingException,      MQBrokerException, InterruptedException {}

// 异步发送,sendCallback作为回调
public void send(Message msg,SendCallback sendCallback) throws MQClientException, RemotingException, InterruptedException {}

// 单向发送,不关心发送结果,最不靠谱
public void sendOneway(Message msg) throws MQClientException, RemotingException, InterruptedException {}

SEND_OK:消息发送成功,Broker刷盘、主从同步成功
FLUSH_DISK_TIMEOUT:消息发送成功,但是服务器同步刷盘(默认为异步刷盘)超时(默认超时时间5秒)
FlUSH_SLAVE_TIMEOUT:消息发送成功,但是服务器同步复制(默认为异步复制)到Slave时超时(默认超时时间5秒)
SLAVE_NOT_AVAILABLE:Broker从节点不存在
注意:同步发送只要返回以上四种状态,就代表该消息在生产阶段消息正确的投递到了RocketMq,生产阶段没有丢失。
如果业务要求严格,可以使用同步发送,并且只取SEND_OK标识消息发送成功,其他返回值类型的数据,需要在业务维度的 终极0丢失保护措施:本地消息表+定时扫描重试。

发送消息失败表

DROP TABLE IF EXISTS `rocketmq_pro_msg_failure`;
CREATE TABLE `rocketmq_pro_msg_failure`  (
  `business_id` bigint(20) NOT NULL COMMENT '业务id',
  `msg_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '消息id',
  `topic` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '主题',
  `tag` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '标识',
  `content` varchar(4096) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '内容',
  `create_date` timestamp NOT NULL COMMENT '创建时间',
  `status` int(4) NOT NULL COMMENT '状态1失败2成功',
  PRIMARY KEY (`business_id`) USING BTREE,
  INDEX `idx_topic_tag_create_date`(`topic`, `tag`, `create_date`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值