具有持久消息/溢出到磁盘的低占用空间队列/消息传递解决方

时间:2012-12-11 06:03:36

标签: asynchronous queue jms messaging

我需要构建一个高度可扩展的系统来捕获点击流量。我希望异步处理数据,以便HTTP点击请求可以快速返回。点击流量需要进入数据存储区进行报告,但不需要是实时的。我希望能够通过添加应用服务器来扩展此解决方案,满足需求所需的数量,由负载均衡器(可能是亚马逊的弹性负载均衡器)提供。我想到了一些可能性(BTW平台是Java):

  1. 将点击数据写入内存队列(例如BlockingQueue)。另一个线程会耗尽队列并插入后端数据存储区。此方法将队列大小限制为可用内存,如果节点崩溃,则队列中的所有数据都将丢失。我搜索了一个BlockingQueue实现,当队列达到一定的大小但没有找到任何内容时溢出到磁盘。

  2. 将点击数据写入每个节点上的文件系统,文件大小为100MB左右。然后,数据将由后端进程收集并插入数据存储区。使用这种方法,没有单点故障和数据丢失的可能性低。例如,如果节点遇到错误,它将从负载均衡器中删除。如果后端数据存储区变得不可用,则可以在数据文件再次可用时继续传输数据文件。将数据导入后端数据存储区需要一些时间,但只要所有数据都存在,就可以接受。

  3. 使用消息系统,例如activemq或rabbitmq。消息传递系统会引入单点故障,除非安装在每个节点上,这似乎有点过分。消息传递系统将提供持久的消息,并保证消息只使用事务一次消耗。队列的使用者将数据加载到数据存储区中。消息传递系统可以集群在后端,但需要服务器n-app服务器,它可能成为系统中的限制因素,影响http请求性能。

1 个答案:

答案 0 :(得分:1)

Akka.io听起来像是这个任务的好框架。它使用actor模型,并支持远程actor。这意味着它可以保证每条消息只消耗一次,并允许您跨多个服务器扩展系统。它还支持基于文件的actor邮箱和actor监督,因此如果一个服务器崩溃,系统可以恢复,并且未处理的消息不会丢失。有很多公司专业地使用它,因此经过彻底的战斗测试。