我需要构建一个高度可扩展的系统来捕获点击流量。我希望异步处理数据,以便 HTTP 点击请求可以快速返回。点击流量需要进入数据存储进行报告,但它不需要是实时的。我希望能够通过添加应用程序服务器来扩展此解决方案,以满足需求所需的数量,并以负载均衡器(可能是亚马逊的弹性负载均衡器)为前端。我想到了几种可能性(顺便说一句,平台是 Java):
将点击数据写入内存队列(例如 BlockingQueue)。另一个线程将排空队列并插入后端数据存储。这种方法将队列大小限制为可用内存,如果节点崩溃,队列上的所有数据都会丢失。我搜索了一个 BlockingQueue 实现,它在队列达到一定大小时溢出到磁盘但没有找到任何东西。
将点击数据写入每个节点的文件系统,文件大小为100MB左右。然后,数据将由后端进程收集并插入数据存储区。使用这种方法,不会出现单点故障,并且数据丢失的可能性很小。例如,如果一个节点遇到错误,它将从负载均衡器中删除。如果后端数据存储不可用,它可以在它再次可用时恢复传输数据文件。将数据放入后端数据存储需要一些时间,但只要所有数据都到达那里,这是可以接受的。
使用消息系统,例如 activemq 或 rabbitmq。除非安装在每个节点上,否则消息传递系统会引入单点故障,这似乎有点矫枉过正。消息传递系统将提供持久消息和一些保证消息只被使用一次的事务。队列的消费者会将数据加载到数据存储中。消息系统可以集群在后端,但需要服务器 n-app 服务器,它可能成为系统中的限制因素,影响 http 请求性能。