0

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

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

  2. 将点击数据写入每个节点的文件系统,文件大小为100MB左右。然后,数据将由后端进程收集并插入数据存储区。使用这种方法,不会出现单点故障,并且数据丢失的可能性很小。例如,如果一个节点遇到错误,它将从负载均衡器中删除。如果后端数据存储不可用,它可以在它再次可用时恢复传输数据文件。将数据放入后端数据存储需要一些时间,但只要所有数据都到达那里,这是可以接受的。

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

4

1 回答 1

1

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

于 2012-12-11T06:18:57.090 回答