在前面我们从基础到案例完全学会了创建Actor,给它们发送消息,以及如何协调多个Actor 实例。我们使用了一个无状态的Actor 以及一个有状态的Actor,并同时使用了单向通信和双向通信。这些灵活的特性可能有点儿难以置信。让我们来探讨一些与最佳实践相关的建议。
更多地依赖无状态的而不是有状态的Actor。无状态的Actor 没有特殊性,它们可以提供更多的并发性,易于复制,并且很容易重启和复用。状态可能是不可避免的,但是要尽可能少使用有状态的Actor。
要保证receive()方法中的处理速度非常快,尤其是接收Actor 具有状态的时候。改变状态的长时间运行任务将会降低并发性,要避免这样做。如果不修改状态的任务不是非常快速也不是什么问题,因为我们可以很容易地通过复制这些Actor 来改进并发性,如同我们在FileExplorer 中所做的那样。
确保在Actor 之间传递的消息是不可变的对象。在所有的示例中,我们传递的都是case 类的实例、String 或者Int,所有的这些都是不可变的。传递不可变对象将保证我们不会在无意间修改共享状态,并最终导致并发问题。
尽量避免使用ask()。双向通信通常都不是一个好主意。“发送并忘记”模型要好得多,而且也更加不容易出错。