与共享数据相比,消息传递的性能损失

2024-04-16

最近有很多关于不使用锁和使用 Erlang 等消息传递方法的讨论。或者关于使用不可变的数据结构,例如函数式编程与 C++/Java 中的比较。

但我关心的是以下几点:

  1. AFAIK,Erlang 不保证消息传递。消息可能会丢失。如果还要担心消息丢失,算法和代码不是又会变得臃肿、复杂吗?无论您使用什么分布式算法,都不能依赖于有保证的消息传递。
  2. 如果 Message 是一个复杂的对象怎么办?与将消息保存在共享位置(例如两个进程都可以访问的数据库)相比,复制和发送消息是否会带来巨大的性能损失?
  3. 你真的能完全取消共享状态吗?我不这么认为。例如在数据库中,您必须访问和修改相同的记录。您不能在那里使用消息传递。您需要锁定或采用乐观并发控制机制,然后对错误进行回滚。 Mnesia 是如何运作的?
  4. 而且,您并不总是需要担心并发性。任何项目都会有大量代码,这些代码根本不需要对并发或事务执行任何操作(但它们确实需要考虑性能和速度)。许多这些算法都依赖于共享状态(这就是为什么引用传递或指针如此有用)。

鉴于这一事实,在 Erlang 等中编写程序是一件痛苦的事情,因为你无法做任何这些事情。也许,它使程序变得健壮,但对于解决线性规划问题或计算凸包等问题,性能更重要,并且在与并发/事务无关时强制算法不变性等是一个糟糕的决定。不是吗?


  1. 这就是现实生活:无论语言/平台如何,您都需要考虑这种可能性。在分布式世界(现实世界)中,事情会失败:接受它。

  2. 当然是有代价的:我们的宇宙中没有什么是免费的。但是你不应该使用另一种媒介(例如文件、数据库)来代替在通信管道中穿梭的“大对象”吗?您始终可以使用“消息”来引用存储在某处的“大对象”。

  3. 当然不是:函数式编程/Erlang OTP 背后的思想是“isolate“尽可能多地操纵“共享状态”的区域。此外,已明确标记places共享状态发生变化有助于可测试性和可追溯性。

  4. 我相信你没有抓住重点:没有什么灵丹妙药。如果您的应用程序无法使用 Erlang 成功构建,那么就不要这样做。您始终可以以另一种方式使用整个系统的其他部分,即使用不同的语言/平台。 Erlang 在这方面与其他语言没有什么不同:使用正确的工具完成正确的工作.

请记住:Erlang 旨在帮助解决同时, 异步 and 分散式问题。例如,它没有针对在共享内存块上有效工作进行优化......除非您计算与nif作用于游戏的共享块部分的函数:-)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

与共享数据相比,消息传递的性能损失 的相关文章

随机推荐