2011-06-30 32 views
1

我试图设计一个系统,通过Web服务向数据库报告活动事件。 Web服务和数据库已经建好(COTS软件) - 我所要做的就是提供事件源。请帮我设计这个事件报告系统

但是,捕捉的是事件源需要容错。我们有多个可以与之交谈的复制数据库,因此如果我所说的Web服务或数据库出现故障,该软件可以快速切换到另一个正在运行的数据库。

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

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

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

+0

使用文件系统作为后备存储时,您需要什么样的吞吐量?你使用的是什么样的硬盘? “客户端”正在运行的计算机的规格是什么? –

+0

他们是非常便宜的商品机器,旨在运行操作系统和我们的软件。 –

回答

0

当我需要通过容错(和/或有保证的交付,基于您的描述我猜你还需要)的消息时,我通常转向MSMQ。它提供容错功能(消息在机器重启时存储在磁盘上)和有保证的交付(消息将自动并不断重发直到它们被接收),以及事务性发送和接收,消息日志记录,中毒消息处理和其他特征。

我已经能够使用MSMQ实现每秒数千条消息的吞吐量。坦率地说,我不确定你会比这更好,同时仍然具有容错能力。

0

我同意家伙们更好地使用像MSMQ这样的盒子系统,并拥有一组消息模式。

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

+0

内存数据库不会帮助 - 如果计算机崩溃,内存中的任何内容都将丢失。 –