你用了消息队列,你知道这个消息队列如何保证消息的可靠性传输吗
消息可靠性传输,是非常重要,消息如果丢失,可能带来严重后果,一般从是个角度去分析
producer端:
不采用oneway发送,使用同步或者异步方式发送,做好重试,但是重试的Message key必须唯一
投递的日志需要保存,关键字段,投递时间、投递状态、重试次数、请求体、响应体
broker端:
多主多从架构,需要多机房
同步双写、异步刷盘 (同步刷盘则可靠性更高,但是性能差点,根据业务选择)
机器断电重启:异步刷盘,消息丢失;同步刷盘消息不丢失
硬件故障:可能存在丢失,看队列架构
consumer端
消息队列一般都提供的ack机制,发送者为了保证消息肯定消费成功,只有消费者明确表示消费成功,队列才会认为消息消费成功,中途断电、抛出异常等都不会认为成功——即都会重新投递,每次在确保处理完这个消息之后,在代码里调用ack,告诉消息队列消费成功
消费端务必做好幂等性处理
消息消费务必保留日志,即消息的元数据和消息体,