用于读取/解析文件的可扩展系统架构/设计

时间:2012-03-24 06:11:13

标签: database-design architecture scalability large-scale

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

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

我现在有两个选择:

  1. 设计位于数据库旁边的单个服务,并将所有请求通道化为文件名并提供给客户端。因此,在这种情况下,客户端与服务(预定义协议/格式)通信并获取列表。

  2. 设计客户端直接与数据库通信,并在客户端内实现同步/通道化。

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

2 个答案:

答案 0 :(得分:2)

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

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

GigaSpaces还提供了一个很好的监控工具,因此您可以监控您的负载(活跃度,统计数据等)。

答案 1 :(得分:0)

我建议您查看消息队列,例如Rabbit MQ(http://www.rabbitmq.com),Microsoft Message Queue(http://bit.ly/GMo4iI)和IBM Message Queue(http ://bit.ly/GMo6qY),已经有一个缩放架构。

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

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