RabbitMQ对EC2的性能期望是什么?希望在这里分享经验。
我正在尝试在aws EC2上对RabbitMQ进行一些性能测试。我为RabbitMQ,Publisher和消费者/工作者运行了3个单独的EC2实例。
我的方案是Publisher将JSON字符串(大约165-200字节)推送到直接交换类型,持久设置为true,并将持久设置为true的绑定队列(即两者都处于持久模式)。消费者/工人正在单独的盒子上运行 - 不断拉动消息。 (在工作中向前移动这些消息应该保留在MongoDB中,并且将使用REST轻松替换Restful服务)
为了简单起见,我使用多播示例代码模拟了这种情况。我将组播代码拆分为两个单独的java文件,即“Producer”和“Worker”,以便在单独的框中运行每个文件。我使用“c1.mediam”EC2和Ubuntu服务器v11.4 32位运行生产者和消费者,使用“m1.large”和Ubuntu服务器v11.4 64位用于RabbitMQ。
我能够实现每秒3-5k个消息的吞吐量,即将研究消息推送速率保持在5K。 (这与http://www.rabbitmq.com/faq.html#performance-latency)
一致此外,当我将推送速率提高到每秒10-12k个消息时。消费者使用消息的能力下降到每秒1-2k消息,并产生积压(很多时候它也低于每秒800条消息)。
在上述情况下,我有以下问题,并希望提高消费者吞吐量的想法/建议。 (注意:我的场景中的所有消息都应该是类似的类型,没有机会将它们分组以设置路由,因此可能需要某种负载平衡器方法)
1)使用一个rabbitMQ服务器,一个交换和一个队列观察到此性能。是否可以进一步配置,进行微调,以便使用持久模式将吞吐量提高到5k以上。
2)我明白,聚类可能是另一种选择。但是,我需要根据传入的负载设置集群,我可能无法获得消息分组/标识来定义路由(因为消息应该只是日志描述)。我可以为工作者/消费者设置负载均衡选项之后的群集吗?
3)我预计每秒处理几十万个请求。我希望分享一些经验和方法来实现这一目标。
答案 0 :(得分:1)
您考虑过添加多个消费者吗?与严格耦合的架构相比,这是松散耦合的总线/消息架构的核心优势之一。它也可能有助于理解消息量的需求。这是一个基准,只是为了看看你能做什么或者这与实际应用需求有关?
答案 1 :(得分:1)
数百kHz是非常非常高的:如果RabbitMQ可以做到这一点,那么你正在寻找跨群集节点的分区。 These writers发现他们的EC2实例最多可处理100K数据包/秒,因此显然您不会获得高于单个实例的消息吞吐量。
您可能会调查由LinkedIn撰写的Kafka类似的大型火灾模型。它将一些复杂性推向了消费者,以便实现真正的分布式和低消息开销。
答案 2 :(得分:0)
您为EC2实例使用什么类型的存储? EBS存储更可靠,但有时它具有非常低吞吐量(特别是如果它是小尺寸的EBS卷,即<100GB)。另一方面,实例存储具有更好的IO性能(至少从我们的经验来看),但只要实例运行,它就只能“生存”。 此外,您使用的实例类型也有很大差异。 m1.small和c1.medium都具有中等的IO性能(http://aws.amazon.com/ec2/instance-types/)。
我们在EC2中运行RabbitMQ,并持久保存所有消息。我们只使用m1.large实例(64位具有高IO性能)。我们从EBS存储开始,然后切换到实例存储,看看是否有任何改进。实例存储实例在IO吞吐量方面更快。但是,缺点是所有持久性消息都会随着实例的终止/失败而丢失(尽管到目前为止我们从未经历过失败)。 在我们的场景中,我们不需要如此大的吞吐量,但如果我们的消息丢失,我们会非常关心: - )
总之,您可以尝试切换到实例存储设置,看看如何处理,如果有任何改进。如果效果更好,那么我认为http://www.rabbitmq.com/pacemaker.html是克服失败的解决方案。至少那是我们转向的方向。
干杯