Max*_*Max 10 php activemq-classic message-queue rabbitmq cassandra
我一直在和我的程序员争论最好的解决方法.我们的数据以每秒约10000个对象的速度进入.这需要异步处理,但是松散排序就足够了,因此每个对象都循环插入到几个消息队列之一(还有几个生产者和消费者).每个对象约300个字节.它需要持久,因此MQ配置为持久存储到磁盘.
问题是这些对象经常是重复的(因为它们不可避免地复制到生产者的数据中).它们具有10字节的唯一ID.如果对象在队列中重复,则不是灾难性的,但是如果它们在从队列中取出后在处理中被复制,那就不是灾难性的.什么是确保尽可能接近线性可扩展性同时确保对象处理不重复的最佳方法?也许与此相关,是应该将整个对象存储在消息队列中,还是只将id与body存储在像cassandra这样的内容中?
谢谢!
编辑:确认重复发生的位置.此外,到目前为止,我已经为Redis提出了2条建议.我以前一直在考虑RabbitMQ.关于我的要求,每种方法的优缺点是什么?
如果不知道消息是如何在系统内创建的、生产者用于发布到队列的机制以及正在使用的队列系统,则很难诊断正在发生的情况。
我见过这种情况以多种不同的方式发生;超时的工作线程导致消息在队列中再次可见(并因此进行第二次处理,这在 Kestrel 中很常见)、配置错误的代理(想到了 HA ActiveMQ)、配置错误的客户端(想到了 Spring 和 Camel 路由) 、客户重复提交等。出现此类问题的方式有很多种。
由于我无法真正诊断问题,因此我将在这里插入redis。您可以轻松地将SPOP(O(1),SADD)之类的东西与pub/sub结合起来,以获得令人难以置信的快速、恒定时间、重复自由(集合必须包含唯一元素)队列。虽然这是一个 ruby 项目,但resque可能会有所帮助。它至少值得一看。
祝你好运。