我试图将当前的应用程序更改为缩放。快速写入永久队列
目前它每小时最多可处理几百万个事件,但当我切换到SaaS模型时,卷的容量预计会增加10到100倍,所以能够以分布式方式执行处理非常重要时尚。
该应用程序是一个Web应用程序,目前每小时接收120万个事件。它使用2个Tomcat服务器,每个服务器监听500个线程和一个工作管理器排队事件,然后产生几百个工作线程来后处理事件。
我想要做的是将写入与处理分离并将处理移至分布式环境。
快速写入到磁盘的事件。
这里的解决方案可以像写入LinkedBlockingQueue一样简单,并将成百上千个条目的批次转储到文件中,或者使用已经完成此操作的好的库或调整数据库以支持这种类型的合理排队时尚。
如果系统变得不可用,则无法捕获上次事件并不重要,重点在于服务器工作时的性能。
将事件处理移至分布式系统。
我需要将数据移动到分布式系统(例如HDFS)。还有什么其他选择?处理具有中等复杂度(例如,一些复杂性在自连接中生成频繁项目集并进一步滤除该集合,其他部分涉及跨越多个层次结构聚合数据)。我目前使用数据库(MySql & DB2)并考虑Hadoop。任何其他选项?
将结果存储在只读快速读取系统中。
我目前使用SOLR,没有更好的选择
?
我知道这个问题产生了多个主题,任何输入赞赏。让我知道是否有更好的标签可以使用。
谢谢!
Sebi
嗨,彼得,谢谢你的建议。这看起来很有趣。 我可以看到,使用它可以暂时保留来自所有Web服务器线程的请求,并且在另一端有N个进程以批处理方式(每秒左右)将数据快速移动到分布式环境中的N台机器,以处理加载。 队列能够在崩溃后恢复吗? – sfeher 2012-02-20 14:56:14
如果您的程序崩溃,则保留所有更改。如果最后一个条目不完整,它不会出现在索引中。为了最大限度地提高性能,它不保证写入磁盘,所以如果系统崩溃(例如内核崩溃),您可能会丢失很多未提交的更改(在重负载下) – 2012-02-20 22:18:47
您可以使批处理大小动态变化。即读取等待请求(达到某个限制)处理它们,重复。当负载相对较低时,这将导致小批量响应批次,并且在重负载时批量越来越大。 – 2012-02-20 22:21:47