0

我正在编写一个用于绘制和分析大量日志数据的应用程序。基本上,我们的应用程序(Web、Tomcat、控制台等)将具有自定义log4j附加程序,将日志条目发送到我们的远程服务器。

现在我想通过普通的 HTTP POST 接受这些日志条目。此时,Web 服务会将条目记录到数据库中。

我在 和 之间的栅栏Node.jsAkka。主要是因为我在 Java 和 JavaScript 方面都有经验。但是我是 Akka 的演员模式的新手,我读过 Node 不是真正并行的,除非你运行多个 Node 服务器?

我的逻辑是这样的:

1) 应用程序 POST 日志条目到服务器

2)服务器接受 HTTP 请求并创建一个 Amazon SQS 条目(或 Azure 服务总线..尚未决定)

3)工人清理队列并将条目存储在数据库中。

我认为这将允许非常快速的输入,但调用 SQS 操作将是一个漫长的 IO 过程。

我的另一个想法是接受 POST 请求,将其存储在 memcached 或 Redis 中,然后让工作人员从缓存中提取,发送到 SQS,然后清理数据库插入队列。这将具有 HTTP 请求尽可能快地传递数据并让其他工作人员处理记录的优势。

这显然听起来像是 Akka 的工作,因为我不能为每个请求分配一个 Actor,然后让它产生其他 Actor 来处理将其移入/移出缓存吗?

在测试阶段,我可以很容易地看到一次有 20 到 500 个请求。取决于我们在测试中打开了多少应用程序。但是一旦完全运行,我可以看到每秒有数千个请求来自我们拥有的所有应用程序。

所以我的问题是如何最好地处理我将获得的大量数据。我关心线程锁定、http阻塞等。

4

1 回答 1

2

在架构上,将入站日志数据卸载到队列以进行下游处理(过滤、分析、推送到数据库等)是正确的方法。如果您关心容量和扩展,那么您将需要在入站端使用更轻量级的基于 TCP 的协议。HTTP 虽然方便,但对于直接数据传输来说过于笨拙了。(至少,处理入站数据的服务器端组件应该直接从套接字连接读取,这在处理 HTTP POST 时通常不会发生。)

于 2012-12-28T23:40:23.460 回答