需求是:几个服务产生大量带有数据流的请求(每个请求1-10兆字节),几个消费者自动处理这些请求。
所以请求数据不能分割。关键的需求是,如果某个消费者处理请求失败——这个请求必须被重新注入到队列中并发送给不同的消费者。处理单个请求可能需要数十分钟。消费者可能在处理过程中"死亡",因此需要某种类型的任务监视。
我考虑了这么多
- http://kafka.apache.org/
- http://storm-project.net/
- http://activemq.apache.org/
- http://activemq.apache.org/apollo/
但是它们似乎都不符合我的要求。有什么建议吗?
关于您的需求(每个请求> 1 MB,处理> 10分钟)…它还在发短信吗?
我会把它放在一个数据库(RDBMS)。如果不接受轮询,我会考虑使用数据库中的触发器/存储过程。用Scala编写的存储过程在Oracle和PostgreSql中可以完美地工作。
我不能说activemq,但是在kafka和storm之间我会选择storm。不清楚你说处理请求失败是什么意思,但如果storm worker完全失败(即不响应心跳),storm master (nimbus)可能会将任务从死亡的worker重新分配给另一个(也许,在不同的机器上)。
参见理解Storm拓扑的并行性
Kafka是一个非常简单的消息代理,如果没有一些高层协调,它就无法完成你提到的开箱操作。