(消息传递)队列如何可扩展?

时间:2016-09-16 10:19:09

标签: queue jms akka scalability p2p

我经常在软件架构中看到队列,特别是那些名为"可扩展的队列#34;来自Akka.io多演员平台的着名演员代表。但是,如果我们必须同步将消息放入队列中(因此在单线程和多线程中运行)并再次同步从队列中取出消息(以确保该消息只采取一次),队列如何可扩展?当这些消息可以改变(actor)系统的状态时,它会变得更加复杂 - 在这种情况下,即使从队列中取出消息后,它也不能进行负载平衡,但仍然可以在单线程中处理。

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

2 个答案:

答案 0 :(得分:1)

  
      
  1. 是否正确,将消息放入队列必须同步?
  2.   
  3. 是否正确,将消息放入队列必须同步?
  4.   

没有

假设我们正在讨论synchronized java关键字,那么这就是对象上的reenetrant互斥锁。只要争用很低,即使访问该锁的多个线程也可以很快。并且每个对象都有自己的锁,因此有很多锁,每个锁只需要很短的时间,即它是细粒度锁定。

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

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

答案 1 :(得分:1)

当然,你是正确的,因为单个队列是不可扩展的。如果您的群集中有这么多核心,那么Actor模型的关键在于您可以拥有数百万个Actors,因此可以将负载分配到数百万个队列中。永远记住Carl Hewitt所说的话:

  

一个演员不是演员。演员进入系统。

每个actor都是一个完全顺序和单线程的计算单元。构建整个模型使其非常适合描述分布;这意味着您可以根据需要创建任意数量的演员。