好的开源排队平台?

时间:2020-03-05 18:41:04  来源:igfitidea点击:

有人知道一个好的和可靠的开源排队服务器/平台吗?

我正在做一个项目,我们每天需要处理一个队列中的数百万个项目。我的挑战是该队列不是FIFO,这意味着要对新项进行优先级排序,并可以将其插入队列中间的某个位置。另外,要处理这些项目,我们将使用并行服务器分发平台,因此需要从许多服务器访问队列。

解决方案

回答

不太开源,但很开放:Amazon的Queue服务。非常可靠,非常易于使用。

开源Ruby:Beanstalkd。

JBoss具有Java-Messaging-Service支持。请参阅消息bean页面。

Apache有一个JMS产品。所有Apache产品都是开源的。

回答

我喜欢盖乌斯(Gaius)关于Amazon SQS的想法,但是它在消息之间有很大的延迟时间。一些基准测试显示一条消息15-30秒,另一些则慢到一分钟。因此,如果速度是一个问题,那么我们可能需要运行自己的MOM。

我会推荐来自Apache的ActiveMQ。我们已经完成了基准测试,其速度非常接近套接字连接。但是,从未在大型生产应用程序上使用过它。

回答

ActiveMQ是一个很好的产品:易于设置,易于部署,易于使用。可集群化,支持许多协议,等等。我们正在生产中尝试它,似乎很可靠(有其自身的问题,但不是很多)

我已经尝试过JBoss Messaging,但发现它使用起来更加困难,并且不那么成熟(这是对JBoss MQ的重构,并且不够稳定和完整...)

抱歉,我没有足够注意地阅读问题...我确实检查了JMS规范:它确实实现了消息的优先级排序,但是JMS中只有10个优先级,并且实现者没有被迫执行尊重他们(我没有检查AMQ做什么)
但是优先级管理也可以通过使用diffendend队列来实现... [/编辑]

回答

除了ActiveMQ可以满足需求之外,我们还可以查看RabbitMQ或者OpenAMQ。

回答

使用在插入时间和优先级上建立索引的mysql表编写自己的代码。虽然这不会产生原子弹。一个面向事务的小魔术,可以获取原子弹出-一个标志字段。使用空标志字段更新最上面的项目,以获取客户的唯一标识符,提交,选择具有唯一标识符的项目,然后在完成该项目后将其删除。现在,我们不仅有一个排队系统,而且还有一个管理仪表板,因为我们可以通过选择所有带有非空标志的队列表项来查看谁在做什么。

回答

正如@davidnicol所提到的,我们可以使用数据库。尽管数据库的缺点是在许多线程/进程之间实现了很好的负载平衡,这还是有点困难;我们通常会得到一个线程锁定队列的头部,从而使调度成为单线程。

消息队列的主要用途之一通常是获得一个可靠的负载均衡器,然后我们就可以运行多个竞争消费者,并希望它们都从同一个队列中拉出,从而为我们提供巨大的可伸缩性。

如果我们走消息队列路线;那么Apache ActiveMQ是最受欢迎的开源实现,因此我建议从它开始,因为它拥有最大,最活跃的社区(我个人最喜欢的度量标准,用于在相似的开源项目之间进行选择)。

有多种方法可以使用ActiveMQ来实现优先级队列,主要的权衡是我们可以应对Resequencer模式引入的延迟,还是仅针对不同优先级范围使用选择器和使用者的不同进程/线程池,这是一种更好的低延迟解决方案。

尽管选择器实现不是最纯粹的优先级队列实现,但实际上它确实会更好地工作,因为它避免了等待更高优先级的消息冒泡的情况。此外,它还避免了低优先级的消息,这些消息花费很长时间来处理占用处理器的时间。

回答

顺便说一句,与问题不同的是可以使用哪种API与我们选择的任何技术进行对话。

我对任何中间件或者基础结构的建议是,如本文所述,尝试从业务逻辑中隐藏中间件。将业务逻辑与中间件分开,可以轻松地更改中间件的实现,因为实际上并没有一种千篇一律的中间件技术各有优缺点。另外,在负载,容量,吞吐量,同步性和延迟方面,需求确实会发生变化,因此有时我们需要在项目生命周期内切换中间件技术