7

我有一个 CRUD 网络服务,我的任务是试图找出一种方法来确保在数据库出现故障时我们不会丢失数据。每个人都知道,如果数据库出现故障,我们将无法获得“读取”,但对于特定的操作子集,我们希望确保我们不会丢失数据。

我的印象是,0MQ、RabbitMQ 或 Microsoft MQ 服务之一等服务涵盖了这一点。虽然经过几天的阅读和研究,我什至不确定我们所说的MQ服务中的消息是否包括数据库操作。然而,我 100% 确信我可以排队尽可能多的 hello world。

如果我可以使用消息队列为数据库添加一层保护,我会倾向于 Rabbit(因为它似乎会在崩溃中持续存在)但由于目标是 Microsoft SQL 服务器数据库,可能是他们的解决方案之一(例如SQL Service Broker 或 MSMQ)更合适。

我还不确定的真正基本问题是我是否在玩正确的纸牌(可以这么说)。

随着对高可用性 web 服务的渴望,如果数据库出现故障,它仍然可以运行,将 Rabbit MQ 实例放在 web 服务和数据库“之间”是否有意义?也许链中的正确链接是让 RabbitMQ 向网络服务器发送消息?

还是有其他解决方案可以实现这一目标?目前有很多关于在数据库中断或其他情况下找到卷起博客的方法的想法......但我们仍处于足够早的阶段,(至少我)不知道我是什么'我要做。

消息队列是正确的解决方案吗?

4

1 回答 1

3

在服务和它的数据库操作之间引入消息队列无疑是提高服务可用性的一种方法。在存储转发场景中,写入本地临时队列总是比写入远程数据库服务器更可用,只需作为本地操作即可。

此外,通过使用队列,您可以更好地控制数据库在高峰时必须处理的数据库流量的数量和性质。数据库写入可以排队、路由,甚至以不同的顺序提交。

但是,为了做到这一点,您需要注意,当执行数据库写入时,它是离线处理的。即使在这种情况几乎是瞬间发生的情况下,您也会失去当前服务的同步特性给您带来的好处,即您的服务使用者始终可以知道数据库写入操作是否成功。

我在这里之前已经写过这个主题。发布问题的用户对您有类似的担忧。您是否这样做是您必须根据您的消费者是否关心的事情做出的决定。

至于您正在考虑的技术堆栈,这个离线模型几乎可以用它们中的任何一个来实现,除了服务代理可能的例外,它不能很好地与代码集成(请参阅我的答案:https://stackoverflow .com/a/45690344/569662)。

如果您使用的是 Windows 并且不太可能需要迁移,我会选择 MSMQ(它支持通过事务队列的持久消息传递),因为它是轻量级的并且是 Windows 的一部分。

于 2012-08-30T09:05:30.740 回答