1

我正在尝试设计一个通过 Web 服务向数据库报告活动事件的系统。Web 服务和数据库已经构建(COTS 软件)——我所要做的就是提供事件源。

但是,问题是事件源需要容错。我们有多个可以与之通信的复制数据库,因此如果我正在与之通信的 Web 服务或数据库出现故障,该软件可以快速切换到另一个启动的数据库。

我需要帮助的是所有数据库都关闭的情况。我已经设计了一个队列,它将在事件堆积时保留它们(并在连接恢复后将它们爆发),但队列是一个内存结构:如果我的应用程序在这种状态下崩溃,或者如果断电等,则队列中的所有事件都丢失。这是无法接受的。我需要的是一种持久化事件的方法,以便当数据库重新联机时,我可以发送一连串排队的事件,即使在断电或崩溃的情况下也是如此。

我知道我不想重新实现队列本身以将文件系统用作后备存储。这会起作用(我已经尝试过了)-但是随着硬盘驱动器成为瓶颈,这种方法会大大降低系统速度。但除此之外,我想不出一种方法来设计这个系统,使所有事件仅在无法访问数据库时安全地存储在硬盘上。

有没有人有任何想法?=)

4

3 回答 3

0

当我需要具有容错能力的消息传递(和/或保证交付,根据您的描述,我猜您也需要),我通常会求助于 MSMQ。它既提供容错(在机器重新启动时将消息存储在磁盘上)和保证传递(消息将自动并不断地重新发送,直到收到),以及事务性发送和接收、消息日志、有害消息处理等特征。

我已经能够使用 MSMQ 实现每秒数千条消息的吞吐量。坦率地说,我不确定在保持容错的同时你会得到比这更好的东西。

于 2011-06-30T13:51:22.600 回答
0

msmq。我想你也可以看看Job object的概念。

于 2011-06-30T13:54:34.793 回答
0

我同意那些更好地使用像 MSMQ 这样的开箱即用系统的人,手头有一组消息传递模式。

无论如何,如果你必须自己做,你可以使用内存数据库而不是自己序列化数据,我相信它应该足够快。

于 2011-06-30T13:59:58.047 回答