我有一个ActiveMQ Artemis队列,我从中读取队列并进行一些处理并将其写入数据库。队列消息非常重要,我不能丢失消息。
我的处理:
读取队列(大批量)->处理->写入数据库(事务性)
我的问题是,如果我的服务在“处理”阶段出现故障,将会发生什么。由于我已经阅读了消息(使用Spring JMS),因此我将丢失该批次(即使我使用的是client_ack-Spring在读取消息后也会进行确认)。有避免这种情况的模式吗?
我的解决方案是使用JMS事务并为批处理编写不同的主题,如下所示。
读取队列->写入某些主题->提交JMS事务->处理->写入数据库(事务性)
这是好模式吗?我可以使用什么替代方法?
如果无法处理该消息,则发送否定确认是很好的。您可以在交易过程中发送NACK。例如,带有STOMP协议的NACK。该消息然后保留在队列中。 ActiveMQ可以配置为在收到来自消费者的NACK时进行重新交付尝试。