我们首先了解从生产到消费的整个过程如下:如下:
生产 - > MQ Broker->消费。因此,这三个链接可能会失去新闻。
当生产者将数据发送到RabbitMQ时,由于网络问题,数据可能会丢失。
1.使用交易(性能差)
与RabbitMQ客户端中的事务机制有关的三种方法:Channel.txSelect,Channel.txCommit和Channel.txRollback.Channel.txSelect用于将当前通道设置为交易模式。channel.txcommit用于提交交易,并使用channel.txrollback用于事务回滚。通过通道打开事务后。txSelect方法,我们可以向兔子qubbitmq发布消息。如果交易成功提交,该消息将到达Rabbitmq.t。在该时间,我们可以捕获它,然后通过执行渠道来实现交易回滚。TXROLLBACKMEDAGT.TXROLLBACK MEDAT.NOTE,RABBITMQ中的事务机制与交易概念不同。在大多数数据库中,您需要注意以区分。
交易确实可以解决消息发送者和兔子之间的确认问题。只有当兔子成功的消息成功时,交易才能成功提交,否则交易可以在捕获异常后回滚,同时,可以重新处理该消息。兔子的性能。
2.发送回扣确认(建议)
生产商设置了渠道以确认。通道进入确认模式后,将为频道上发布的所有消息分配一个唯一的ID(从1开始)。一旦消息传递给所有匹配的队列,将分配给所有匹配的队列。RABBITMQ将向生产者发送确认(BASIC.ACK)(包括消息的唯一ID),这使得制片人意识到新闻已经到达目的地了如果消息和队列持续正确,然后确认该消息将在将消息写入磁盘之后发送。确认消息中的递送数据传递回兔子的生产者,包含确认消息的序列号。此外,RabbitMQ还可以在Channel.basicack方法中设置多个参数,表明该序列号之前的所有消息已经处理过。请注意以区分确认和消费确认之间的差异。
注意这些要点:
为了防止RabbitMQ本身丢失数据,您必须打开RabbitMQ的持久性,也就是说,该消息将持续很长时间,即使该消息写入消息,兔子自身也将自动读取存储的数据恢复之前。除非非常罕见,否则RabbitMQ并不耐用,并且可能会导致少量数据丢失,但是这种概率很小。
设置持久性有两个步骤。首先是在创建队列时将其设置为持久。这可以确保RabbitMQ耐用队列的元数据,但不会持续很长时间;在发送消息时,将递送符号设置为2,以将消息设置为持久。目前,RabbitMQ将持续到磁盘的消息。您必须同时设置这两个持久性。即使RabbitMQ挂起,再次重新启动,它将从磁盘重新启动以还原队列以恢复该队列中的数据。
持久性可以与生产者的确认机制合作。只有在新闻持久到磁盘耐用之后,制作人才会ACK,因此,即使兔子磁盘耐用之前挂了兔子,数据丢失了,并且丢失了数据。生产者无法接收ACK,您也可以自己发送。
如果未打开生产者的确认机制,即使您已经打开了RabbitMQ的持续机制,也可能使用RabbitMQ编写此消息,但是没有时间在磁盘上持续。挂起,内存中的一点数据将丢失。
为了确保消息从队列接触到消费者,RabbitMQ提供了消息确认机制。当订阅队列时,消费者可以指定自动Autoack参数。当autoack等于false时,RabbitMQ将等待消费者在从内存(或磁盘上移动消息)之前先发出确认信号(本质上,删除标记首先是删除。然后)。当自动乘以等于true时,兔子兔子will will will will自动设置发送消息以确认,然后从内存(或磁盘)中删除,而无需消费者是否真正消耗这些消息。
使用消息确认机制后,只要将自动口气参数设置为false,消费者就有足够的时间处理消息(任务)。消息直到消费者明确调用basic.ack命令为止。
在这里,我们可以在当前队列中看到“就绪”状态,以及当前队列中“就绪”状态的消息数以及“未添加”的消息的数量,这些消息数与等待传递到的消息的数量相对应消费者并已经交付给消费者,但是未收到确认信号的消息数量。
如果您不在这里说,您可以看到我的Springboot Integration Rabbitmq中的步骤。在这里,我们直接撰写生产者和消费者。
我们在上一个项目中进行了相应的修改,并通过HTTP产生消息。我们直接在中国添加了简单生产方法。
内容如下:
我们在浏览器中测试生产商,启动服务,然后访问“ http://127.0.0.0.1:8080/producter”。
注意:
在这里,我们使用调试来启动,向消费者添加断点,因为我们的生产者和消费者在同一服务中,生产新闻将直接被消费者消费。因此,我们添加了断点以防止消费者花费新闻。
您可以看到消息浏览器返回成功发送消息的消息。
我们通过RabbitMQ管理平台查看队列中的消息数:
通过管理平台,我们可以看到有10条消息没有消费。
我们可以看到队列中有10条消息而无需消耗。我们让消费者通过调试来花费信息。
消费后,我们首先检查下一个队列中的消息数:
可以看出,队列中有9个新闻,我们停止消费者服务。
在这里,我们看到队列中的消息数为0,并且消息的消息发生。
因为我们在此处使用消费者自动消息确认机制。当自动乘以等于True时,RabbitMQ将自动设置发送消息以确认,然后从内存(或磁盘)中删除,而无需消费者是否真的会消耗这些消息。
我们通过配置属性打开手动ACK模式。Configure默认情况下自动确认。
在应用程序配置文件中添加以下配置:
在这里,我们将在测试下重新启动该服务,
我们可以看到该控制台在这里已经花了10条消息,但是我们尚未确认消费消息。我们可以查看队列中是否仍然有10个数据。
我们可以在队列中看到10条消息。如果我们重新启动服务并模拟关闭电源,则该消息仍然会丢失。
我们删除了手动ACK代码注释,我们可以看到我们已经消耗了一条消息。我们停止服务并模拟功率 - OFF效果。
我们检查消息队列中的数据,9,而不是0。在这种方式上,消费者终端不会导致消费者数据由于功率故障而丢失。
1.生产者打开消息确认机制
2.消息队列数据耐用
3.消费者手动ack
4.制作人消息记录+常规补偿机制
5.服务能力,等等。
6.消息挤压处理等
此处的内容的内容在随后的文章中分别分析。这只是每个人都需要注意的事情。包括使用TTL和DLX队列。
原始:https://juejin.cn/post/7096723479558357022