2012-02-17 45 views
2

我试图将当前的应用程序更改为缩放。快速写入永久队列

目前它每小时最多可处理几百万个事件,但当我切换到SaaS模型时,卷的容量预计会增加10到100倍,所以能够以分布式方式执行处理非常重要时尚。

该应用程序是一个Web应用程序,目前每小时接收120万个事件。它使用2个Tomcat服务器,每个服务器监听500个线程和一个工作管理器排队事件,然后产生几百个工作线程来后处理事件。

我想要做的是将写入与处理分离并将处理移至分布式环境。

  1. 快速写入到磁盘的事件。

    这里的解决方案可以像写入LinkedBlockingQueue一样简单,并将成百上千个条目的批次转储到文件中,或者使用已经完成此操作的好的库或调整数据库以支持这种类型的合理排队时尚。

    如果系统变得不可用,则无法捕获上次事件并不重要,重点在于服务器工作时的性能。

  2. 将事件处理移至分布式系统。

    我需要将数据移动到分布式系统(例如HDFS)。还有什么其他选择?处理具有中等复杂度(例如,一些复杂性在自连接中生成频繁项目集并进一步滤除该集合,其他部分涉及跨越多个层次结构聚合数据)。我目前使用数据库(MySql & DB2)并考虑Hadoop。任何其他选项?

  3. 将结果存储在只读快速读取系统中。

  4. 我目前使用SOLR,没有更好的选择

我知道这个问题产生了多个主题,任何输入赞赏。让我知道是否有更好的标签可以使用。

谢谢!

Sebi

回答

1

最好的系统,既能够插入和查询 - 的确是RDBMS。但它不可扩展。 NoSQL系统不可扩展,因为它们构建得更好,但是因为他们放弃了一些东西。让我们看看它们可以构建什么。
HBase和Cassandra都是专门为将随机事件插入转换为顺序磁盘IO而构建的。换句话说 - 它们是编写优化的系统,您可以将它们视为完美的分布式数据库索引。因此,通过添加更多节点,您可以获得所需的任何插入速率。

关于连接和聚合是存在问题的一点。
如果您能够成功设计您的密钥,以便将数据进行汇总,则可以高效地提取和汇总数据。
连接也有问题,但有一个选项可以写入已经预先加入的数据。您应该在应用程序级别执行此操作。
对于更复杂的处理,您需要使用MapReduce,但它可能会影响插入速率。
DataStax的Brisk听起来很适合您的情况,因为它具有Cassandra与MapReduce预集成的功能,可以在Cassandra Data上运行MapReduce。它还能够减少故事中OLTP部分的MapReduce影响。

0

一些问题听起来像他们有JMS作为解决方案。这是一个队列,它应该是快速的,它是可靠的(跨机器故障),并且它是持久的。

例如,可以将ActiveMQ配置为强制客户端等待数据提交到多台计算机上的光盘,方法是将其设置为“经纪人网络”。请参阅http://activemq.apache.org/networks-of-brokers.html

它还允许您将邮件标记为永久性的,以便经纪人可以在重新启动后继续工作。我强烈建议使用ActiveMQ的http://activemq.apache.org/kahadb.html建议,因为旧版本存在严重问题。

这有助于分配事件,但对处理没有任何帮助,也没有实际数据的最终存储。有多少客户需要访问多少数据,以及数据生成多久?您可以使用JMS中的“主题”将消息分发给所有客户端,还可以使用“上次映像主题”等概念在代理上存储某些状态,以便您的客户端可以重新启动。 http://activemq.apache.org/subscription-recovery-policy.html解释了这些。

尽管如此,听起来好像你最终会用Hadoop来处理信息,所以不妨使用内置到它们堆栈中的任何东西。 :)

0

您可以使用内存映射文件作为持久队列。

此库支持持续的事件驱动消息,以每秒数百万次(而不是每小时)的速度在进程之间产生亚微秒级的延迟。它也非常简单(等级太低大多数情况的使用,但你可以使用它作为一个起点)今天

https://github.com/peter-lawrey/Java-Chronicle

+0

嗨,彼得,谢谢你的建议。这看起来很有趣。 我可以看到,使用它可以暂时保留来自所有Web服务器线程的请求,并且在另一端有N个进程以批处理方式(每秒左右)将数据快速移动到分布式环境中的N台机器,以处理加载。 队列能够在崩溃后恢复吗? – sfeher 2012-02-20 14:56:14

+0

如果您的程序崩溃,则保留所有更改。如果最后一个条目不完整,它不会出现在索引中。为了最大限度地提高性能,它不保证写入磁盘,所以如果系统崩溃(例如内核崩溃),您可能会丢失很多未提交的更改(在重负载下) – 2012-02-20 22:18:47

+0

您可以使批处理大小动态变化。即读取等待请求(达到某个限制)处理它们,重复。当负载相对较低时,这将导致小批量响应批次,并且在重负载时批量越来越大。 – 2012-02-20 22:21:47