1

在我的项目中,我有一个要求,比如不同的方法将 sql 查询推送到 Rabbit 队列(基本上是一个将消息广播到所有队列的交换器)。与生产相比,此时推送到队列的这些 SQL 查询并不是很重要(基本上用于报告目的),因此当我在服务器上没有太多负载时,我将在不同的环境(其他一些独立项目)中执行这些查询.

现在让我们进入故事的第二部分,在另一端的独立应用程序中有 2 个消费者,它们使用来自 RabbitMQ(交换)的消息(SQL 查询)。一个消费者总是记录(如查询的备份),而其他消费者则在数据库上执行批量更新/插入。

我的问题是什么是实现这个用例的好方法,因为几个原因可能导致少数查询失败,并且因为它是批处理操作,整个批处理将回滚,我无法再次从队列中获取那些已经被消耗的。我知道我必须从我的第二个消费者创建的备份中获取它,但是在遇到任何异常后我必须停止第一个消费者,以及从备份日志中获取特定失败查询的好方法是什么(考虑查询不足,我在想对多日志文件使用滚动附加日志)。感谢您耐心理解我的问题,并请提出解决此问题的好方法。

4

1 回答 1

0

尝试对消费者端可能发生的故障进行分类。可能有

  • 永久性错误(例如无效的 SQL 语句)和
  • 临时错误(网络故障、数据库服务器消失/重新启动,...)等。

对于临时错误,只需重试消息的处理(参见 spring 的重试库)。导致永久错误的消息可能会进入invalid letter queue进一步分析/报告(在重新路由之前将异常作为标题添加到消息中)

于 2015-02-02T21:03:16.943 回答