在收听了最近的 azure 播客(尤其是关于在 azure 上构建低延迟金融系统的播客)并阅读了有关 Service Fabric 的所有炒作后,我决定尝试更改“分布式计算代码示例 Monte Carlo 模拟”模式以满足我的需要。
我的场景是:具有给定起始状态的一个请求使用基于蒙特卡罗的简单(计算方式)模型运行 10k 完整运动比赛模拟。
我的第一次尝试是:
1 * 有状态的“处理器”Actor,接收匹配的开始状态并将其转发给 10k + 任务 Actor,以及相关的聚合器 ActorId
10K+ * 运行 1 次模拟并将结果传递给其聚合器 Actor 的无状态“任务”Actor。模拟时间很短(~2ms)
100 * 有状态的“聚合器”Actor,聚合接收到的模拟并传递给终结器 Actor
1 * 'Finaliser' 计算最终结果的 Actor
只需使用 Tasks 在我的开发机器上运行上述内容需要 < 100 毫秒,但上述设置(作为本地集群在开发机器上运行)需要 50 秒甚至更多!
在调试了一个潜在原因后,我发现处理器 Actor 发送初始任务所需的时间,所以我想知道调用 Service Fabric 有什么样的开销(我猜各种命名服务调用正在发生当我调用演员的方法时)以及缓慢是否可能是由于这个和我的任务数量造成的?
为了消除其他可能性,我做了以下事情,发现总时间只有很小的差异:
- 使所有参与者无状态,以确保状态管理不会增加开销。
- 在处理器中创建所有 ActorProxies 并存储它们的引用以供将来调用以确保 Actor 激活不会引起问题。
有没有人对从这里去哪里有任何建议,或者有没有人试图实现类似的东西?
谢谢,亚历克斯