一个可能主要是理论上的问题,但我很乐意让我的担忧得到休息(或确认) .

我构建了一个脚本组件来从RabbitMQ中提取数据 . 在RabbitMQ上,我们基本上 Build 了一个持久队列 . 这意味着即使服务器重新启动,消息也将继续添加到队列中 . 这种结构允许我们定期执行包并获取自上次我们这样做以来的所有“新”消息 .

(我们知道RabbitMQ不是为了适应这种情况而设置的,而是期望有一个持续的监听器来处理消息 . 但是,我们不习惯在SQL Server启动时启动一些任务,并且几乎正在运行每周7天,每天24小时处理这个,所以我们构建了一些我们可以安排每隔n分钟运行并以这种方式清空队列的东西 . 如果我们无法运行任务,我们很可能正在处理一个失败的SQL Server,并且有不同的优先事项) .

组件 Build 连接,然后连接到我们从中提取消息的特定交换队列 . 消息采用JSON格式,因此我们将消息反序列化为我们在脚本组件中定义的类 .

对于找到的每条消息,我们都会禁用自动确认,因此我们可以对其进行处理,并且只有在完成后才会对其进行确认(这可以确保消息将被处理,并且不会漏掉) . 然后我们对消息进行反序列化并将其推送到脚本组件的输出缓冲区 .

有些地方可能会出错,所以我们在代码中构建了一堆Try / Catch块 . 但是,看到我们正在处理队列方面,并且我们需要可用的信息,我想知道是否有人可以解释如何/何时处理发送到输出缓冲区的消息 .

它被批量然后推了吗?它是否立即发送,SSIS组件是否可能无法及时将信息更新回SSIS?

我们是否有可能确认一条消息,但它最终没有被提交到我们的数据库,但是从队列中弹出(我认为一旦消息被确认就会发生)?