【问题标题】:Please help me design this event reporting system请帮我设计这个事件报告系统
【发布时间】:2011-06-30 13:38:07
【问题描述】:

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

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

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

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

有人有什么想法吗? =)

【问题讨论】:

  • 在使用文件系统作为后备存储时,您需要什么样的吞吐量无法获得?你用的是什么类型的硬盘?运行“客户端”的机器的规格是什么?
  • 它们是非常便宜的商品机器,旨在运行操作系统和我们的软件。

标签: c# .net architecture fault-tolerance


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 内存数据库无济于事 - 如果计算机崩溃,内存中的任何内容都会丢失。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-28
      • 1970-01-01
      • 1970-01-01
      • 2013-11-26
      • 1970-01-01
      相关资源
      最近更新 更多