上一篇文章说明了如何检测消息的丢失,现在继续解释如何确保消息不会丢失。
首先,整个生命周期过程是:生产者生成的消息,发送到消息队列,消费者(消费者)从消息队列中提取消息消耗。
知道此过程后,您可以清楚地知道,您需要确保每个阶段的消息可靠传输。
该消息是从生产者端创建的。将消息传输到消息队列后,消息队列在收到消息后将ACK发送给生产者,并说消息已成功接收。
为了确保此阶段的消息可靠传输,有必要从消息的确认机制开始。只要生产者成功收到ACK,就意味着成功。如果未收到ACK或消息队列失败或异常,则将触发重试机制,并将再次发送消息。
如果是同步发送消息,则代码必须是异常捕获的,并且无法在捕获块中发送消息的逻辑;如果这是一条异步发送消息,则代码需要执行消息的失败处理的处理逻辑,以发送回消息。
消息队列需要配置参数以接收消息并成功地写入磁盘,然后再返回生产者side Ack消息。这可以避免在收到消息后不编写磁盘的情况下避免倒退,从而导致消息丢失。
对于群集部署环境的消息队列,当消息发送到两个或多个节点时,返回ACK信息。这可以确保节点关闭后,其他节点保存了消息数据并可以替换服务。
在此阶段,消费者需要使消费者成功地(保存数据库或业务逻辑处理),然后将ACK发送到消息队列。如果中间有异常,导致消息消耗失败,则下一个绘制消息的时间,失败的消息将再次检索。
主要需要在以下三个阶段中避免消息丢失:生产者阶段:需要捕获消息发送的错误,并在发生错误时重试发送消息。Message队列阶段:在成功写入磁盘或磁盘之后或消息已成功发送到两个或多个节点,返回Ack.Consumer阶段:处理业务逻辑后,发送消费确认。