现在有很多关于不使用锁和使用像 Erlang 这样的消息传递方法的讨论。或者关于使用不可变数据结构,例如函数式编程与 C++/Java。
但我关心的是以下几点:
- AFAIK,Erlang 不保证消息传递。消息可能会丢失。如果您不得不担心消息丢失,算法和代码是否会变得臃肿并再次变得复杂?无论您使用什么分布式算法,都不能依赖于有保证的消息传递。
- 如果 Message 是一个复杂的对象怎么办?复制和发送消息与将消息保存在共享位置(例如两个进程都可以访问的数据库)相比,是否存在巨大的性能损失?
- 你真的可以完全取消共享状态吗?我不这么认为。例如在数据库中,您必须访问和修改相同的记录。您不能在那里使用消息传递。您需要锁定或假设乐观并发控制机制,然后对错误进行回滚。Mnesia 是如何工作的?
- 此外,您并不总是需要担心并发性。任何项目也将有一大段代码,它们根本不需要对并发或事务做任何事情(但它们确实需要考虑性能和速度)。许多这些算法依赖于共享状态(这就是为什么传递引用或指针如此有用)。
鉴于这一事实,用 Erlang 等编写程序是一件痛苦的事情,因为您无法做任何这些事情。可能是,它使程序变得健壮,但对于解决线性规划问题或计算凸包等问题,性能更重要,当算法与并发/事务无关时,强制不变性等是一个糟糕的决定. 不是吗?