我经常在软件架构中看到队列,特别是那些名为"可扩展的队列#34;来自Akka.io多演员平台的着名演员代表。但是,如果我们必须同步将消息放入队列中(因此在单线程和多线程中运行)并再次同步从队列中取出消息(以确保该消息只采取一次),队列如何可扩展?当这些消息可以改变(actor)系统的状态时,它会变得更加复杂 - 在这种情况下,即使从队列中取出消息后,它也不能进行负载平衡,但仍然可以在单线程中处理。
答案 0 :(得分:1)
- 是否正确,将消息放入队列必须同步?
- 是否正确,将消息放入队列必须同步?
醇>
没有
假设我们正在讨论synchronized
java关键字,那么这就是对象上的reenetrant互斥锁。只要争用很低,即使访问该锁的多个线程也可以很快。并且每个对象都有自己的锁,因此有很多锁,每个锁只需要很短的时间,即它是细粒度锁定。
但即使这样,队列也不需要通过互斥锁来实现。存在Lock-free and even wait-free队列数据结构。这意味着仅存在锁并不会自动暗示单线程执行。
其他问题应单独询问,因为它们与消息排队无关。
答案 1 :(得分:1)
当然,你是正确的,因为单个队列是不可扩展的。如果您的群集中有这么多核心,那么Actor模型的关键在于您可以拥有数百万个Actors,因此可以将负载分配到数百万个队列中。永远记住Carl Hewitt所说的话:
一个演员不是演员。演员进入系统。
每个actor都是一个完全顺序和单线程的计算单元。构建整个模型使其非常适合描述分布;这意味着您可以根据需要创建任意数量的演员。