这实际上是一个设计问题。我不知道如何在 Akka
用户故事
- 我需要解析大文件(> 1000 万行),看起来像
2013-05-09 11:09:01 Local4.Debug 172.2.10.111 %MMT-7-715036: Group = 199.19.248.164, IP = 199.19.248.164, Sending keep-alive of type DPD R-U-THERE (seq number 0x7db7a2f3)
2013-05-09 11:09:01 Local4.Debug 172.2.10.111 %MMT-7-715046: Group = 199.19.248.164, IP = 199.19.248.164, constructing blank hash payload
2013-05-09 11:09:01 Local4.Debug 172.2.10.111 %MMT-7-715046: Group = 199.19.248.164, IP = 199.19.248.164, constructing qm hash payload
2013-05-09 11:09:01 Local4.Debug 172.2.10.111 %ASA-7-713236: IP = 199.19.248.164, IKE_DECODE SENDING Message (msgid=61216d3e) with payloads : HDR + HASH (8) + NOTIFY (11) + NONE (0) total length : 84
2013-05-09 11:09:01 Local4.Debug 172.22.10.111 %MMT-7-713236: IP = 199.19.248.164, IKE_DECODE RECEIVED Message (msgid=867466fe) with payloads : HDR + HASH (8) + NOTIFY (11) + NONE (0) total length : 84
- 对于每一行,我需要生成一些将发送到服务器的
Event
。
问题
- 如何在 Akka 模型中有效地读取此日志文件?我读到同步读取文件效果更好,因为磁带移动较少。
- 在这种情况下,每个文件可能有 FileReaderActor
,它会读取每一行并将它们发送到处理,例如 EventProcessorRouter
和 Router
可能有许多参与者在 line
上工作(来自文件)并创建 Event
。每行
将有 1 个事件
- 我还考虑批量发送Event
以避免网络中传输过多的数据。在这种情况下,我应该在哪里继续积累这些Events
呢?以及我如何知道所有 Events
是否都是从 inputFile
生成的?
谢谢
最佳答案
我想我知道您的要求,您的基本意思是,如果您以您所描述的方式读取和处理文件,如果处理时间比读取时间长得多,您将面临收到大量消息的风险。此外,如果您理想地通过网络发送消息,您会希望最大程度地减少要发送的消息量。如果您的线路不需要很长时间来处理,那么我不会将它们发送到网络上进行处理。 您是否考虑过使用 future 来代替? 不知道你的情况是不是像Parallel File Processing: What are recommended ways?那么简单在这种情况下你应该使用流。但我认为问题在于 Actor ,尽管他们有利于限制他们的主要目的是包装状态,而处理文件则没有那么多。也许你使用 future 会更好,我在这里展示了一个例子Executing Dependent tasks in parallel in Java 。但是您可以使用像您所说的那样的 Actor,让处理 Actor 与读取器 Actor 进行通信,并告诉它一旦等待处理的消息数量超过 1000000 或您决定的数量就停止读取,比如说一秒钟。
关于java - 使用 Akka 处理文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30019859/