我正在编写一个用于绘制和分析大量日志数据的应用程序。基本上,我们的应用程序(Web,Tomcat,控制台等)将具有自定义log4j
appender,用于将日志条目发送到我们的远程服务器。
现在我想通过普通的HTTP POST接受这些日志条目。此时,Web服务会将条目记录到数据库中。
我在Node.js
和Akka
之间。主要是因为我有Java和JavaScript的经验。但我是Akka的演员模式的新手,我读过Node不是真正的并行,除非你运行多个Node服务器?
我的逻辑是:
1)应用程序POST日志条目到服务器
2)服务器接收HTTP请求并创建Amazon SQS条目(或Azure Service Bus ...尚未决定)
3)工作人员清理队列并将条目存储在DB中。
我认为这将允许非常快速的输入但是调用SQS操作将是一个很长的IO过程。
我的另一个想法是接受POST请求,将其存储在memcached或Redis中,然后让工作人员从缓存中拉出,发送到SQS然后清理队列以进行数据库插入。这样做的好处是HTTP请求尽可能快地传递数据,并让其他工作人员处理它的记录。
这显然听起来像Akka的工作,因为我不能为每个请求分配一个actor然后让它产生其他actor以处理它进出缓存吗?
在测试阶段,我可以很容易地看到一次有20到500个请求。取决于我们在测试中打开的应用程序数量。但是一旦完全运行,我就可以看到我们拥有的所有应用程序每秒都有数千个请求。
所以我的问题是如何最好地处理我将获得的大量数据。我关心线程锁定,http阻塞等。
答案 0 :(得分:2)
从架构上讲,将入站日志数据卸载到队列以进行下游处理(过滤,分析,推送到数据库等等)是正确的方法。如果您关注音量和缩放,那么您需要在入站端使用更轻量级的基于TCP的协议。 HTTP虽然方便,但对于直接数据传输来说是非常苛刻的。 (处理入站数据的服务器端组件至少应该直接从套接字连接读取,这在HTTP POST处理中通常不会发生。)