Jms 何时对Java消息传递和队列系统使用持久性

Jms 何时对Java消息传递和队列系统使用持久性,jms,activemq,rabbitmq,messaging,amqp,Jms,Activemq,Rabbitmq,Messaging,Amqp,我正在对(Java)消息传递和排队系统进行权衡研究,以便为一个主要web应用程序(在Amazon的EC2云上,x-large实例)重新设计后端框架。我目前正在评估ActiveMQ和RabbitMQ 该计划将有5个不同的队列,其中一个是死信队列。每天发送的邮件数量将介于40K和400K之间。当我计划将消息内容作为指向数据存储上XML文件位置的指针时,我希望消息大约为64字节。但是,为了评估的目的,我还想考虑在消息中发送原始XML,平均文件大小为3KB。 我的主要问题是:每天应该保留多少条消息?考虑

我正在对(Java)消息传递和排队系统进行权衡研究,以便为一个主要web应用程序(在Amazon的EC2云上,x-large实例)重新设计后端框架。我目前正在评估ActiveMQ和RabbitMQ

该计划将有5个不同的队列,其中一个是死信队列。每天发送的邮件数量将介于40K和400K之间。当我计划将消息内容作为指向数据存储上XML文件位置的指针时,我希望消息大约为64字节。但是,为了评估的目的,我还想考虑在消息中发送原始XML,平均文件大小为3KB。 我的主要问题是:每天应该保留多少条消息?考虑到我上面指定的数量,保留所有消息是否合理?我知道坚持会降低绩效,可能会降低很多。但是,通过不坚持,大量的RAM被使用。你们有些人会推荐什么

另外,我知道网上有很多关于ActiveMQ(JMS)和RabbitMQ(AMQP)的信息。我做了大量的研究和测试。这两种实现似乎都适合我的需要。考虑到我上面提供的信息(文件大小和消息数量),有人能指出使用我可能遗漏的特定供应商的原因吗


谢谢

必须将消息系统用作临时存储器。应用程序应设计为尽快提取消息。消息数量越多,性能越差。如果您正在提取消息,那么将有更好的性能以及更少的内存使用。当消息保存在内存中以获得更好的性能时,是否仍将使用持久性内存,如果消息类型仅为持久性,则将在磁盘上进行备份

关于消息持久性的决定取决于消息的关键程度,以及消息提供程序重新启动后是否需要它

您可能想看看IBM WebSphere MQ。它可以满足您的要求。它有JMS以及用于开发应用程序的专有API

何时/每天应保留多少条消息?它是 考虑到我收到的邮件数量,保留所有邮件是合理的 如上所述

JMS持久性不能取代数据库,它应该被视为数据生产者和消费者之间的一个短期缓冲区。也就是说,您提到的消息的数量/大小不会对任何现代JMS系统上的持久性适配器产生负担(无论如何都要正确配置),并且可以在必要时用于缓冲消息以延长持续时间(只需使用

我知道坚持会降低绩效,可能会降低很多。 但是,通过不坚持,大量的RAM被使用。你想要些什么 你推荐什么

根据我的经验,启用消息持久性并不会对性能造成重大影响,而且几乎总是为了保证消息。对于大多数应用程序,流程上游(生产者)或下游(消费者)最终成为瓶颈(尤其是数据库I/O)…而不是JMS持久性存储

另外,我知道网上有很多关于 ActiveMQ(JMS)与RabbitMQ(AMQP)。我做了大量的研究和调查 测试。这两种实现似乎都适合我的需要。 考虑到我上面提供的信息(文件大小和 有人能指出使用特定供应商的原因吗 我可能错过了


我已经在许多项目中成功地使用了ActiveMQ,用于低容量和高容量消息传递。我建议将其与路由引擎一起使用,如流线型和

ActiveMQ是开源JMS的好选择,我可以推荐更昂贵的是TIBCO EMS或Solace

但JMS实际上是为一次性交付而构建的,规范中没有考虑更长的持久性。你当然可以去数据库,但那很重而且可能很贵

我推荐的(注意:我在CodeStreet工作)是我们的“针对JMS的ReplayService”。它允许您将任何类型的JMS消息(或本机WebSphere MQ消息)存储在基于文件的高性能磁盘存储器中。每条消息都会自动分配一个纳秒时间戳和一个globalMsgID,您可以在发布时覆盖它。因此,ReplayServer可以记录XML消息,而您的实际消息可以只包含globalMsgID作为引用。也许还有一些财产

一旦接收方接收到globalMsgID,它就可以在需要时从ReplayServer重播该消息

但另一方面,400K*3KB的XML消息应该可以轻松地用于ActiveMQ或其他应用程序。此外,您应该在发送之前压缩XML消息