已关闭,此问题为opinion-based。它目前不接受回答。
**想改善这个问题吗?**更新问题,以便editing this post可以用事实和引用来回答。
5天前关闭。
Improve this question
我一直在和我的程序员争论最好的方法。我们的数据以每秒大约10000个物体的速度进入。这需要异步处理,但松散的顺序就足够了,因此每个对象都被循环插入到几个消息队列中的一个(也有几个生产者和消费者)。每个对象约为300字节。它需要持久,因此MQ被配置为持久存储到磁盘。
问题是,这些对象通常是重复的(因为它们在进入生产者的数据中是可重复的)。它们确实有10字节的唯一ID。如果对象在队列中重复,这不是灾难性的,但如果它们在从队列中取出后在处理中重复,这就是灾难性的。在确保对象处理过程中没有重复的同时,确保尽可能接近线性可伸缩性的最佳方法是什么?也许与此相关的是,应该将整个对象存储在消息队列中,还是只将id和主体存储在类似cassandra的东西中?
谢谢你,谢谢!
**编辑:**确认重复的位置。另外,到目前为止,我有两个关于Redis的建议。我之前一直在考虑RabbitMQ。关于我的要求,每一个的优点和缺点是什么?
3条答案
按热度按时间mzsu5hc01#
p.s:这是我生命中第一次Redis网站出现问题,但我敢打赌,当你访问它时,他们已经解决了问题
我的第一个建议是看看redis,因为它非常快,我敢打赌你可以只用一个消息队列处理所有的消息。
首先,我想向你展示我的笔记本电脑的信息(我喜欢它,但一个大的服务器将是一个更快;我爸爸最近买了一台新电脑,它比我的笔记本电脑强多了(8个CPU,而不是2个)。
下面是在我的机器上使用
redis-benchmark
的基准测试,甚至没有做太多的redis优化:正如你从我的简单笔记本电脑的基准测试中所看到的,你可能只需要一个消息队列,因为redis可以在0.23秒内处理10000个lpush请求,在0.21秒内处理10000个lpop请求。当你只需要一个队列时,我相信你的问题不再是问题了(或者是生产者生产了我不完全理解的重复?)).
Redis也持续到光盘。
当使用一个单一的消息队列(框),这个问题不存在,如果我理解正确。但是如果没有,你可以简单地检查id是否为is member of your set ids。当你处理id时,你应该remove it from the set ids。首先,您应该使用sadd将成员添加到列表中。
如果一个盒子不能再缩放,你应该把你的键分割到多个盒子上,然后选中那个盒子上的键。要了解更多关于这一点,我认为你应该阅读以下链接:
也许与此相关的是,应该将整个对象存储在消息队列中,还是只将id和主体存储在类似cassandra的东西中?
如果可能的话,你应该把所有的信息直接放进内存,因为没有什么东西能像内存一样快(好吧,你的缓存甚至更快,但真的很小,而且你不能通过代码访问它)。Redis会将所有信息存储在内存中,并将快照存储到磁盘上。我认为你应该能够将所有信息存储在内存中,而完全跳过使用Cassandra之类的东西。
让我们考虑每个对象是400字节每个对象总共在10000每秒的速度=> 4000000字节的所有对象每秒=> 4 MB/s,如果我的计算是正确的。你可以很容易地将这些信息存储在你的记忆中。如果你不能,你真的应该考虑升级你的内存,如果可能的话,因为内存不再那么昂贵了。
fsi0uk1n2#
如果不知道消息是如何在系统中创建的,不知道生产者用于发布到队列的机制,不知道队列系统正在使用,就很难诊断发生了什么。
我见过这种情况发生在许多不同的方式;超时的worker导致消息在队列中再次可见(因此进行了第二次处理,这在Kestrel中很常见),错误配置的broker(想到HA ActiveMQ),错误配置的客户端(想到Spring加上Camel路由),客户端双重提交等。这类问题有很多种可能出现的方式。
由于我不能真正诊断这个问题,我将在这里插入redis。您可以轻松地将合并(SPOP,和SADD一样,时间复杂度为O(1))与pub/sub结合起来,以获得一个非常快、时间恒定、无重复(集合必须包含唯一元素)的队列。虽然这是一个ruby项目,resque可能会有所帮助。至少值得一看
祝你好运
fdbelqdn3#
如果您不介意将Camel加入其中,那么您可以使用idempotent-consumer EIP来帮助实现这一点。
此外,ActiveMQ Message Groups可以用于对相关消息进行分组,使它们更容易执行重复检查,并仍然保持高吞吐量等。