我正在尝试设计一个通过web服务向数据库报告活动事件的系统。web服务和数据库已经构建好了(COTS软件(——我所要做的就是提供事件源。
不过,问题是事件源需要具有容错性。我们有多个复制的数据库,我可以与之交谈,所以如果与我交谈的web服务或数据库出现故障,软件可以快速切换到另一个出现故障的数据库。
不过,我需要帮助的是当所有数据库都关闭时的情况。我已经设计了一个队列,当事件堆积时,它会抓住它们(并在连接恢复后将它们爆发(,但队列是一个内存结构:如果我的应用程序在这种状态下崩溃,或者电源丢失,等等,那么队列中的所有事件都会丢失。这是不可接受的。我需要的是一种持久化事件的方法,这样当数据库恢复在线时,即使在断电或崩溃的情况下,我也可以发送一系列排队的事件。
我知道我不想重新实现队列本身,将文件系统用作后备存储。这是可行的(我已经尝试过了(,但由于硬盘驱动器成为瓶颈,这种方法会大大降低系统速度。除此之外,我想不出任何一种方法来设计这个系统,使所有事件只有在无法访问数据库时才能安全地存储在硬盘上。
有人有什么想法吗
当我需要具有容错性的消息传递(和/或有保证的传递,根据您的描述,我猜您也需要(时,我通常会求助于MSMQ。它提供容错(消息存储在磁盘上,以备机器重新启动时使用(和有保证的传递(消息将自动不断地重新发送,直到收到为止(,以及事务性发送和接收、消息日志、有害消息处理和其他功能。
我已经能够使用MSMQ实现每秒数千条消息的吞吐量。坦率地说,我不确定你会不会在容错的同时变得更好。
msmq。我想你也可以看看Job对象的概念。
我同意那些最好使用现成系统的人,比如MSMQ,手里拿着一组消息模式。
无论如何,如果您必须自己做,您可以使用内存中的数据库,而不是自己序列化数据,我相信它应该足够快。