【问题标题】:Erlang message processing transactionErlang 消息处理事务
【发布时间】:2015-11-03 09:20:55
【问题描述】:

一个进程试图从其消息队列中获取消息的“事务”何时被视为已提交或回滚?换句话说,在什么执行点上,消息会从消息队列中永久删除?

【问题讨论】:

标签: erlang


【解决方案1】:

当它被接收呼叫读取时。

如果消息在消息队列中并由调用接收的进程读取,那么它只是内存操作,没有其他进程可以竞争数据,因此它本身没有事务性质;不需要锁定或回滚等,但因为它只是内存操作,所以没关系。

你使用的语言让我担心你认为有比实际更多的保证。重要的是要记住,在基本的消息发送和接收级别(OTP 可能提供的任何额外层或您自己编写的顶部没有任何额外的层)您发送的消息没有任何保证它们将被传递,或者您发送到的过程甚至存在。

【讨论】:

  • 也就是说,没有“回滚”,当接收匹配时,邮件将从邮箱中永久删除。
  • 本质上,消息在匹配时会从队列进入您的变量,没有任何回滚的情况。
  • 不能,因为除了收件人之外,没有其他人可以从邮箱中删除邮件。我想你对 Erlangs 进程邮箱是什么有错误的印象。它们是一个非常轻量级的结构,可以用来构建更复杂的东西,而不是像消息总线这样的微型 Rabbit MQ
  • @GaborKulcsar Peer 是对的,另一个进程对消息队列的任何“观察”永远不可能是事务性的,因为任何观察都是及时的快照,它必须是一致的,但是外部进程可以永远不要根据观察做出孤立的原子决定,因为它总是有点像观察半人马座阿尔法星发出的光——很久以前它曾经是这样的。
  • 你可以在内存中有事务是的,但是我们不想要事务,除非它是必要的,并且我们不想要锁在没有必要的时候。这些东西会损害性能。在这种情况下,在 Erlang 范式中不需要事务。 Clojure 是无与伦比的,它的特点是“共享使用可变存储”,而 Erlang 通常既不提供共享存储,也不提供可变存储(明显的例外是 ETS,但这与消息或消息队列无关)。
猜你喜欢
  • 2011-09-14
  • 2016-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-12
  • 1970-01-01
相关资源
最近更新 更多