RabbitMQ,ZeroMQ,Service Broker或类似的东西是用于创建高可用性数据库Web服务的适当解决方案吗?

Ale*_*x C 7 sql-server high-availability message-queue rabbitmq zeromq

我有一个CRUD Web服务,并且一直在尝试找出一种方法来确保我们在数据库出现故障时不会丢失数据.每个人都知道,如果数据库出现故障,我们将无法获得"读取",但对于特定的操作子集,我们希望确保不会丢失数据.

我给人的印象是,这是0MQ,RabbitMQ或其中一个Microsoft MQ服务所涵盖的内容.虽然经过几天的阅读和研究,我甚至不确定我们在MQ服务中讨论的消息是否包括数据库操作.然而,我百分百肯定我可以排队尽可能多的你好世界.

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

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

随着高可用性web服务的愿望,即继续当数据库出现故障的功能,它是有意义的把兔子MQ实例的Web服务和数据库"之间"?也许链中的正确链接是让RabbitMQ向网络服务器发送消息?

或者是否有其他解决方案来实现这一目标?目前有很多想法在数据库中断或其他事情中找到一种卷起博客的方法......但是我们还处于足够早的阶段(至少我)不知道我是什么我要去做.

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

tom*_*ern 3

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

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

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

我之前在这里写过关于这个主题的文章。发布问题的用户也有与您类似的担忧。无论你是否这样做,你都必须根据你的消费者是否关心这件事来做出决定。

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

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