【问题标题】:Scalable System Architecture/Design for Reading/Parsing Files用于读取/解析文件的可扩展系统架构/设计
【发布时间】:2012-04-08 15:01:57
【问题描述】:

背景:我正在设计一个软件应用程序,它可以读取数百万或更多文件并转换或仅解析这些文件。部分需求是构建一个可扩展的分布式系统,以便可以相应地扩展读取和解析。

基本上,文件名的最低限度详细列表是一个数据库,客户端需要访问该列表才能知道接下来需要解析/转换哪些文件。这些文件再次位于另一个服务器/位置。 虽然大多数部分都是设计好的,但需要重新审视的一个关键部分是将文件名提供给不同客户的设计。

我现在有两个选择:

  1. 设计一个位于 DB 旁边的单一服务,并将所有请求引导到文件名并提供给客户端。因此,在这种情况下,客户端与服务(预定义的协议/格式)对话并获取列表。

  2. 将客户端设计为直接与 DB 对话并在客户端内实现同步/通道化。

我对第一个选项的唯一关注是,这是一个可扩展的架构/设计吗?有没有人在可扩展架构中处理过这样一种情况,即一种资源成为扩展的关键(在我的情况下,它可能是一项服务为所有客户端提供/服务)

【问题讨论】:

  • 文件是驻留在数据库表中还是存储在文件系统中?
  • @home:只有文件名驻留在数据库中。文件位于同一网络其他地方的不同物理服务器上。

标签: database-design architecture scalability large-scale


【解决方案1】:

我建议在您的数据库之上使用分布式数据网格,例如 GigaSpaces (http://www.gigaspaces.com/datagrid)。通过这种方式,您可以将数据分区到多台机器上并降低数据库上的争用 - 客户端将从数据网格的不同实例中读取要处理的文件。 然后,通过随着负载的增加增加数据网格分区的数量并决定如何在数据网格实例之间对数据进行分区,可以实现可伸缩性。

为了确保只有一个客户端读取要处理的特定文件,需要考虑多种可能性,其中一种可能是使用数据网格的获取操作(读取和删除),以确保只有一个客户端“获取”一个要处理的文件。

GigaSpaces 还提供了出色的监控工具,让您可以监控负载(活跃度、统计数据等)

【讨论】:

    【解决方案2】:

    我建议你看看消息队列,例如 Rabbit MQ(http://www.rabbitmq.com)、Microsoft Message Queue (http://bit.ly/GMo4iI) 和 IBM Message Queue (http ://bit.ly/GMo6qY),它已经有了一个可扩展的架构。

    您可以设置客户端从队列中请求消息,并配置每个消息正文以包含要处理的文件的详细信息。处理完文件后,客户端可以从队列中删除消息。

    您需要设置机制以确保不会同时读取相同的文件等,但这可以在队列级别完成,您可以将每个客户端配置为查看特定的队列或消息优先级。

    【讨论】:

    • 消息传递框架是这种场景的不错选择。我还得看看 RabbitMQ 和 MSMQ,它们提供了处理客户端的发布/订阅方法。
    猜你喜欢
    • 2014-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-20
    • 1970-01-01
    • 2012-10-29
    • 2010-12-15
    • 2010-09-24
    相关资源
    最近更新 更多