2016-09-16 138 views
0

我经常看到软件体系结构中的队列,尤其是那些被称为“可伸缩”的队伍,其中有来自Akka.io多角色平台的Actor的突出代表。然而,如果我们必须同步将消息放入队列(并且因此在单线程vs多线程中操作),并再次同步从队列中取出消息(以确保该消息仅占用一次),那么队列如何可伸缩?它变得更加复杂,当这些消息可以改变(参与者)系统的状态时 - 在这种情况下,即使在从队列中取出消息之后,也不能进行负载平衡,但仍然在单线程中处理。(消息传递)队列如何扩展?

  1. 是否正确,将消息放入队列必须同步?
  2. 是否正确,将消息放入队列必须同步?
  3. 如果1或2是正确的,那么队列是如何扩展的?不同步到单线程立即创建瓶颈?
  4. 如果(actor)系统状态满足,它可以扩展吗?
  5. Statefull actor/bean的意思是说,我必须在单线程中按顺序处理消息?
  6. statefullness是否意味着,我必须在整个系统中拥有bean/actor的单个副本?
  7. 如果6为false,那么我如何在实例之间共享此状态?
  8. 当我试图将我的新P2P节点连接到netowrk时,我相信我必须有一些“服务器”告诉我,谁是其他同伴,这是否正确?当我试图下载洪流时,我必须连接到跟踪器 - 如果有“服务器”,那么我们是否称之为P2P?如果此跟踪器将停止运行,那么我无法连接到同伴,这是正确的吗?
  9. 同步和statefullness破坏可伸缩性?
+0

这些问题中的一些最好隐约相关,你应该单独问问他们。 – the8472

回答

1
  1. 难道是正确的,在队列中放置消息必须同步?
  2. 是否正确,将消息放入队列必须同步?

假设我们正在谈论的​​java的关键字,然后就是在物体上reenetrant互斥锁。只要争用为低,即使访问该锁的多个线程也可以很快。每个对象都有自己的锁,所以有很多锁,每个锁只需要在短时间内被捕获,即它是细密的锁定。

但即使这样做,队列也不需要通过互斥锁来实现。 Lock-free and even wait-free队列数据结构存在。这意味着锁的存在并不意味着单线程执行。

其他问题应单独询问,因为它们与消息排队无关。

1

当然你是正确的,因为单个队列不可扩展。 Actor模型的要点是,您可以拥有数百万Actors,因此可以将负载分布在数百万个队列中 - 如果您的群集中有很多内核。永远记得Carl Hewitt所说的:

一个演员不是演员。演员进来的系统。

每个单个actor都是一个完全顺序且单线程的计算单元。尽管如此,整个模型的构建方式非常适合描述分布。这意味着您可以根据需要创建尽可能多的演员。

+0

好的,但如果这个演员是有状态的,那么我不能拥有他的数百万份(或者我可以,但必须以某种方式分享状态)。我的其他问题呢? – spam

+0

“单个队列不可扩展”......这是值得商榷的。使队列本身的规模是不平凡的,但并非不可能。 – the8472

+0

@spam我回答了您的最高问题,如果您想要解答其他非常不同的主题,请另外提出问题。对于状态管理,我建议你阅读分片,例如参见Akka的ClusterSharding模块。也有关于这个主题的好书,例如«反应消息模式»(Vaughn Vernon)或«反应式设计模式»(Roland Kuhn)。 –