为什么消息重发
Producer在发送消息时比如遇到网络问题时,发送后因超时得不到服务器的ack,从而进行重发
RocketMQ对于消费时一直无法消费的消息,超过一定重试次数后,会将消息写入私信队列,避免分区被卡住。
如何解决
利用redis给消息分配一个全局id,
建立一个消息表,consumer消费之前,拿到消息做insert操作,用消息id做唯一主键,重复消费会导致主键冲突,携程的QMQ实现方式
消费端处理消息的业务逻辑保持幂等性
MQTT协议给出服务质量标准
mq
Kafka At least once<br>RocketMQ At least once<br>RabbitMQ At least once<br>
Exactly once:恰好一次。消息在传递时,只会被送达一次,不允许丢失也不允许重复,这个是最高的等级。
At least once: 至少一次。消息在传递时,至少会被送达一次。也就是说,不允许丢消息,但是允许有少量重复消息出现。
At most once: 至多一次。消息在传递时,最多会被送达一次。换一个说法就是,没什么消息可靠性保证,允许丢消息。一般都是一些对消息可靠性要求不太高的监控场景使用,比如每分钟上报一次机房温度数据,可以接受数据少量丢失。