【发布时间】:2011-06-30 13:38:07
【问题描述】:
我正在尝试设计一个通过网络服务向数据库报告活动事件的系统。 Web 服务和数据库已经建立(COTS 软件)——我所要做的就是提供事件源。
不过,问题是事件源需要容错。我们有多个可以与之通信的复制数据库,因此如果我正在与之通信的 Web 服务或数据库出现故障,该软件可以快速切换到另一个运行的数据库。
我需要帮助的是所有数据库都已关闭的情况。我已经设计了一个队列,它将在事件堆积时保留事件(并在连接恢复后将它们爆出),但队列是一个内存结构:如果我的应用程序在此状态下崩溃,或者如果断电等,则队列中的所有事件都丢失。这是无法接受的。我需要的是一种持久化事件的方法,以便当数据库重新联机时,我可以发送一系列排队的事件,即使在断电或崩溃的情况下也是如此。
我知道我不想重新实现队列本身以将文件系统用作后备存储。这会起作用(我已经尝试过了)-但是随着硬盘驱动器成为瓶颈,这种方法会大大降低系统速度。但除此之外,我想不出一种方法来设计这个系统,以便只有在无法访问数据库时才将所有事件安全地存储在硬盘上。
有人有什么想法吗? =)
【问题讨论】:
-
在使用文件系统作为后备存储时,您需要什么样的吞吐量无法获得?你用的是什么类型的硬盘?运行“客户端”的机器的规格是什么?
-
它们是非常便宜的商品机器,旨在运行操作系统和我们的软件。
标签: c# .net architecture fault-tolerance