快速写入持久队列

时间:2012-02-17 20:07:17

标签: java mysql performance distributed hdfs

我正在尝试将当前的应用程序更改为扩展。

它目前每小时最多可处理几百万个事件,但当我切换到SaaS模型时,预计该数量将增长10到100倍,因此能够以分布式方式执行处理非常重要

该应用程序是一个Web应用程序,目前正在接收120万个事件/小时。它使用2个Tomcat服务器,每个服务器监听500个线程,并使用workManager对事件进行排队,然后生成几百个工作线程来对事件进行后处理。

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

  1. 快速向磁盘写入事件。

    这里的解决方案可以像写入LinkedBlockingQueue一样简单,并将数十万个条目转储到文件中,或者使用一个好的库来执行此操作,或者调整数据库以合理的方式支持这种类型的排队

    如果系统不可用,则无法捕获最后的事件并不是最重要的,重点是服务器工作时的性能。

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

    我需要将数据移动到分布式系统(例如HDFS)。还有哪些其他选择?

    处理具有中等复杂性(例如,一些复杂性在自连接中,生成频繁项集并进一步过滤该集,其他部分涉及跨多个层次聚合数据)。我目前使用数据库(MySql和DB2)并考虑Hadoop。还有其他选择吗?

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

  4. 我目前正在使用SOLR,还有更好的选择吗?

    我知道这个问题产生了多个主题,任何输入都表示赞赏。如果我能使用更好的标签,请告诉我。

    谢谢!

    塞比

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

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

它还允许您将消息标记为持久性,以便代理可以在重新启动后继续存在。我强烈推荐http://activemq.apache.org/kahadb.html的ActiveMQ建议,因为旧版本存在严重问题。

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

然而,尽管如此,听起来你最终还是会以Hadoop来处理信息,所以也可以使用内置于其堆栈中的任何东西。 :)

答案 2 :(得分:0)

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

此库支持持久化事件驱动的消息,每秒数百万(不是每小时),进程之间的亚微秒延迟。它也非常简单(对于大多数用法来说太低了,但你可以用它作为开始)

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