假设:
某些数据导入外部源。可以以定义大小的块读取数据。例如,一次有10个项目。例如电子邮件。
现在每个块都必须传递一些步骤来转换数据,过滤掉项目等等。
块或块的项目之间没有关系。处理顺序也不重要
问题
现在我正在考虑如果我使用akka进行最佳的并行化和性能,那么哪种结构是正确的。
1。)我是否更有可能将所有演员都视为一系列儿童。因此importActor有一个Child,这是第一步。第一步是儿童和儿子的第二步 或者更有可能有一个ImportActor,其中包含所有步骤并在其他步骤之后调用一个?
2.)现在,一个演员现在只能处理一条消息。为了平行导入过程,我考虑使用 PipeTo 机制。这是一个好主意吗?有更好的选择吗?
3.。)我会为每个块创建一个像“Import_ Chunk1 _Actor”这样的演员,还是会将所有消息推送到单个“ImportActor”?
答案 0 :(得分:1)
如果你在其他任何地方问过这样的问题你会受到重创。它有点模糊,易于自以为是,所以会尽量做到客观
我想说,只需尝试几种方法,而无需花费时间在完成工作的代码上。它非常快速地做脚手架式的工作。
1)根据你所描述的内容,你会得到一个输入,然后是一些演员同时代表' 10项目。这些可能只是在路由器后面。因此,在开发过程中,你不会担心有10个,只需要做一个然后使用配置和微小的调整来扩展它 - 正如你所建议的那样,如果你使用任务,你可能只有1个演员完成所有的工作。然后在每个中我都会有相同级别的过程。这在很大程度上取决于你现在是否有任何州。您可以使用成为语义来将actor锁定到特定的工作流中,您可以只处理在任务中踢出下一个状态的消息,该任务继续告诉actor进行下一个阶段。我认为你对儿童演员的建议是最不吸引人的。
参与者一次只处理一条消息,因此如果您希望它具有高吞吐量,则可以减少处理的时间。您可以通过任务或传递给另一个参与者(例如工作人员或聚合器)来执行此操作。 PipeTo在任务中生成消息的东西正在生成要发送给另一个actor的正确类型的消息并且您不想对其执行任何操作的情况下非常有用。它只是一个延续。它没有任何问题,你最终做一些工作的演员系统的部分,你可能会包装在一个任务中,如果你能够,然后使用它。某种形式的延续比演员封锁更好 - 但如果演员只会一次做一件事那么重要吗?被阻止的线程是被阻塞的线程。任务中要记住的事情是你开始使用类似akka之类的东西可能是因为基于任务/并发编程的陷阱 - 你可以轻松地买回所有这些。
当你达到这一点时,这将是显而易见的。你可能会使用一个路由器,如果你有多个演员 - 或者如果你开始启动大量的任务,你可以做大部分的1-2个演员和几个消息链接。关于哪个更好 - 我知道有3个人使用演员系统,他们可以整天争论相对优点。如果消除了actor中的所有状态,你可以使用1个处理消息的actor并触发任务。你可能有2-3层,你可能有东西来聚合3个任务和/或10个工人。世界是你的牡蛎
重点是,这一切都取决于未说明的要求。